的方式大
package com.example.maventest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ImageFormat;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import androidx.core.content.ContextCompat;
public class CrossLineView extends View {
private Paint mCirclePaint;
private Paint linePaint;
private boolean isActive = false;
private int lastX;
private int lastY;
private int parentHeight;
private int parentWidth;
FrameLayout.LayoutParams layoutParams;
private int status = MOVE;
private final static int RIGHT_BOTTOM = 0;
private final static int RIGHT_TOP = 2;
private final static int LEFT_TOP = 1;
private final static int LEFT_BOTTOM = 4;
private final static int MOVE = 3;
private int lineDirection = LEFT_TOP_TO_RIGHT_BOTTOM;
private static final int LEFT_TOP_TO_RIGHT_BOTTOM = 1;
private static final int LEFT_BOTTOM_TO_RIGHT_TOP = 2;
public CrossLineView(Context context) {
super(context);
init();
// setBackgroundColor(ContextCompat.getColor(context,R.color.colorback));
setClickable(true);
}
public void init(){
mCirclePaint = new Paint();
mCirclePaint.setDither(true);
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(ContextCompat.getColor(getContext(),R.color.colorAccent));
mCirclePaint.setStyle(Paint.Style.FILL);
linePaint = new Paint();
linePaint.setDither(true);
linePaint.setAntiAlias(true);
linePaint.setStrokeWidth(10);
linePaint.setColor(ContextCompat.getColor(getContext(),R.color.colorPrimary));
linePaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
layoutParams = (FrameLayout.LayoutParams) getLayoutParams();
FrameLayout frameLayout = (FrameLayout) getParent();
parentHeight = frameLayout.getHeight();
parentWidth = frameLayout.getWidth();
}
@Override
public void onMeasure(int widthMeasureSpec , int heightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
if(widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(150,140);
} else if (widthSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(150,heightSpecSize);
} else if (heightSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(widthSpecSize, 140);
} }
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (lineDirection == LEFT_TOP_TO_RIGHT_BOTTOM){
int point1X = getLeft() + 50 - layoutParams.leftMargin;
int point1Y = getTop() + 50 - layoutParams.topMargin;
int point2X = getRight() - 50 - layoutParams.leftMargin;
int point2Y = getBottom() - 50 - layoutParams.topMargin;
canvas.drawLine(point1X,point1Y,point2X,point2Y,linePaint);
canvas.drawCircle(point1X,point1Y,30,mCirclePaint);
canvas.drawCircle(point2X,point2Y,30,mCirclePaint);
canvas.drawCircle((point1X + point2X)/2,(point1Y+point2Y)/2,30,mCirclePaint);
} else {
int point1X = getLeft() + 50 - layoutParams.leftMargin;
int point1Y = getBottom() - 50 - layoutParams.topMargin;
int point2X = getRight() - 50 - layoutParams.leftMargin;
int point2Y = getTop() + 50 - layoutParams.topMargin;
canvas.drawLine(point1X,point1Y,point2X,point2Y,linePaint);
canvas.drawCircle(point1X,point1Y,30,mCirclePaint);
canvas.drawCircle(point2X,point2Y,30,mCirclePaint);
canvas.drawCircle((point1X + point2X)/2,(point1Y+point2Y)/2,30,mCirclePaint);
} }
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// lastX = (int) event.getX();
// lastY = (int) event.getY();
caluateState(event);
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) (event.getX() - lastX);
int dy = (int) (event.getY() - lastY);
switch (status){
case MOVE:
updatePosMove(dx,dy);
break;
case RIGHT_BOTTOM:
if (lineDirection == LEFT_TOP_TO_RIGHT_BOTTOM){
updatePosRightBottom(dx,dy);
}
break;
case LEFT_TOP:
if (lineDirection == LEFT_TOP_TO_RIGHT_BOTTOM){
updatePosLeftTop(dx,dy);
}
break;
case RIGHT_TOP:
if (lineDirection == LEFT_BOTTOM_TO_RIGHT_TOP){
updatePosRightTop(dx,dy);
}
break;
case LEFT_BOTTOM:
if (lineDirection == LEFT_BOTTOM_TO_RIGHT_TOP){
updatePosLeftBottom(dx,dy);
}
break;
default:
break;
}
break;
case MotionEvent.ACTION_UP:
break;
}
lastX = (int) event.getX();
lastY = (int) event.getY();
return super.onTouchEvent(event);
}
private void updatePosLeftBottom(int dx, int dy) {
layoutParams.width = layoutParams.width - dx;
layoutParams.height = layoutParams.height + dy;
layoutParams.leftMargin = layoutParams.leftMargin + dx;
if (layoutParams.leftMargin < 0) layoutParams.leftMargin = 0;
if (layoutParams.topMargin + layoutParams.height > parentHeight)
layoutParams.height = parentHeight - layoutParams.topMargin;
if (layoutParams.width < 150){
layoutParams.width = 150;
lineDirection = LEFT_TOP_TO_RIGHT_BOTTOM;
invalidate();
}
if (layoutParams.height < 150){
layoutParams.height = 150;
lineDirection = LEFT_TOP_TO_RIGHT_BOTTOM;
invalidate();
}
setLayoutParams(layoutParams);
}
private void updatePosRightTop(int dx, int dy) {
layoutParams.width = layoutParams.width + dx;
layoutParams.height = layoutParams.height - dy;
layoutParams.topMargin = layoutParams.topMargin + dy;
if (layoutParams.topMargin < 0) layoutParams.topMargin = 0;
if (layoutParams.leftMargin + layoutParams.width > parentWidth)
layoutParams.width = parentWidth - layoutParams.leftMargin;
if (layoutParams.width < 150){
layoutParams.width = 150;
lineDirection = LEFT_TOP_TO_RIGHT_BOTTOM;
invalidate();
}
if (layoutParams.height < 150){
layoutParams.height = 150;
lineDirection = LEFT_TOP_TO_RIGHT_BOTTOM;
invalidate();
}
setLayoutParams(layoutParams);
}
private void updatePosLeftTop(int dx, int dy) {
layoutParams.width = layoutParams.width - dx;
layoutParams.height = layoutParams.height - dy;
layoutParams.topMargin = layoutParams.topMargin + dy;
layoutParams.leftMargin = layoutParams.leftMargin + dx;
if (layoutParams.topMargin < 0) layoutParams.topMargin = 0;
if (layoutParams.leftMargin < 0) layoutParams.leftMargin = 0;
if (layoutParams.width < 150){
layoutParams.width = 150;
lineDirection = LEFT_BOTTOM_TO_RIGHT_TOP;
invalidate();
}
if (layoutParams.height < 150){
layoutParams.height = 150;
lineDirection = LEFT_BOTTOM_TO_RIGHT_TOP;
invalidate();
}
setLayoutParams(layoutParams);
}
private void updatePosRightBottom(int dx, int dy) {
layoutParams.width = layoutParams.width + dx;
layoutParams.height = layoutParams.height + dy;
if (layoutParams.width + layoutParams.leftMargin > parentWidth){
layoutParams.width = parentWidth - layoutParams.leftMargin;
}
if (layoutParams.height + layoutParams.topMargin > parentHeight){
layoutParams.height = parentHeight - layoutParams.topMargin;
}
if (layoutParams.width < 150) {
layoutParams.width = 150;
lineDirection = LEFT_BOTTOM_TO_RIGHT_TOP;
invalidate();
}
if (layoutParams.height < 150){
layoutParams.height = 150;
lineDirection = LEFT_BOTTOM_TO_RIGHT_TOP;
invalidate();
}
setLayoutParams(layoutParams);
}
private void caluateState(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
if (x > layoutParams.width/5 * 4 && y > layoutParams.height/5 * 4){
status = RIGHT_BOTTOM;
} else if (x < layoutParams.width/5*2 && y < layoutParams.height/5*2 ){
status = LEFT_TOP;
} else if (x > layoutParams.width/5 * 4 && y < layoutParams.height/5*2){
status = RIGHT_TOP;
} else if (x < layoutParams.width/5*2 && y > layoutParams.height/5 * 4){
status = LEFT_BOTTOM;
} else {
status = MOVE;
}
}
private void updatePosMove(int dx, int dy) {
layoutParams.topMargin = layoutParams.topMargin + dy;
layoutParams.leftMargin = layoutParams.leftMargin + dx;
if (layoutParams.topMargin < 0) layoutParams.topMargin = 0;
if (layoutParams.leftMargin < 0) layoutParams.leftMargin = 0;
if (layoutParams.topMargin + layoutParams.height > parentHeight){
layoutParams.topMargin = parentHeight - layoutParams.height;
}
if (layoutParams.leftMargin + layoutParams.width > parentWidth){
layoutParams.leftMargin = parentWidth - layoutParams.width;
} setLayoutParams(layoutParams);
}}