自定义控件水波纹

public class WaterView extends View{

    private Paint paint;
    private int MAX_ALPHA=255;
    private List<Wave> list;
    private boolean isStart;
    protected static final int FLUSH_ALL=-1;
    private int[] colors={Color.RED,Color.BLUE,Color.YELLOW,Color.DKGRAY,Color.GREEN,Color.LTGRAY,Color.MAGENTA};
    private Handler handler=new Handler(){
        public void handleMessage(android.os.Message msg) {
            if(msg.what==0){
                //刷新状态
                flushState();
                //重新绘制
                invalidate();

                //如果集合为空的话就不发送消息
                if(list.size()>0){
                    //每隔50毫秒刷新一次
                    handler.sendEmptyMessageDelayed(0, 50);
                }
            }
        }


    };
    //构造函数,一创建这个view,就创建出储存wave的集合,这个集合用来保存所有的圆环,而且每一个对象都会储存当前圆环的信息,
    //例如x位置,y位置,radius半径,和画笔paint,画笔中会用到透明度和线宽,也要储存
    public WaterView(Context context, AttributeSet attrs) {
        super(context, attrs);
        list=Collections.synchronizedList(new ArrayList<Wave>());
    }
    private Paint initPaint(int width,int alpha) {
        paint=new Paint();
        //抗锯齿,让绘图边缘更柔和
        paint.setAntiAlias(true);
        //放抖动
        paint.setDither(true);
        //设置空心线宽
        paint.setStrokeWidth(width);
        //设置环形方式绘制
        paint.setStyle(Paint.Style.STROKE);
        //设置透明度
        paint.setAlpha(alpha);
        //设置画笔颜色,随机颜色,把颜色放到数组里面
        paint.setColor(colors[(int)(Math.random()*(colors.length-1))]);
        return paint;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        //这要重新绘制所有圆圈
        for (int i = 0; i < list.size(); i++) {
            Wave wave=list.get(i);
            canvas.drawCircle(wave.xDown, wave.yDown, wave.radius, wave.paint);
        }
    }

    //刷新状态的方法
    private void flushState() {
        //要刷新,集合里面所有的对象都要刷新
        for (int i = 0; i < list.size(); i++) {
            Wave wave=list.get(i);
            //如果透明度为0的话从集合里移除这个对象
            if(wave.alpha==0){
                list.remove(i);
                wave.paint=null;
                wave=null;
                continue;
            }
            wave.radius+=5;
            wave.alpha-=5;
            if(wave.alpha<0){
                wave.alpha=0;
            }
            wave.width=wave.radius/4;
            wave.paint.setAlpha(wave.alpha);
            wave.paint.setStrokeWidth(wave.width);
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //每次点击都会创建一个新的Wave,
            Wave wave = new Wave();
            //点击的时候设置半径为0
            wave.radius=0;
            //设置完全不透明
            wave.alpha=MAX_ALPHA;
            //设置线宽为半径的4/1
            wave.width=wave.radius/4;
            //设置位置为点击的位置
            wave.xDown=(int)event.getX();
            wave.yDown=(int)event.getY();   
            wave.paint=initPaint(wave.width, wave.alpha);
            if(list.size()==0){
                isStart=true;
            }
            list.add(wave);
            invalidate();
            if(isStart){
                handler.sendEmptyMessage(0);
                //只有第一次,也就是集合为空的时候发送消息,以后就不在这里发送消息,不然不设置的话以后会越来越快,等于是多次发送
                isStart=false;
            }
        case MotionEvent.ACTION_MOVE:
            //每次点击都会创建一个新的Wave,
            Wave wave1 = new Wave();
            //点击的时候设置半径为0
            wave1.radius=0;
            //设置完全不透明
            wave1.alpha=MAX_ALPHA;
            //设置线宽为半径的4/1
            wave1.width=wave1.radius/4;
            //设置位置为点击的位置
            wave1.xDown=(int)event.getX();
            wave1.yDown=(int)event.getY();  
            wave1.paint=initPaint(wave1.width, wave1.alpha);
            list.add(wave1);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:

            break;

        }
        return true;
    }

    private class Wave{
        private int radius;
        private int width;
        private int alpha;
        private int xDown;
        private int yDown;
        private Paint paint;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值