2015-01-21 2 views
0

일부 터치 컨트롤을 표시하거나 숨기려면 터치 리스너를 사용하고 ACTION_DOWN에서는 컨트롤이 표시되고 ACTION_UP에서는 숨겨집니다. 내 손가락을 들어 올리지 않고 컨트롤을 터치 할 수 있기를 원합니다. ACTION_MOVE 모션을 사용해 보았습니다. 이벤트가 트리거되지 않기 때문에 작동시키지 못했습니다. 드래그 이벤트에 대해 생각했지만 이것이 적절할 지 확신 할 수 없습니다.이 상황에서 어떤 모션 이벤트를 사용합니까?

public boolean onTouch(View v, MotionEvent e) 
{ 
if(v == mute && e.getAction() == MotionEvent.ACTION_MOVE) 
{ 
Toast.makeText(getApplicationContext(), "Muted.", Toast.LENGTH_SHORT).show(); 
hideVolumeControls(); 
return true; 
} 
else 
return false; 
} 

답변

0

그래서, 당신은 터치 이벤트가 작동하는 방법 안드로이드 uderstand해야합니다 -

public boolean onTouch(View v, MotionEvent e) 
{ 
    if(v == audioControls) 
    { 
     if(e.getAction() == MotionEvent.ACTION_DOWN) 
      showVolumeControls(); 
     else if(e.getAction() == MotionEvent.ACTION_UP) 
      hideVolumeControls(); 

    } 


    else if(e.getAction() == MotionEvent.ACTION_MOVE) 
    { 
     if(v == mute) 
     //Do stuff with this volume control 
    } 

    return true; 
} 

@Demand의 대답은 내 의견을 읽어 여기에 코드입니다. View1을 터치하면 해당 뷰에 대해 onTouchListener를 설정하고 해당 이벤트에 대해 true를 반환합니다. 다른 뷰는 결코 동일한 체인에서 모션 이벤트를 가져 오지 않습니다.

"audioControls"를 터치하면 손가락을 뗄 때까지 다른 뷰에서 모션 이벤트를 감지 할 수 없습니다.

onTouch 메서드에서 false를 반환 할 수 있습니다. 이 경우 audioControls의 parentView는 모든 motionEvent를 catch합니다. 그러나 뷰 계층의 audioControls에 대한 부모가 아닌 뷰는 motionEvent를 catch하지 않습니다.

귀하의 견해에 대해 컨테이너의 모든 모션 이벤트를 포착하여 자신을 위해 디스패치해야합니다. 이것은 유일한 뷰의 한 체인에서 motionEvent를 잡는 유일한 방법입니다.

업데이트 : 조금 더 설명하려고합니다.

<LinearLayout id="@+id/container"> 
    <View id="@+id/view1"/> 
    <View id="@+id/view2"/> 
</LinearLayout> 

그리고 당신은 뷰 1에 터치 다운과 뷰 2에 손가락을 이동하려는 : 는이 같은 레이아웃을 상상해보십시오. Android 터치 이벤트 흐름은이를 수행 할 수 없습니다. 하나의보기 만 전체 이벤트 체인을 잡을 수 있습니다. 그래서 컨테이너에 onTouchListener를 추가하고 이와 같이해야합니다.

public boolean onTouch(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 
    for (int i = 0; i<container.getChildCount(); i++) { 
    View child = container.getChildAt(i); 
    if (x>child.getLeft() && x < child.getRight() && y < child.getBottom() && y > child.getTop()) { 
     /*do whatever you want with this view. Child will be view1 or view2, depends on coords;*/ 
     break; 
    } 
    } 
} 

나는이 코드를 바로 작성했으며 실수를 할 수 있습니다. 나는 그 아이디어를 보여 주려고 노력했다.

+0

예제를 제공해 주시겠습니까? 나는 하나의보기에서 내 action_move로 이것을 시도하고 무작위로 화면을 끌고 (올라가고 있지 않음) 그리고 이벤트를 해고했는지보기 위해 이동했다. 내 편집 코드를 넣어 – joe

+0

@ joe 내 대답을 업데이 트했습니다. –

관련 문제