登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

自定义绚丽水波纹效果

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-9-6 16:43:35
Tag:水波纹

项目介绍:

自定义绚丽水波纹效果
需求
模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明)
实现思路
  • 自定义类继承View。
  • 定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据。
  • 重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心。
  • 发送handler信息,对数据进行修改,刷新页面。
  • 重写onDraw方法,绘制一个圆环。
1. 自定义类继承View
  • 新建WaterWaveView2类继承View
[Java] 查看源文件 复制代码
public class WaterWaveView2 extends View {

    //存放圆环的集合
    private ArrayList mList;

    //界面刷新
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            invalidate();//刷新界面,会执行onDraw方法
        }
    };

    public WaterWaveView2(Context context) {
        this(context, null);
    }

    public WaterWaveView2(Context context, AttributeSet attrs) {
        super(context, attrs);
        mList = new ArrayList();
    }
2. 定义实体类 Wave
[Java] 查看源文件 复制代码
/**
* Created by HongJay on 2016/8/30.
* 把wave的数据封装成一个对象
*/
public class Wave {
    public float x;//圆心x坐标
    public float y;//圆心y坐标
    public Paint paint; //画圆的画笔
    public float width; //线条宽度
    public int radius; //圆的半径
    public int ranNum;//随机数
    public int[] randomColor={Color.BLUE,Color.CYAN,
            Color.GREEN,Color.MAGENTA,Color.RED,Color.YELLOW};

    public Wave(float x, float y) {
        this.x = x;
        this.y = y;
        initData();
    }
    /**
     * 初始化数据,每次点击一次都要初始化一次
     */
    private void initData() {
        paint=new Paint();//因为点击一次需要画出不同的圆环
        paint.setAntiAlias(true);//打开抗锯齿
        ranNum=(int) (Math.random()*6);//[0,5]的随机数
        paint.setColor(randomColor[ranNum]);//设置画笔的颜色
        paint.setStyle(Paint.Style.STROKE);//描边
        paint.setStrokeWidth(width);//设置描边宽度
        paint.setAlpha(255);//透明度的设置(0-255),0为完全透明
        radius=0;//初始化
        width=0;
    }
}
3. 重写onTouchEvent方法
  • 获得圆心,并且删除集合中透明度为0的圆环,通知handler调用onDraw()方法
[Java] 查看源文件 复制代码
public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                float x = event.getX();
                float y = event.getY();
                deleteItem();
                Wave wave = new Wave(x, y);
                mList.add(wave);

                //刷新界面
                invalidate();
                break;

            case MotionEvent.ACTION_MOVE:
                float x1 = event.getX();
                float y1 = event.getY();
                deleteItem();
                Wave wave1 = new Wave(x1, y1);
                mList.add(wave1);

                invalidate();
                break;
        }
        //处理事件
        return true;
    }
    //删除透明度已经为0的圆环
    private void deleteItem(){
        for (int i = 0; i 
4. 重写onDraw()方法,循环绘制圆环
[Java] 查看源文件 复制代码
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //避免程序一运行就进行绘制
        if (mList.size() > 0) {

            //对集合中的圆环对象循环绘制
            for (Wave wave : mList) {
                canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);
                wave.radius += 3;
                //对画笔透明度进行操作
                int alpha = wave.paint.getAlpha();
                if (alpha < 80) {
                    alpha = 0;
                } else {
                    alpha -= 3;
                }

                //设置画笔宽度和透明度
                wave.paint.setStrokeWidth(wave.radius / 8);
                wave.paint.setAlpha(alpha);

                //延迟刷新界面
                mHandler.sendEmptyMessageDelayed(1, 100);
            }
        }
    }



相关源码推荐:

我来说两句
所有评论(109)
tylz 2016-9-6 16:53:46
apkbus好的内容真的很多~赞
回复
allow.xuweibin 2016-9-6 17:15:46
apkbus好的内容真的很多~赞
回复
suzhouliuyan 2016-9-6 17:44:11
mark,收藏了
回复
tintins 2016-9-6 17:56:15
好好 学习了 确实不错
回复
chaoyue 2016-9-6 18:16:50
mark,收藏了
回复
rebecca 2016-9-6 18:31:43
好好 学习了 确实不错
回复
絆仙 2016-9-6 21:44:31
我只是路过打酱油的。
回复
提取码:  下载次数:68 状态:已购或VIP 售价:10(原价:10)金钱 下载权限:限制会员 
4325 0 68
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,769657487

如何获得代码达人称号

如何成为签约作者

联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表