【Android粒子动画】Android粒子动画渲染学习

来源:互联网 发布:新歌声第二季网络直播 编辑:程序博客网 时间:2024/04/29 05:51

填完自己挖的坑,把之前的游戏继续做下去,而做手机游戏,在很多场景下需要做到绚烂效果,这时候就可能用到粒子,这里学习一下其他大神的做法,自己做了个。

原理如下:

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);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubmy.isrun=true;my.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubmy.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() */@Overridepublic void run() {// TODO Auto-generated method stubsuper.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() */@Overridepublic void run() {// TODO Auto-generated method stub }}}</span></strong>


紧接着,将绘图内容呈现

在Activity类中

setContextview(new  自己的surfaceView());


以上是简单的一个雨滴

扩展至多个雨滴:

有两点:

1.随机产生位置

2.一定情况下释放


而这两点都有办法快速解决
下篇继续

2 0
原创粉丝点击