android---粒子雨效果的实现

刚学习了自定义view,就按照极客学院的教程做了粒子雨效果,主要用到绘画线条和多线程,其中的抽象类设计方法值得学习,

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>

效果图’

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 14:47:46

android---粒子雨效果的实现的相关文章

theMatrix代码雨效果

做了一个代码雨效果放在个人主页:  https://lanleilin.github.io/lanGallery/index.html 代码: <!DOCTYPE html> <html> <head> <title>The Matrix</title> <script type="text/javascript" src="../js/jquery.min.js"> </script&g

Android 导航条效果实现(六) TabLayout+ViewPager+Fragment

TabLayout 一.继承结构 public class TabLayout extends HorizontalScrollView java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.HorizontalScrollView ? android.support.design.widget.TabLayout 二.TabLayou

Android自定义弹窗效果

Android的弹窗效果有很多种,就最简单而言,就可以调用一个AlertDialog弹窗显示,可是要自定义弹窗效果有以下这种方法,就我个人而言感觉挺方便的,适用性也挺广的. 首先先简单写个AlertDialog的使用 public void showDialog(){ AlertDialog dialog = new AlertDialog.Builder(this) .setTitle("提示") .setMessage(getResources().getString("

实现Android半透明Menu效果的开发实例

不知道大家是否用过天天动听,对于它界面上的半透明Menu效果,笔者感觉非常漂亮.下面是天天动听半透明Menu的截图,欣赏下吧: 感觉还不错吧?那么如何实现这种半透明Menu效果呢?本文就重点讨论并给出这种Menu的具体代码实现过程. 首先分析下实现这种半透明Menu所需做的工作,并进行合理分解: 1.  利用Shaper设置一个半透明圆角背景. 2.  定义Menu布局,主要就GridView,把图标都放在这个GridView. 3.  Menu事件, 通过PopupWindow或者AlertD

【Android】时光轴效果

[Android]时光轴效果 支持平台:Android   运行环境:Eclipse   开发语言:Java 下载地址:http://t.cn/R71Ge5c 源码简介 利用ExpandableListView通过对布局的控制来实现时光轴效果,只要有点耐心,你,也可以~ 源码运行图

我收集了多个android界面UI效果,深感大哥们的分享啊

初到oschina,看到很多大哥们分享了很好好的代码,近段时间,我收集了多个android界面UI效果,深感大哥们的分享啊.后来我将这些界面效果整合拢来,形成一个大的特效集合,一来为了查看方便,二来也为拷贝复制便捷.今日,将其共享出来,也算是为资源共享出一分力嘛. 直接上效果图: 可以看到上图中几个效果图,最上面九宫格图.左边一个是图书翻页效果图,都是比较经典的UI效果,当然还有很多,这些都是来源于oschina上的分享. 不过想说明一下,有部分地方小弟私自改动了,还请原作者原谅.例如,水波纹的

android anim 动画效果(转)

动画效果编程基础--AnimationAndroid      动画类型      Android的animation由四种类型组成      XML中    alpha    渐变透明度动画效果    scale    渐变尺寸伸缩动画效果    translate    画面转换位置移动动画效果    rotate    画面转移旋转动画效果        JavaCode中    AlphaAnimation    渐变透明度动画效果    ScaleAnimation    渐变尺寸伸缩

写一个android带动画效果的TabHost(类似微博客户端的切换效果)

先上图: 这个Layout是: <?xml version="1.0" encoding="UTF-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" andro

IOS仿Android九宫格解锁效果[转]

原理很简单,监听view中touch的一系列事件,当判定手指位置在某个按钮附近的时候则判断此按钮选中,并画出线. 效果图如下: 你可以在NineGridUnlockView.m文件中方法 touchesEnded:withEvent: 的最后添加自己的代码来决定画线完成后来做什么. (当前工程还没有加入委托,后续可能加上) 代码地址: https://github.com/lcwangchao/NineGridUnlocker IOS仿Android九宫格解锁效果[转]