代碼:
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);
}
}