2017-11-27 14 views
-1

화면 주위로 드래그 할 수있는 사용자 정의보기가 있으며, 다른보기를 표시 할 때 에뮬레이터에서 사용할 때 모든 것이 올바르게 작동합니다. 그러나 실제 기기에서 맞춤보기는 클릭시 새로운보기를 표시하지 않습니다. 그리고 나는 왜 그런지 이해하려고 고심하고 있습니다.사용자 정의보기의 겹쳐서 수신자

나는 문제가 곳이 생각 : 나는 화면의 왼쪽 측면에있는 뷰를 넣을 때 다른보기는 탭에 표시됩니다,하지만 난 > 지금 <에 기호를 변경하는 경우 뷰는 오른쪽이 아닌 왼쪽에서 열 수 있습니다.

case MotionEvent.ACTION_MOVE: 
        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){ 
         params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX); 
         params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 

         moving = true; 
        } 

이 전체 코드입니다 : 사전에 어떤 도움

collapsedLayout.setOnTouchListener(new View.OnTouchListener() { 
     private int initialX; 
     private int initialY; 
     private float initialTouchX; 
     private float initialTouchY; 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        initialX = params.x; 
        initialY = params.y; 
        initialTouchX = motionEvent.getRawX(); 
        initialTouchY = motionEvent.getRawY(); 

        return true; 

       case MotionEvent.ACTION_MOVE: 
        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){ 
         params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX); 
         params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 

         moving = true; 
        } 
        return true; 

       case MotionEvent.ACTION_UP: 

        if(moving){ 
         if (params.x > 0) { 
          params.x = (int) dpWidth; 
         } else if (params.x < 0) { 
          params.x = (int) dpWidth * -1; 
         } 
         mWindowManager.updateViewLayout(entireLayout, params); 
         moving = false; 
        }else { 
         collapsedLayout.setVisibility(View.GONE); 
         expandedLayout.setVisibility(View.VISIBLE); 
        } 
        return true; 
      } 
      return false; 
     } 
    }); 

감사합니다!

+1

당신' 움직이는 '사실. 탭에 터치 리스너 대신 클릭 리스너를 사용하거나 업 이벤트에 대한 시간 프레임을 추가하는 것을 고려하십시오 (예 : 업 이벤트가 다운 된 후 1 초 이내에 발생한 경우 클릭). – RobVoisey

+1

일부 로그는 어떤 이벤트가 호출되는지를 표시합니다. – jorjSB

+0

@RobVoisey 예, 맞습니다. 드래그를 위해 onTouch를 구현하고보기를 표시하기 위해 onclick 리스너를 구현했습니다. 나는 그 전에 그것을 혼자서 시도해 보았지만 효과가 없었기 때문에 가능하다고 말했을 때 그것을 달성하는 방법을 확인하러갔습니다. 그리고 그 마침내 펑! 하하. 고마워요! –

답변

0

RobVoisey 덕분에 방법을 찾았습니다. 나는 드래그 뷰를위한 Ontouch 리스너와 탭되었을 때 뷰를 보여주기위한 클릭 리스너를 구현했습니다. 나는이 솔루션 how to use both Ontouch and Onclick for an ImageButton?

을 사용하고 구현을 위해 대답보고 싶어 누군가를 위해 다음과 같이이다 : 당신이 아직 설정되어있는 ACTION_MOVE 이벤트 일을 할 수있는 "탭"할 때

private GestureDetector gestureDetector; 

    public void displayOverlay() { 
    gestureDetector = new GestureDetector(this, new SingleTapConfirm()); 

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

      if (gestureDetector.onTouchEvent(event)) { 

       return true; 
      } else { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         initialX = params.x; 
         initialY = params.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 
         return true; 

        case MotionEvent.ACTION_UP: 
         if (params.x > 0) { 
          params.x = (int) dpWidth; 
         } else if (params.x < 0) { 
          params.x = (int) dpWidth * -1; 
         } 
         mWindowManager.updateViewLayout(entireLayout, params); 
         return true; 

        case MotionEvent.ACTION_MOVE: 
         params.x = initialX + (int) (event.getRawX() - initialTouchX); 
         params.y = initialY + (int) (event.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 
         return true; 
       } 
      } 
      return false; 
     } 
    }); 
    } 


private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapUp(MotionEvent event) { 
     collapsedLayout.setVisibility(View.GONE); 
     expandedLayout.setVisibility(View.VISIBLE); 

     return true; 
    } 
}