最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View實現(xiàn)飄動的葉子效果(三)

 更新時間:2017年03月23日 10:25:23   作者:罔少年  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實現(xiàn)飄動的葉子效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

上一篇對自定義View及一些方法有所了解,下面做一個簡單的葉子飄動的例子

主要技術(shù)點(diǎn)

1、添加背景圖片canvas.drawBitmap()

2、Matrix動畫類

3、Matrix添加到畫布上

步驟

1、添加背景顏色

public LeafView(Context context, AttributeSet attrs) {
  super(context, attrs);
  bgPaint = new Paint();
  bgPaint.setColor(mResources.getColor(R.color.bg_color));
 }


 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  width = w;
  height = h;
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  bgRect = new RectF(0, 0 , width, height);
  canvas.drawRect(bgRect, bgPaint);
}

2、添加背景圖片

 public LeafView(Context context, AttributeSet attrs) {
  super(context, attrs);
  mResources = getResources();
  bgBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf_kuang, null)).getBitmap();
  bgPaint = new Paint();
  bgPaint.setColor(mResources.getColor(R.color.bg_color));
 }


 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  width = w;
  height = h;
  bgDestRect = new Rect(0, 0 , width, height);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  bgRect = new RectF(0, 0 , width, height);
  canvas.drawRect(bgRect, bgPaint);
  canvas.drawBitmap(bgBitmap, null, bgDestRect, null);
}

canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) 添加圖片到畫布

Rect src:圖片剪裁,null圖片顯示全屏,  RectF dst:圖片在Canvas畫布區(qū)域

3、添加葉子

public LeafView(Context context, AttributeSet attrs) {
  super(context, attrs);
  mResources = getResources();
  bgBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf_kuang, null)).getBitmap();
  leafBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf, null))).getBitmap();
  bgPaint = new Paint();
  bgPaint.setColor(mResources.getColor(R.color.bg_color));
 }


 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  width = w;
  height = h;
  bgDestRect = new Rect(0, 0 , width, height);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  bgRect = new RectF(0, 0 , width, height);
  //添加背景
  canvas.drawRect(bgRect, bgPaint);
  //添加背景圖片
  canvas.drawBitmap(bgBitmap, null, bgDestRect, null);
  //添加葉子
  canvas.drawBitmap(leafBitmap, new Matrix(), new Paint());
}

canvas.drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)添加一個帶動畫的bitmap到畫布

這里matrix什么都沒定義,所以默認(rèn)如下顯示,左上角葉子

4、給葉子添加Matrix動畫

Matrix作用:

a、translate 平移

b、rotate 旋轉(zhuǎn)

c、scale 縮放

d、skew 傾斜

這里要用到matrix.postTranslate(float x, float y),以畫布左上角為(0,0); xy為平移絕對值

public LeafView(Context context, AttributeSet attrs) {
  super(context, attrs);
  mResources = getResources();
  bgBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf_kuang, null)).getBitmap();
  leafBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf, null))).getBitmap();
  mLeafHeight = leafBitmap.getWidht();  

  bgPaint = new Paint();
  bgPaint.setColor(mResources.getColor(R.color.bg_color));
 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  width = w;
  height = h;
  bgDestRect = new Rect(0, 0 , width, height);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  bgRect = new RectF(0, 0 , width, height);
  //添加背景
  canvas.drawRect(bgRect, bgPaint);
  //添加背景圖片
  canvas.drawBitmap(bgBitmap, null, bgDestRect, null);
  //添加葉子
  Matrix matrix = new Matrix();
  matrix.postTranslate(getMatriX(), (height-mLeadHeight)/2);
  canvas.drawBitmap(leafBitmap, new Matrix(), new Paint());
  //重復(fù)調(diào)用onDraw()
  postInvalidate();
 }
 long cycleTime = 5000; //葉子滑動一周的時間5秒
 long startTime = 0;  //葉子滑動開始時間
 private float getMatriX() {
  float betweenTime = startTime - System.currentTimeMillis();
  //周期結(jié)束再加一個cycleTime
  if(betweenTime < 0) {
   startTime = System.currentTimeMillis() + cycleTime;
   betweenTime = cycleTime;
  }
  //通過時間差計算出葉子的坐標(biāo)
  float fraction = (float) betweenTime / cycleTime;
  float x = (int)(width * fraction);
  return x;
 }

