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

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

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

上一篇對(duì)自定義View及一些方法有所了解,下面做一個(gè)簡(jiǎn)單的葉子飄動(dòng)的例子

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

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

2、Matrix動(dòng)畫類

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)添加一個(gè)帶動(dòng)畫的bitmap到畫布

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

4、給葉子添加Matrix動(dòng)畫

Matrix作用:

a、translate 平移

b、rotate 旋轉(zhuǎn)

c、scale 縮放

d、skew 傾斜

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

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; //葉子滑動(dòng)一周的時(shí)間5秒
 long startTime = 0;  //葉子滑動(dòng)開始時(shí)間
 private float getMatriX() {
  float betweenTime = startTime - System.currentTimeMillis();
  //周期結(jié)束再加一個(gè)cycleTime
  if(betweenTime < 0) {
   startTime = System.currentTimeMillis() + cycleTime;
   betweenTime = cycleTime;
  }
  //通過時(shí)間差計(jì)算出葉子的坐標(biāo)
  float fraction = (float) betweenTime / cycleTime;
  float x = (int)(width * fraction);
  return x;
 }

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

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

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

相關(guān)文章

  • Android中Bitmap用法實(shí)例分析

    Android中Bitmap用法實(shí)例分析

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

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

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

    Android Support Palette使用詳解

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

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

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

    Android 混合動(dòng)畫詳解及實(shí)現(xiàn)代碼

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

    Android AlertDialog對(duì)話框用法示例

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

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

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

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

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

    Android 編程下的計(jì)時(shí)器代碼

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

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

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

最新評(píng)論

苍溪县| 南安市| 临夏市| 紫金县| 土默特左旗| 本溪| 五河县| 集贤县| 齐河县| 依兰县| 博罗县| 中阳县| 康保县| 英吉沙县| 金乡县| 将乐县| 理塘县| 乐陵市| 饶平县| 卢龙县| 衡东县| 尉氏县| 阜平县| 防城港市| 五寨县| 上饶县| 宕昌县| 盘锦市| 思茅市| 兴国县| 敖汉旗| 宣武区| 吕梁市| 阳江市| 精河县| 井研县| 深州市| 桃园县| 方山县| 长子县| 株洲市|