Android特效--粒子效果之雨

1. 单个雨点的行为

2. 完善雨点的行为和构造下雨场景

3. 在XML中定义可以控制下雨的属性

------------------------------------------------------

1. 单个雨点的行为: 一条线段在运动

起始点:startX , startY;

终止点:stopX,  stopY;

自定义View的框架类

public abstract class BaseView extends View {

    Thread thread;

    public BaseView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public BaseView(Context context) {
        super(context);
    }

    @Override
    final protected void onDraw(Canvas canvas) {
        //禁止子类覆盖,用final
        if(thread == null ) {
            thread = new MyThread();
            thread.start();
        } else{
            drawSub(canvas);
        }
    }

    protected abstract void logic();
    protected abstract void drawSub(Canvas canvas);

    @Override
    final protected void onDetachedFromWindow() {
        // 离开屏幕时结束
        //onDetachedFromWindow在销毁资源(既销毁view)之后调用
        running = false;
        super.onDetachedFromWindow();
    }
    private boolean running = true;
    class MyThread extends Thread {
        @Override
        public void run() {
            while(running) {
                logic();
                postInvalidate(); //线程中更新绘制,重新调用onDraw方法
                try {
                    Thread.sleep(50); //速度太快肉眼看不到,要睡眠
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

自定义单个雨点RainView

public class RainView extends BaseView {

    private float startX = 0;
    private float startY = 0;  // Start Point
    private float stopX = 0;
    private float stopY = 0;  // Stop Point
    private float sizeX = 0;
    private float sizeY = 0;
    private Paint paint;

    public RainView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public RainView(Context context, AttributeSet attrs) {
        super(context, attrs);
        sizeX = 10;
        sizeY = 30;
        //单个雨点的形状,用线段表示
        startX = 100;
        startY = 0;
        stopX = startX + sizeX;
        stopY = startY + sizeY;

        paint = new Paint();
        paint.setColor(0xffffffff);
    }

    @Override
    protected void logic() {
        // 让雨点运动
        float opt = 0.3f;
        startX += sizeX * opt;
        stopX += sizeX * opt;
        startY += sizeY * opt;
        stopY += sizeY * opt;

        // 雨点出了屏幕的时候让它回到起始点
        if(startY > getHeight() || startX > getWidth()){
            startX = 100;
            startY = 0;
            stopX = startX + sizeX;
            stopY = startY + sizeY;
        }
    }

    @Override
    protected void drawSub(Canvas canvas) {
        // drawSub 完成绘制操作
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }

}

在布局文件中使用

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.carloz.raineffect.MainActivity" >

    <com.carloz.raineffect.v1.single_rain.RainView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff000000" />

</FrameLayout>

效果如下:

2. 完善雨点的行为和构造下雨场景

2.1 将雨点 效果和 行为 抽象出来

* 雨点的速度和长度是可变的

* 雨点的倾斜角度是可变的

* 雨点的位置是可变的

public class RainItem {

    private int width;
    private int height;

    public RainItem(int width, int height) {
        this.width = width;
        this.height = height;
        init();
    }

    private float startX = 0;
    private float startY = 0; // Start Point
    private float stopX = 0;
    private float stopY = 0; // Stop Point
    private float sizeX = 0;
    private float sizeY = 0;
    private Paint paint;
    private float opt;
    private Random random;

    public void init() {
        // TODO Auto-generated method stub
        random = new Random();

        sizeX = 1 + random.nextInt(10); // 随机改变雨点的角度
        sizeY = 1 + random.nextInt(20);
        // 单个雨点的形状,用线段表示
        startX = random.nextInt(this.width);
        startY = random.nextInt(this.height); // 随机改变雨点的位置
        stopX = startX + sizeX;
        stopY = startY + sizeY;

        paint = new Paint();
        paint.setColor(0xffffffff);
    }

    public void draw(Canvas canvas) {
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }

    public void move() {
        // 让雨点运动
        opt = 0.2f + random.nextFloat(); // 随机改变雨点的速度和长度
        startX += sizeX * opt;
        stopX += sizeX * opt;
        startY += sizeY * opt;
        stopY += sizeY * opt;

        // 雨点出了屏幕的时候让它回到起始点
        if (startY > this.height || startX > this.width) {
            startX = random.nextInt(this.width);
            startY = random.nextInt(this.height);
            stopX = startX + sizeX;
            stopY = startY + sizeY;
        }
    }

}

2.2 定义多个雨点

在 添加抽象 BaseView 方法: protected abstract void init();

class MyThread extends Thread {
    @Override
    public void run() {
        init();
        while(running) {
            logic();
            postInvalidate(); //线程中更新绘制,重新调用onDraw方法
            try {
                Thread.sleep(50); //速度太快肉眼看不到,要睡眠
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
public class RainView extends BaseView {

    ArrayList<RainItem> rainList = new ArrayList<RainItem>();
    int size = 80;

    public RainView(Context context) {
        super(context);
    }

    public RainView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void init() {
        // TODO Auto-generated method stub
        for (int i = 0; i < size; i++) {
            RainItem item = new RainItem(getWidth(), getHeight());
            rainList.add(item);
        }
    }

    @Override
    protected void logic() {
        for (RainItem item : rainList) {
            item.move();
        }
    }

    @Override
    protected void drawSub(Canvas canvas) {
        // drawSub 完成绘制操作
        for (RainItem item : rainList) {
            item.draw(canvas);
        }
    }

}

效果如下:

3. 在XML中定义可以控制下雨的属性

时间: 2024-08-13 11:52:01

Android特效--粒子效果之雨的相关文章

54、Android 粒子效果之雨(下雨的效果)

import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; /** * 基类 */ public abstract class BaseView extends View { private MyThread thread; private boolean running = true; public Base

6 cocos2dx粒子效果,类图关系,系统原生粒子和自己定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

?? 1 粒子 演示样例 2 类图关系 3 系统原生粒子 CCParticleSystem 全部粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad 点粒子和方形粒子系统,都继承了CCParticleSystem的全部属性 CCParticleExplosion 爆炸粒子效果 CCParticleFireworks 烟花粒子效果 CCParticleFire 火焰粒子效果 CCParticleMetepr 流行粒子效果 CCParticleSpi

Cocos2d 粒子效果

第一种方法:自定义 [cpp] view plaincopy //建立一个粒子系统 CCParticleSystem* pParticleSystem=new CCParticleSystemQuad(); //产生300个粒子 pParticleSystem->initWithTotalParticles(300); //设置粒子图片 pParticleSystem->setTexture(CCTextureCache::sharedTextureCache()->addImage(&

6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

 1 粒子 示例 2 类图关系 3 系统原生粒子 CCParticleSystem 所有粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad 点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性 CCParticleExplosion 爆炸粒子效果 CCParticleFireworks 烟花粒子效果 CCParticleFire 火焰粒子效果 CCParticleMetepr 流行粒子效果 CCParticleSpira

【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids

前两天在微博上看到了这个侧滑删除的粒子效果,但是只有IOS的,所以心血来潮,写了个玩玩,下面简单介绍下实现的思路 项目简介 实现原理解析 代码实现 如何使用 更多参考 项目简介 先不废话,上效果图 项目地址:https://github.com/ZhaoKaiQiang/ParticleLayout 实现原理解析 其实看了那么多的关于侧滑删除的项目,再来思考这个问题,就so easy了! 咱们先分析下需求: - 侧滑手势检测 - 粒子跟手效果 - 删除状态判断 - 数据源刷新 ok,知道需求了,

Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单

Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推演,但是也能保证一周三更的样子,现在也还是以小功能,或者说是一些小入门级别的博客为主,我也不算是什么很厉害的人,很多细节的支持处理的仍然还是不到位,所以也是一直在弥补,话不多说,来看看今天的效果 实现起来很简单吧,那我们就来看一下他是怎么实现的咯! OnclickRuning package com

基于HTML5 Canvas粒子效果文字动画特效

之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示的文字,回车后即可在canvas上绘制出粒子效果的文字动画,相当酷的动画效果. 在线预览   源码下载 实现的代码. html代码: <canvas class="canvas"></canvas> <div class="help"> ?</div> <div c

AE粒子效果运动轨迹拖尾的特效实现

我以前喜欢看NBA,然后看见ESPN的很多NBA视频里的各种特效,有一个特效就是NBA球星出手以后,球变成一个亮点,随着球的移动,会产生拖尾,就像流星一样.刚开始我用会声会影做视频,会声会影可以实现视频的剪辑,加入特效就比较受限制.所以,专门写这个博客,来阐述一下特效的实现效果,既能让自己不至于忘记特效的实现,也能帮助其他有需要的人一起交流. 一.前提条件1.我们需要在AE中插入particular的粒子特效2.下载Trapcode插件,这里particular特效有很多应用之处,需要下载的小伙

three.js粒子效果(分别基于CPU&amp;GPU实现)

前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上demo,用移动设备更能明显感觉性能差异. 维护粒子位移.颜色.尺寸:GPU版本  CPU版本 维护粒子位移:GPU版本  CPU版本 结论:同时需要维护多种粒子特征变化时,GPU有明显优势.只是维护粒子位移时,GPU版本稍流畅,但优势并不明显.当然,这还得具体到设备,一些中低端Android机器,