好了,看到的效果就是如下,由于Matrix沒有設(shè)置動畫時間長度概念,所以通過時間差來計算出位移值的方式,來設(shè)置滑動快慢

完整代碼不貼了,就把上面這段代碼復(fù)制到一個LeafView extends View中,然后在里面定義幾個全局變量就好了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中Bitmap用法實例分析

    Android中Bitmap用法實例分析

    這篇文章主要介紹了Android中Bitmap用法,結(jié)合實例形式分析了Android操作圖片的載入、屬性設(shè)置、旋轉(zhuǎn)等相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • Android使用線程獲取網(wǎng)絡(luò)圖片的方法

    Android使用線程獲取網(wǎng)絡(luò)圖片的方法

    這篇文章主要為大家詳細(xì)介紹了Android使用線程獲取網(wǎng)絡(luò)圖片的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android Support Palette使用詳解

    Android Support Palette使用詳解

    這篇文章主要介紹了Android Support Palette使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • android上的一個網(wǎng)絡(luò)接口和圖片緩存框架enif簡析

    android上的一個網(wǎng)絡(luò)接口和圖片緩存框架enif簡析

    android上的一個網(wǎng)絡(luò)接口和圖片緩存框架enif詳細(xì)介紹:底層網(wǎng)絡(luò)接口采用apache的httpclient連接池框架、圖片緩存采用基于LRU的算法等等,需要了解的朋友可以詳細(xì)參考下
    2012-12-12
  • Android 混合動畫詳解及實現(xiàn)代碼

    Android 混合動畫詳解及實現(xiàn)代碼

    這篇文章主要介紹了Android 混合動畫詳解及實現(xiàn)代碼的相關(guān)資料,簡單的一種動畫(如旋轉(zhuǎn)、縮放、漸變、位移等)有時候并不能滿足我們項目的要求,這時候就需要運(yùn)用到混合動畫,需要的朋友可以參考下
    2016-11-11
  • Android AlertDialog對話框用法示例

    Android AlertDialog對話框用法示例

    這篇文章主要介紹了Android AlertDialog對話框用法,結(jié)合實例形式分析了AlertDialog對話框的功能及常見使用技巧,需要的朋友可以參考下
    2016-06-06
  • Android UI設(shè)計與開發(fā)之仿人人網(wǎng)V5.9.2最新版引導(dǎo)界面

    Android UI設(shè)計與開發(fā)之仿人人網(wǎng)V5.9.2最新版引導(dǎo)界面

    這篇文章主要為大家詳細(xì)介紹了Android UI設(shè)計與開發(fā)之仿人人網(wǎng)V5.9.2最新版引導(dǎo)界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android手勢操作示例(上/下/左/右的判斷)

    Android手勢操作示例(上/下/左/右的判斷)

    這篇文章主要介紹了Android手勢操作方法,包含了針對上、下、左、右等方向的判斷,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Android 編程下的計時器代碼

    Android 編程下的計時器代碼

    在安卓 APP 的手機(jī)號注冊邏輯中,經(jīng)常會有將激活碼發(fā)送到手機(jī)的環(huán)節(jié),這個環(huán)節(jié)中絕大多數(shù)的應(yīng)用考慮到網(wǎng)絡(luò)延遲或服務(wù)器壓力以及短信服務(wù)商的延遲等原因,會給用戶提供一個重新獲取激活碼的按鈕
    2013-08-08
  • Android布局技巧之include、merge與ViewStub標(biāo)簽的巧用

    Android布局技巧之include、merge與ViewStub標(biāo)簽的巧用

    Android 官方提供了三個用來優(yōu)化布局的標(biāo)簽,分別是include、merge與ViewStub,下面這篇文章主要給大家介紹了關(guān)于Android布局技巧之include、merge與ViewStub標(biāo)簽巧用的相關(guān)資料,需要的朋友可以參考下
    2018-06-06

最新評論

剑河县| 博白县| 兴城市| 全州县| 新绛县| 北票市| 平凉市| 宁乡县| 景谷| 麟游县| 娄烦县| 收藏| 徐闻县| 达拉特旗| 曲阜市| 乌审旗| 临邑县| 会宁县| 溧水县| 郎溪县| 峨眉山市| 万年县| 罗山县| 壤塘县| 五原县| 曲水县| 纳雍县| 余庆县| 黔西县| 吴川市| 永登县| 新乡县| 勐海县| 桂东县| 中阳县| 韶关市| 苍南县| 新竹县| 乐都县| 钟祥市| 肃北|