0

최종 위치 좌표가 내보기에 있으면 버튼을 이동하고 싶습니다. 그래서 초기 클릭 (ACTION_DOWN)을 저장하여 클릭에서 이동을 구별 할 수 있지만, 뭔가 잘못되었습니다. 움직이는 이벤트에서 날아가는 나의 버튼! 클릭이 전혀 작동하지 않습니다. 내 주요 목표는보기 (화면/창) 밖으로 이동 버튼을 방지하는 것입니다.플로트 동작 버튼 처리 (내부 레이아웃 즉, 사용자에게 표시됨) OnTouchListener로 클릭하고

제 생각에 Outlocation에서 뷰 경계로 얻는 좌표가 잘못된 것입니다. 또는 setX()/setY()은 내가 가지고있는 픽셀과 비교할 때 호환되지 않는 매개 변수를 사용합니다. 여기

이 문제에 대한 내 코드에 상대적입니다 :

b = (FloatingActionButton) view.findViewById(R.id.fab); 
b.setOnTouchListener(new View.OnTouchListener() { 

     float x, y; 
     float[] Outlocation = new float[2]; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 


       case MotionEvent.ACTION_MOVE: 

        float new_x = event.getRawX() ; 
        float new_y = event.getRawY(); 


//      v.getLocationOnScreen(Outlocation); 
        DisplayMetrics metrics = getResources().getDisplayMetrics(); 
        Outlocation[0] = metrics.widthPixels; 
        Outlocation[1] = metrics.heightPixels; 

        if (new_x > Outlocation[0]) { 
         new_x = x ; 

        } else if (new_x < 0) { 
         new_x = x; 

        } 
        if (new_y > Outlocation[1]) { 
         new_y = y; 
        } else if (new_y < 0) { 
         new_y = y; 
        } 
        b.setX(b.getX() + (new_x - x)); 
        b.setY(b.getY() + (new_y - y)); 
        return true; 


       case MotionEvent.ACTION_DOWN: 
        x = event.getRawX(); 
        y = event.getRawY(); 
        return true; 
       case MotionEvent.ACTION_UP: 
        if(x == event.getRawX() & (y == event.getRawY())) { 

         //Handle Click Event        

         Intent intent = new Intent(getContext(), AddActivity.class); 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(intent); 
         MainActivity.Gone = true; 
         MainActivity.setTab = 1; 
         return true; 
        } 
      } 

      return false; 
     } 
}); 

업데이트 : 사용자 지정 레이아웃 내가 처음에 버튼을 이동하려는 이유는 메시지 목록의 일부를 포함하기 때문 데니스의 대답은 작동하지 않습니다 사용자가 메시지의 일부를 읽을 수 있도록 배치하십시오.

+0

"보기"란 무엇을 의미합니까? 전체 화면 또는 레이아웃의 특정보기? –

+0

나는 Relativelayout 또는 Framelayout과 같은 어떤 것도 될 수있는 버튼의 부모보기를 의미했습니다 .... –

+0

그러면 DisplayMetrics를 사용하는 이유는 무엇입니까? 예를 들어 높이가 1920이고 전체 HD 장치가 1080 너비와 같이 전체 장치 화면 픽셀을 제공합니다. 상위 뷰의 높이와 너비를 가져 와서 부모 뷰 경계 내에서 움직임 만 허용하려는 경우 외부 할당에 값을 입력하면됩니다. –

답변

0

그래서 내부에 원이있는 사용자 정의보기를 만들었습니다. 그리고 이것이 내가 Drag-The-Circle 기능을 활성화/허용하는 방법입니다. 즉 사용자가 원 안쪽을 살짝 두 드릴 때 원이 위치를 변경하도록 설정합니다.

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     boolean value = super.onTouchEvent(event); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_MOVE: { 
      float x = event.getX(); 
      float y = event.getY(); 

      double dx = Math.pow((x - mCircleX), 2); 
      double dy = Math.pow((y - mCircleY), 2); 

      if (dx + dy < Math.pow(mCircleRad, 2)) { 
       //touched inside the circle 
       mCircleX = event.getX(); 
       mCircleY = event.getY(); 
       swapColor(); 
       //postInvalidate(); 
       return true; 
      } 
      return value; 
     } 

    }//end of switch 
    return value; 
} 

그리고 여기입니다 내 OnDraw()

@Override 
    public void onDraw(Canvas canvas) { 

     if (mCircleX == 0f || mCircleY == 0f) { 
     //Drawing circle in the center. (initially) 
      mCircleX = getWidth()/2; 
      mCircleY = getHeight()/2; 
      mLastGoodX = mCircleX; 
      mLastGoodY = mCircleY; 
      canvas.drawCircle(mCircleX, mCircleY, mCircleRad, mCirclePaint); 
     } 
    int horizontalLeftLimit = 100; 
    int horizontalRightLimit = getWidth() - 100; 

    int verticalUpperLimit = 100; 
    int verticalLowerLimit = getHeight() - 100; 

     if (mCircleX > horizontalLeftLimit && mCircleX < horizontalRightLimit && 
       mCircleY > verticalUpperLimit && mCircleY < verticalLowerLimit) { 
      canvas.drawCircle(mCircleX, mCircleY, mCircleRad, mCirclePaint); 
      mLastGoodX = mCircleX; 
      mLastGoodY = mCircleY; 
     } else { 
      canvas.drawCircle(lastGoodX, lastGoodY, mCircleRad, mCirclePaint); 
      //Retaining circle coordinates back to the Valid One 
      mCircleX = mLastGoodX; 
      mCircleY = mLastGoodY; 
     } 
    } 

이 사용자 제한을 받고 mLastGoodXmLastGoodY를 통해 원의 이전 좌표를 유지하는 데 도움이 될 것입니다.

it 사용자 정의보기는 다음과 같습니다.

+0

코드에서 원이 사용자 정의보기 바깥으로 이동할 수 있습니까? –

+0

mm, 예. 글쎄, 당신은 경계 체크를 넣을 수 있습니다. – Dennis

+0

오. 저는 경계로 생각했습니다, 당신은 당신의 FAB의 경계를 의미합니다. 잠깐, 좀 보도록하겠습니다. – Dennis