国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-10-23 18:33:50
字體:
來源:轉載
供稿:網友

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

Android,View,飄動葉子

主要技術點

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);}

Android,View,飄動葉子

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畫布區域

Android,View,飄動葉子

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什么都沒定義,所以默認如下顯示,左上角葉子

Android,View,飄動葉子

4、給葉子添加Matrix動畫

Matrix作用:

a、translate 平移

b、rotate 旋轉

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());  //重復調用onDraw()  postInvalidate(); } long cycleTime = 5000; //葉子滑動一周的時間5秒 long startTime = 0;  //葉子滑動開始時間 private float getMatriX() {  float betweenTime = startTime - System.currentTimeMillis();  //周期結束再加一個cycleTime  if(betweenTime < 0) {   startTime = System.currentTimeMillis() + cycleTime;   betweenTime = cycleTime;  }  //通過時間差計算出葉子的坐標  float fraction = (float) betweenTime / cycleTime;  float x = (int)(width * fraction);  return x; }

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

Android,View,飄動葉子

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜宾市| 青岛市| 兰溪市| 屯门区| 新沂市| 常山县| 四平市| 朝阳市| 元阳县| 温州市| 东辽县| 通许县| 宁南县| 永城市| 怀远县| 文成县| 普格县| 文登市| 云浮市| 天长市| 巴中市| 嵊泗县| 凤山县| 敖汉旗| 建水县| 南汇区| 怀柔区| 西贡区| 英吉沙县| 丰都县| 江孜县| 张北县| 灌云县| 家居| 英吉沙县| 阿合奇县| 吴旗县| 泰宁县| 乌苏市| 怀柔区| 六枝特区|