그래서, 당신은 터치 이벤트가 작동하는 방법 안드로이드 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;
}
}
}
나는이 코드를 바로 작성했으며 실수를 할 수 있습니다. 나는 그 아이디어를 보여 주려고 노력했다.
예제를 제공해 주시겠습니까? 나는 하나의보기에서 내 action_move로 이것을 시도하고 무작위로 화면을 끌고 (올라가고 있지 않음) 그리고 이벤트를 해고했는지보기 위해 이동했다. 내 편집 코드를 넣어 – joe
@ joe 내 대답을 업데이 트했습니다. –