自定义View 触摸改变轮廓
import android.graphics.Rect;
import com.silverllt.base.utils.ConvertUtils;
import com.silverllt.skincenter.R;
public class DotPoint {
private float dx;
private float dy;
private float radius;
private Rect dotRect;
public DotPoint(float x, float y) {
dx = x;
dy = y;
radius = ConvertUtils.dp2px(15);
dotRect = new Rect((int) (dx - radius), (int) (dy - radius), (int) (dx + radius), (int) (dy + radius));
}
public float getDx() {
return dx;
}
public void setDx(float dx) {
this.dx = dx;
}
public float getDy() {
return dy;
}
public void setDy(float dy) {
this.dy = dy;
}
public float getRadius() {
return radius;
}
public void setRadius(float radius) {
this.radius = radius;
}
public boolean containXy(float mStartX, float mStartY) {
if (dotRect == null) return false;
if (dotRect.contains((int) mStartX, (int) mStartY)) {
return true;
}
return false;
}
public void upDateRect(float mStartX, float mStartY) {
dx = mStartX;
dy = mStartY;
dotRect.set((int) (dx - radius), (int) (dy - radius), (int) (dx + radius), (int) (dy + radius));
}
}
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
import java.util.ArrayList;
public class TouchDotView extends View {
private ArrayList<DotPoint> mDotPointList = new ArrayList<>();
private float mStartX;
private float mStartY;
private Context mContext;
private Paint circlePaint;
private Paint paint;
private Path mPath = new Path();
private int mTouchPointIndex = -1;
public TouchDotView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public TouchDotView(Context context) {
super(context);
initView(context);
}
private void initView(Context context) {
mContext = context;
circlePaint = new Paint();
circlePaint = new Paint();
circlePaint.setAntiAlias(true);
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setColor(Color.WHITE);
circlePaint.setStrokeWidth(2);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchPointIndex = -1;
mStartX = event.getX();
mStartY = event.getY();
if (mDotPointList.size() == 10) {
mTouchPointIndex = findTouchPoint(mStartX, mStartY);
KLog.e("onTouchEvent:====="+ mTouchPointIndex);
}
break;
case MotionEvent.ACTION_MOVE:
if (mDotPointList.size() == 10) {
mStartX = event.getX();
mStartY = event.getY();
if (mTouchPointIndex >= 0 && mTouchPointIndex < mDotPointList.size()) {
DotPoint dotPoint = mDotPointList.get(mTouchPointIndex);
dotPoint.upDateRect(mStartX, mStartY);
invalidate();
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mTouchPointIndex = -1;
mStartX = event.getX();
mStartY = event.getY();
if (mDotPointList == null) {
mDotPointList = new ArrayList<>();
}
if (mDotPointList.size() < 10) {
DotPoint dotPoint = new DotPoint(mStartX, mStartY);
mDotPointList.add(dotPoint);
/* if (mDotPointList.size() == 9) {
DotPoint dotPoint1 = mDotPointList.get(0);
DotPoint lastData = new DotPoint(dotPoint1.getDx(), dotPoint1.getDy());
mDotPointList.add(lastData);
}*/
invalidate();
} else {
}
break;
}
return true;
}
private int findTouchPoint(float mStartX, float mStartY) {
if (mDotPointList == null) return -1;
for (int i = 0; i < mDotPointList.size(); i++) {
DotPoint dotPoint = mDotPointList.get(i);
boolean isTouchPoint = dotPoint.containXy(mStartX, mStartY);
if (isTouchPoint) {
return i;
}
}
return -1;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@SuppressLint("Range")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mDotPointList != null && mDotPointList.size() > 0) {
mPath.reset();
for (int i = 0; i < mDotPointList.size(); i++) {
DotPoint dotPoint = mDotPointList.get(i);
canvas.drawCircle(dotPoint.getDx(), dotPoint.getDy(), dotPoint.getRadius(), circlePaint);
if (i == 0) {
mPath.moveTo(dotPoint.getDx(), dotPoint.getDy());
} else {
mPath.lineTo(dotPoint.getDx(), dotPoint.getDy());
if (i == mDotPointList.size() - 1) {
mPath.lineTo(mDotPointList.get(0).getDx(), mDotPointList.get(0).getDy());
}
}
}
canvas.drawPath(mPath, paint);
}
}
}