自定义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); } } }