test

100 阅读1分钟

的方式大

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);   
 }}