Android 는 현재 클릭 위치 가 원 의 내부 에 있 는 지 여 부 를 어떻게 판단 합 니까?

우 리 는 모두 알 고 있 습 니 다.원형 ImageView 컨트롤(본 프로젝트 에서 사용 하 는 원형 컨트롤 은 github 에 있 습 니 다)이 고 사실은 차지 하 는 구역 은 정사각형 구역 입 니 다.내용 만 원형 으로 표 시 됩 니 다.우리 가 ImageView 에 터치 이 벤트 를 설정 할 때 표시 구역 이 없 으 면 해당 하 는 클릭 이벤트 입 니 다.현재 클릭 한 위 치 를 계산 하여 ImageView 가 해당 하 는 터치 이벤트 인지 판단 할 수 있 습 니 다.
효 과 는 그림 과 같다.

위의 그림 에서 보 듯 이 원 안 을 클릭 하여 드래그 할 때 원 은 따라 이동 하지만 원 밖 을 클릭 하여 드래그 할 때 원 은 아무런 반응 이 없다.
이 효 과 를 실현 하 는 것 은 어렵 지 않다.먼저 원 의 중심 점 좌표(x1,y1)를 계산 하고 x1,y1 은 화면 에 대한 좌표 이지 레이아웃 에 대한 좌표 가 아니다.
그 다음 에 현재 누 른 좌표(x2,y2)를 얻 으 려 면 현재 누 른 점 의 좌표(x2,y2)와 원심(x1,y1)의 거리 d 의 길 이 를 계산 한 다음 에 원 의 반지름 r 와 비교 해 야 한다.만약 d>r 가 현재 누 른 점 이 원 밖 에 있 으 면 d<r 라면 현재 누 른 점 은 원 안에 있다.다음 그림 과 같다.

이렇게 주의 하 세 요.이상 은 Motion Event.ACTION 에 있어 야 합 니 다.DOWN 에서 계산 하면 거리 d 가 반경 r 보다 클 때 return false 는 현재 컨트롤 이 이 벤트 를 소비 하지 않 습 니 다.
코드 는 다음 과 같 습 니 다:

public class MainActivity extends Activity {

 int lastX;
 int lastY;
 boolean isView = false;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 final CircleImageView civ = (CircleImageView) findViewById(R.id.civ_levitate);

 civ.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {

  switch (event.getAction()){
   case MotionEvent.ACTION_DOWN:

   lastX = (int) event.getRawX();
   lastY = (int) event.getRawY();

   //          
   int[] location = new int[2];
   civ.getLocationOnScreen(location);

   //        x y  
   int x = location[0];
   int y = location[1];


   //              getLeft
   int r = (civ.getRight()-civ.getLeft())/2;

   //    
   int vCenterX = x+r;
   int vCenterY = y+r;

   //    x      x     
   int distanceX = Math.abs(vCenterX-lastX);
   //    y      y     
   int distanceY = Math.abs(vCenterY-lastY);
   //            
   int distanceZ = (int) Math.sqrt(Math.pow(distanceX,2)+Math.pow(distanceY,2));

   //                  ,           
   if(distanceZ > r){
    return false;
   }

   isView = true;

   break;

   case MotionEvent.ACTION_MOVE:

   if(isView){

    int moveX = (int) event.getRawX();
    int moveY = (int) event.getRawY();

    int disX = moveX - lastX;
    int disY = moveY - lastY;

    int left = civ.getLeft()+disX;
    int right = civ.getRight()+disX;
    int top = civ.getTop()+disY;
    int bottom = 
    civ.getBottom()+disY;

    civ.layout(left,top,right,bottom);

    lastX = moveX;
    lastY = moveY;
   }


   break;

   case MotionEvent.ACTION_UP:


   isView = false;


   break;
  }

  return true;
  }
 });

 }
}

자,demo 다운로드 주소:다운로드 클릭
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기