您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在Android中實現一個花瓣飄落效果,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
首先需要生成繪制小花的坐標點,坐標點的橫坐標是根據控件的寬度隨機生成的,而縱坐標則設置為小花圖片高度的負值(這樣可以實現小花從屏幕外進入)。
將這些點存儲到集合當中。
遍歷集合根據點的位置繪制小花
繪制完后不斷增加各個點的縱坐標
1.定義變量將變量初始化
private SurfaceHolder mHolder; private boolean mFlag = true;//繪制小花線程的開關標志 private ArrayList<PointF> mFlowers;//小花點的坐標集合 private Random mRandom;//負責隨機數生成 private Bitmap mBitmap;//小花的圖案 public FlowerView(Context context) { super(context); init(); } public FlowerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ mHolder = getHolder(); mHolder.addCallback(this); //設置背景透明 this.setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSLUCENT); mFlowers = new ArrayList<>(); mRandom = new Random(); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua); }
2.實現添加花朵坐標點的方法
/** * 添加花朵 */ private void addFlower(){ PointF point = new PointF(); point.x=mRandom.nextInt(getWidth());//根據控件寬度隨機生成X軸坐標 point.y=-mBitmap.getHeight();//縱坐標設置為小花圖像的負值(產生從屏幕外進入的效果) mFlowers.add(point);//將坐標點添加進集合 }
3.實現SurfaceHolder.Callback及Runnable接口
public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable
4.在run方法中實現繪制邏輯
@Override public void run() { while (mFlag){ try { Thread.sleep(80);//控制小花的下落速度 Canvas canvas = mHolder.lockCanvas(); PointF pointF = null; //清屏操作(否則會殘留一些無用圖像) if(canvas!=null){ canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); }else { continue; } for(PointF point: mFlowers){ pointF = point; canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null); int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴線的縱坐標,使其看起來在下雨 pointF.y=pointF.y+i; } mHolder.unlockCanvasAndPost(canvas); addFlower(); //當繪制點的縱坐標大于控件高度時,將該點移除 if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){ mFlowers.remove(pointF); } }catch (Exception e){} } }
5.在SurfaceHolder.Callback的回調方法中開啟繪制線程
@Override public void surfaceCreated(SurfaceHolder holder) { mFlag = true;//surface創建時將線程開關打開 new Thread(this).start();//開啟線程繪制 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mFlowers.clear();//當控件發生改變時清除之前的繪制點 } @Override public void surfaceDestroyed(SurfaceHolder holder) { mFlag = false;//當surface銷毀時關掉繪制線程 }
public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ private SurfaceHolder mHolder; private boolean mFlag = true;//繪制小花線程的開關標志 private ArrayList<PointF> mFlowers;//小花點的坐標集合 private Random mRandom;//負責隨機數生成 private Bitmap mBitmap;//小花的圖案 public FlowerView(Context context) { super(context); init(); } public FlowerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ mHolder = getHolder(); mHolder.addCallback(this); //設置背景透明 this.setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSLUCENT); mFlowers = new ArrayList<>(); mRandom = new Random(); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua); } @Override public void surfaceCreated(SurfaceHolder holder) { mFlag = true; new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mFlowers.clear(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mFlag = false; } @Override public void run() { while (mFlag){ try { Thread.sleep(80); Canvas canvas = mHolder.lockCanvas(); PointF pointF = null; //清屏操作 if(canvas!=null){ canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); }else { continue; } for(PointF point: mFlowers){ pointF = point; canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null); int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴線的縱坐標,使其看起來在下雨 pointF.y=pointF.y+i; } mHolder.unlockCanvasAndPost(canvas); addFlower(); if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){ mFlowers.remove(pointF); } }catch (Exception e){} } } /** * 添加花朵 */ private void addFlower(){ PointF point = new PointF(); point.x=mRandom.nextInt(getWidth()); point.y=-mBitmap.getHeight(); mFlowers.add(point); } }
關于怎么在Android中實現一個花瓣飄落效果就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。