Android实现粒子雨效果

时间:2021-12-03 08:46:33

本文实例介绍了android实现粒子雨效果的实现过程,分享给大家供大家参考,具体内容如下

先看看效果图:

Android实现粒子雨效果

具体实现方法:

1.baseview主要是设定雨滴要实现的动作,只是先设定,也就是抽象方法,在子类中实现其方法
2.rainitems封装雨滴类
3.rainitems对雨滴集合创建到面板中,显示出来,具体实现就是在这个类中
一、baseview封装类,子类继承后实现方法即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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雨点类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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具体实现的类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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文件

?
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name = "rainview">
    <attr name="rainnum" format="integer"/>
   </declare-styleable>
</resources>
?
1
2
3
4
5
6
7
8
9
10
11
12
<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软件编程有所帮助。