天天看點

自定義view點選水波紋效果(加上長按和單擊事件的處理)

代碼:

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by hwk on 2020/5/18.
 */
public class PointView extends View {
    private Paint paintPoint;//圓心
    private Paint paintWave;//波浪
    private float x, y;//畫圓中心點坐标
    private float radiusPoint;//圓心直徑
    private int radiusWave;//波浪直徑
    private int alphaWave;//波浪透明度常量

    private int mohufanwei = 8;//移動少于次參數,視為未移動,機關/px

    public PointView(Context context) {
        super(context);
        initPaint();
    }

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

    private void initPaint() {
        paintPoint = new Paint();
        paintPoint.setStyle(Paint.Style.FILL);
        paintPoint.setColor(Color.parseColor("#FF0000"));
        paintPoint.setAntiAlias(true);
        paintPoint.setStrokeWidth(radiusPoint / 2);

        paintWave = new Paint();
        paintWave.setStyle(Paint.Style.FILL);
        paintWave.setColor(Color.parseColor("#BBCFFC"));
        paintWave.setAntiAlias(true);
        paintWave.setStrokeWidth(radiusWave / 2);
        paintWave.setAlpha(alphaWave);
    }

    private Timer timer;
    private TimerTask timerTask;

    boolean isCick = true;//判斷是否進行點選
    private static final int LONGPRESSTIME = 1000;//長按超過1秒,觸發長按事件

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN && event.getPointerCount() == 1) {
            //長按計時器
            x = event.getX();
            y = event.getY();
            timer = new Timer();
            timerTask = new TimerTask() {
                @Override
                public void run() {
                    //長按邏輯觸發,isClick置為false,手指移開後,不觸發點選事件
                    isCick = false;
                    doLongPress();
                }
            };
            isCick = true;
            timer.schedule(timerTask, LONGPRESSTIME, 60 * 60 * 24 * 1000);
        }
        if (event.getAction() == MotionEvent.ACTION_UP && event.getPointerCount() == 1) {
            //沒有觸發長按邏輯,進行點選事件
            if (isCick) {
                doClick();
            }
            timerTask.cancel();
            timer.cancel();
        }
        //出現移動,取消點選和長按事件
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            //如果在一定範圍内移動,不處理移動事件
            if (Math.abs(x - event.getX()) > mohufanwei || Math.abs(y - event.getY()) > mohufanwei) {
                isCick = false;
                timerTask.cancel();
                timer.cancel();
            }

        }
        return true;
    }

    /**
     * 長按事件
     */
    private void doLongPress() {
        Log.e("hwk", "長按了" + x + "   " + y);
    }

    /**
     * 點選事件
     */
    private void doClick() {
        Log.e("hwk", "點選了" + x + "   " + y);
        radiusPoint = 25;
        radiusWave = 35;
        alphaWave = 255;
        flushPaint();
    }

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            flushPaint();
        }
    };

    private void flushPaint() {
        radiusPoint = radiusPoint - 1.5f;
        radiusWave = radiusWave + 3;
        alphaWave = alphaWave - 20;
        if (alphaWave <= 25) {
            alphaWave = 0;
            paintWave.setStrokeWidth(radiusWave / 2);
            paintWave.setAlpha(alphaWave);
            paintPoint.setStrokeWidth(radiusPoint / 2);
            paintPoint.setAlpha(0);

            invalidate();
        } else {
            paintWave.setStrokeWidth(radiusWave / 2);
            paintWave.setAlpha(alphaWave);
            paintPoint.setStrokeWidth(radiusPoint / 2);
            paintPoint.setAlpha(255);

            invalidate();
            handler.sendEmptyMessageDelayed(0, 35);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(x, y, radiusWave, paintWave);
        canvas.drawCircle(x, y, radiusPoint, paintPoint);
    }
}