自定义控件:水波纹

效果图

自定义控件

实现代码

public class RingWave extends View {

    private List<Wave> mWaveList = new ArrayList<>();
    private int[] colors = new int[]{Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW};

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            flushData();
            invalidate();
            if (!mWaveList.isEmpty()){
                mHandler.sendEmptyMessageDelayed(0,50);
            }
        }
    };

    private void flushData() {
        ArrayList<Wave> removeList = new ArrayList<>();
        for (Wave wave : mWaveList){
            wave.radius += 3;
            wave.paint.setStrokeWidth(wave.radius/3);

            if (wave.paint.getAlpha() < 0){
                removeList.add(wave);
                continue;
            }

            int alpha = wave.paint.getAlpha();
            alpha -= 5;
            if (alpha < 0) alpha = 0;

            wave.paint.setAlpha(alpha);
        }
        mWaveList.removeAll(removeList);
    }


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

    public RingWave(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

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

    @Override
    protected void onDraw(Canvas canvas) {
        for (Wave wave : mWaveList){
            canvas.drawCircle(wave.cx, wave.cy, wave.radius, wave.paint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (MotionEventCompat.getActionMasked(event)){
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                addPoint((int)event.getX(), (int)event.getY());
                break;
        }
        return true;
    }

    private void addPoint(int x, int y) {
        if (mWaveList.isEmpty()){
            addWave(x, y);
            mHandler.sendEmptyMessageDelayed(0,50);
        }else {
            Wave lastWave = mWaveList.get(mWaveList.size() - 1);
            if (Math.abs(x - lastWave.cx) > 10 || Math.abs(y - lastWave.cy) > 10){
                addWave(x, y);
            }
        }
    }

    private void addWave(int x, int y) {
        Wave wave = new Wave();
        wave.cx = x;
        wave.cy = y;

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(wave.radius/3);
        paint.setAlpha(255);
        paint.setAntiAlias(true);

        int colorIndex = (int) (Math.random()*4);
        paint.setColor(colors[colorIndex]);

        wave.paint = paint;

        mWaveList.add(wave);
    }

    private class Wave{
        public int cx;
        public int cy;
        public int radius;
        public Paint paint;
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<com.google.widget.view.RingWave
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</com.google.widget.view.RingWave>
public class RingWaveActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wave);

        SpannableString title = new SpannableString("水波纹");
        title.setSpan(new ForegroundColorSpan(Color.WHITE),0,title.length(),
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(title);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值