1. 程式人生 > >【Android粒子動畫】Android粒子動畫渲染學習

【Android粒子動畫】Android粒子動畫渲染學習

填完自己挖的坑,把之前的遊戲繼續做下去,而做手機遊戲,在很多場景下需要做到絢爛效果,這時候就可能用到粒子,這裡學習一下其他大神的做法,自己做了個。

原理如下:

1.生成一個粒子(新建一個執行緒)

2.運動,按照一定軌跡運動

3.在某個位置,或時間點上釋放舊執行緒,並且生成新執行緒

如此反覆,效果就可基本完成

效果如下:

在此之前,先學習一下有關SurfaceView方面的東西。

SurfaceView 類,Canvas上繪圖

繪製簡單的水面波紋

(一滴雨~)


如圖,雨滴滴至水面,在此形成四個大小不等,速度不同向外擴張

以下為繪製方法,通過半徑r的遞增,不斷重新整理介面繪製四個圓

<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>
以下是全部內容,繪製Surfaceview類
<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.一定情況下釋放

而這兩點都有辦法快速解決
下篇繼續