Android实现粒子雨效果
程序员文章站
2023-12-22 13:25:46
本文实例介绍了android实现粒子雨效果的实现过程,分享给大家供大家参考,具体内容如下
先看看效果图:
具体实现方法:
1.baseview主要是设定雨滴要实现...
本文实例介绍了android实现粒子雨效果的实现过程,分享给大家供大家参考,具体内容如下
先看看效果图:
具体实现方法:
1.baseview主要是设定雨滴要实现的动作,只是先设定,也就是抽象方法,在子类中实现其方法
2.rainitems封装雨滴类
3.rainitems对雨滴集合创建到面板中,显示出来,具体实现就是在这个类中
一、baseview封装类,子类继承后实现方法即可
public abstract class baseview extends view { private control thread; public baseview(context context, attributeset attrs) { super(context, attrs); } public baseview(context context) { super(context); } //封装,构造画面,子类继承后需要重写 protected abstract void drawsub(canvas canvas); //封装移动方法,子类继承后需要重写 protected abstract void move(); //封装的初始化方法 protected abstract void init(); @override protected final void ondraw(canvas canvas) { //启动线程 if (thread ==null) { thread = new control(); thread.start(); }else { drawsub(canvas); } } public class control extends thread{ @override public void run() { init(); while(true){ move(); //相当于刷新画布 postinvalidate(); try { sleep(30); } catch (interruptedexception e) { e.printstacktrace(); } } } } }
二、rainitem雨点类
public class rainitem { private int height; private int width; private float startx; private float starty; private float stopx; private float stopy; private float sizex; private float sizey; private float of = 0.5f; private paint paint; private random random = new random(); public rainitem(int height,int width) { this.height = height; this.width = width; init(); } public void init() { //startx和y对应的分别是起止位置 sizex = 1 + random.nextint(10); sizey = 10 + random.nextint(20); startx = random.nextint(width); starty = random.nextint(height); stopx = startx + sizex; stopy = starty + sizey; of = (float) (0.2 + random.nextfloat()); paint = new paint(); } /** * 绘画雨滴 * @param canvas */ public void draw(canvas canvas) { paint.setargb(255, random.nextint(255), random.nextint(255), random.nextint(255)); canvas.drawline(startx, starty, stopx, stopy, paint); } /** * 雨滴的移动行为 */ public void movestep() { //size*of这个是用来控制速度,所谓的速度就是线条增加的速度 startx += sizex*of; stopx += sizex*of; starty += sizey*of; stopy += sizey*of; //如果超出边界则重新运行 if (starty>height) { init(); } } }
三、rainplay具体实现的类
public class rainplay extends baseview { list<rainitem> list = new arraylist<rainitem>(); //控制雨滴的数量 private int num = 80; public rainplay(context context) { super(context); } public rainplay(context context, attributeset attrs) { super(context, attrs); //与xml链接起来 typedarray ta = context.obtainstyledattributes(attrs, r.styleable.rainview); num = ta.getinteger(r.styleable.rainview_rainnum,80); ta.recycle(); } @override protected void drawsub(canvas canvas) { for (rainitem item : list) { item.draw(canvas); } } @override protected void move() { for (rainitem item : list) { item.movestep(); } } /** * 因为获取长宽是放在layout之后才可以获取,所以需要 * 放在线程里面初始化 */ @override protected void init() { for (int i = 0; i < num; i++) { rainitem item = new rainitem(getheight(), getwidth()); list.add(item); } } }
四、value与xml文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name = "rainview"> <attr name="rainnum" format="integer"/> </declare-styleable> </resources>
<framelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:an="http://schemas.android.com/apk/res/com.niuli.rain" android:layout_width="match_parent" android:layout_height="match_parent" > <com.niuli.rain.rainplay android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff000000" an:rainnum = "100"/> </framelayout>
希望本文所述对大家学习android软件编程有所帮助。