大家不知道有沒(méi)有見(jiàn)過(guò)櫻花飄落和花瓣飄落的風(fēng)景,沒(méi)見(jiàn)過(guò)沒(méi)關(guān)系,今天我們來(lái)說(shuō)一下“在Android開(kāi)發(fā)中怎么實(shí)現(xiàn)花瓣飄落效果?”這個(gè)效果的實(shí)現(xiàn)方法!
實(shí)現(xiàn)原理
- 首先需要生成繪制小花的坐標(biāo)點(diǎn),坐標(biāo)點(diǎn)的橫坐標(biāo)是根據(jù)控件的寬度隨機(jī)生成的,而縱坐標(biāo)則設(shè)置為小花圖片高度的負(fù)值(這樣可以實(shí)現(xiàn)小花從屏幕外進(jìn)入)。
- 將這些點(diǎn)存儲(chǔ)到集合當(dāng)中。
- 遍歷集合根據(jù)點(diǎn)的位置繪制小花
- 繪制完后不斷增加各個(gè)點(diǎn)的縱坐標(biāo)
實(shí)現(xiàn)步驟
1.定義變量將變量初始化
private SurfaceHolder mHolder; private boolean mFlag = true;//繪制小花線程的開(kāi)關(guān)標(biāo)志 private ArrayList<PointF> mFlowers;//小花點(diǎn)的坐標(biāo)集合 private Random mRandom;//負(fù)責(zé)隨機(jī)數(shù)生成 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); //設(shè)置背景透明 this.setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSLUCENT); mFlowers = new ArrayList<>(); mRandom = new Random(); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua); }
2.實(shí)現(xiàn)添加花朵坐標(biāo)點(diǎn)的方法
/** * 添加花朵 */ private void addFlower(){ PointF point = new PointF(); point.x=mRandom.nextInt(getWidth());//根據(jù)控件寬度隨機(jī)生成X軸坐標(biāo) point.y=-mBitmap.getHeight();//縱坐標(biāo)設(shè)置為小花圖像的負(fù)值(產(chǎn)生從屏幕外進(jìn)入的效果) mFlowers.add(point);//將坐標(biāo)點(diǎn)添加進(jìn)集合 }
3.實(shí)現(xiàn)SurfaceHolder.Callback及Runnable接口
public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable
4.在run方法中實(shí)現(xiàn)繪制邏輯
@Override public void run() { while (mFlag){ try { Thread.sleep(80);//控制小花的下落速度 Canvas canvas = mHolder.lockCanvas(); PointF pointF = null; //清屏操作(否則會(huì)殘留一些無(wú)用圖像) 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;//修改雨滴線的縱坐標(biāo),使其看起來(lái)在下雨 pointF.y=pointF.y+i; } mHolder.unlockCanvasAndPost(canvas); addFlower(); //當(dāng)繪制點(diǎn)的縱坐標(biāo)大于控件高度時(shí),將該點(diǎn)移除 if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){ mFlowers.remove(pointF); } }catch (Exception e){} } }
5.在SurfaceHolder.Callback的回調(diào)方法中開(kāi)啟繪制線程
@Override public void surfaceCreated(SurfaceHolder holder) { mFlag = true;//surface創(chuàng)建時(shí)將線程開(kāi)關(guān)打開(kāi) new Thread(this).start();//開(kāi)啟線程繪制 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mFlowers.clear();//當(dāng)控件發(fā)生改變時(shí)清除之前的繪制點(diǎn) } @Override public void surfaceDestroyed(SurfaceHolder holder) { mFlag = false;//當(dāng)surface銷(xiāo)毀時(shí)關(guān)掉繪制線程 }
完整代碼展示
public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ private SurfaceHolder mHolder; private boolean mFlag = true;//繪制小花線程的開(kāi)關(guān)標(biāo)志 private ArrayList<PointF> mFlowers;//小花點(diǎn)的坐標(biāo)集合 private Random mRandom;//負(fù)責(zé)隨機(jī)數(shù)生成 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); //設(shè)置背景透明 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;//修改雨滴線的縱坐標(biāo),使其看起來(lái)在下雨 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); } }
那么本文中有關(guān)于:“在Android開(kāi)發(fā)中怎么實(shí)現(xiàn)花瓣飄落效果?”這個(gè)問(wèn)題的實(shí)現(xiàn)和思路我們就分享到這里了更多有關(guān)于Android的實(shí)現(xiàn)案例我們都可以在W3Cschool中進(jìn)行學(xué)習(xí)和了解!