【Android粒子動畫】Android粒子動畫渲染學習
阿新 • • 發佈:2019-02-14
填完自己挖的坑,把之前的遊戲繼續做下去,而做手機遊戲,在很多場景下需要做到絢爛效果,這時候就可能用到粒子,這裡學習一下其他大神的做法,自己做了個。
原理如下:
1.生成一個粒子(新建一個執行緒)
2.運動,按照一定軌跡運動
3.在某個位置,或時間點上釋放舊執行緒,並且生成新執行緒
如此反覆,效果就可基本完成
效果如下:
在此之前,先學習一下有關SurfaceView方面的東西。
SurfaceView 類,Canvas上繪圖
繪製簡單的水面波紋
(一滴雨~)
如圖,雨滴滴至水面,在此形成四個大小不等,速度不同向外擴張
以下為繪製方法,通過半徑r的遞增,不斷重新整理介面繪製四個圓
以下是全部內容,繪製Surfaceview類<strong><span style="font-size:18px;">public void doDraw(int x,int y,Canvas c){ c.drawColor(Color.BLACK); c.translate(250, 250); c.drawCircle(x, y, r/2, p); c.drawCircle(x, y, r/3, p); c.drawCircle(x, y, r/4, p); c.drawCircle(x, y, r++, p); //重置 if(r>250){ r=20f; } }</span></strong>
緊接著,將繪圖內容呈現<strong><span style="font-size:18px;">package yyc.test; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; public class Rain extends SurfaceView implements Callback{ MyThread my; public Rain(Context context) { super(context); init(); // TODO Auto-generated constructor stub } private void init(){ SurfaceHolder surh=getHolder(); surh.addCallback(this); my=new MyThread(getContext(),surh); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub my.isrun=true; my.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub my.isrun=false; try{ my.join(); }catch(Exception e){ e.printStackTrace(); } } class MyThread extends Thread{ SurfaceHolder surfaceholder; Context context; boolean isrun; public float r=2;//半徑 Paint p; public MyThread(Context context,SurfaceHolder surfaceholder){ this.surfaceholder=surfaceholder; this.context=context; isrun=false; p=new Paint(); p.setColor(Color.YELLOW); p.setStrokeWidth(3); p.setStyle(Paint.Style.STROKE); } /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { // TODO Auto-generated method stub super.run(); Canvas c=null; while(isrun){ try{ synchronized(surfaceholder){ c=surfaceholder.lockCanvas(null); } doDraw(250,250,c); Thread.sleep(10); } catch(Exception e){ e.printStackTrace(); }finally{ surfaceholder.unlockCanvasAndPost(c); } } } public void doDraw(int x,int y,Canvas c){ c.drawColor(Color.BLACK); c.translate(250, 250); c.drawCircle(x, y, r/2, p); c.drawCircle(x, y, r/3, p); c.drawCircle(x, y, r/4, p); c.drawCircle(x, y, r++, p); //重置 if(r>250){ r=20f; } } } class MinThread extends Thread{ Canvas c=null; public MinThread(){ } /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { // TODO Auto-generated method stub } } } </span></strong>
在Activity類中
setContextview(new 自己的surfaceView());
以上是簡單的一個雨滴
擴充套件至多個雨滴:
有兩點:
1.隨機產生位置
2.一定情況下釋放
而這兩點都有辦法快速解決
下篇繼續