android 开发第五弹---水波纹与自定义view实现绚丽粒子

1.首先我们来看下效果:

要实现上面的效果,首先我们自定义一个myWare继承自VIew,重写它的三个构造方法;

public class MyWare extends View {
    private List<Wave> wList;
    private boolean isRunning = false;

    public MyWare(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyWare(Context context, AttributeSet attrs) {
        super(context, attrs);
        wList = new ArrayList<Wave>();
    }

    public MyWare(Context context) {
        super(context);
    }
2.然后重写它的OnTouchEven方法,为该View添加触摸事件

private int colors[] = { Color.RED, Color.BLUE, Color.YELLOW, Color.GREEN };

// private void initView() {
// w = new Wave();
// w.paint = new Paint();
// w.paint.setColor(colors[(int) (Math.random() * 4)]);
// w.paint.setAntiAlias(true);// 抗锯齿
// // 设置成圆环样式
// w.paint.setStyle(Style.STROKE);
// w.radiu = 20;
// w.paint.setStrokeWidth(w.radiu / 3);
// // 设置透明度--(0-255)
// w.paint.setAlpha(255);
// wList.add(w);
// }

@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            int x = (int) event.getX();
            int y = (int) event.getY();
            add(x, y);
            break;
    }
    return true;
}
3.重写OnDraw方法

@Override
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    // if (w.startX != 0 && startY != 0) {
    // if (paint.getAlpha() > 0) {
    // canvas.drawCircle(startX, startY, radiu, paint);
    // handler.sendEmptyMessageDelayed(0, 100);
    // }
    // }
    for (int i = 0; i < wList.size(); i++) {
        Wave w = wList.get(i);
        canvas.drawCircle(w.startX, w.startY, w.radiu, w.paint);
    }
}

4.利用hundler发送消息,刷新数据

  private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            //刷新数据
            flushData();
            //对整个界面进行重新绘制
            invalidate();

            if (isRunning) {
                //这里这个50就是刷新频率,如果够50毫秒就进行一次刷新
                handler.sendEmptyMessageDelayed(0, 50);
            }
        }
    };

    /**
     * 刷新数据
     */
    private void flushData() {
        for (int i = 0; i < wList.size(); i++) {
            Wave w = wList.get(i);
            // 1.圆环的半径不断变大
            w.radiu += 5;
            w.paint.setStrokeWidth(w.radiu / 3);
            // 2.透明度不断变暗 --为0的时候停止
            int alpha = w.paint.getAlpha();
            alpha -= 10;
            if (alpha < 5) {
                alpha = 0;
            }
            w.paint.setAlpha(alpha);
            if (alpha == 0) {
                //移除看不到的还在扩散的圆
                wList.remove(w);
                continue;
            }
            // 让ondraw执行
//       invalidate();
        }
        if (wList.size() == 0) {
            isRunning = false;
        }
    }
5.最后在xml里引用我们的自定义控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.hq.view.MyWare
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

源码下载:https://github.com/hequnsky/android-demo 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值