2013-08-08 2 views
0

onClickListeneronFling (GestureDetector 사용)이 있습니다.onClickListener onFling 트리거를 내 보내지 않음

버튼을 클릭하면 onClickListener이 발생합니다.

화면의 몸체로 날아간다면 onFling가 발동합니다.

그러나 버튼에서 뛰어 내리기 시작하면 불이 나지 않습니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <Button 
      android:id="@+id/myButton" 
      android:layout_margin="50dp" 
      android:layout_height="100dp" 
      android:layout_width="match_parent" 
      android:text="Button"/> 
</LinearLayout> 

을 그리고 코드는 다음과 같습니다 :

레이아웃은 다음과

public class myLayout extends Activity implements GestureDetector.OnGestureListener { 
    private GestureDetector gDetector; 

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

     gDetector = new GestureDetector(getBaseContext(), this); 
     findViewById(R.id.myButton).setOnClickListener(button_OnClickListener); 
    } 

    final View.OnClickListener button_OnClickListener = new View.OnClickListener() { 
     public void onClick(final View buttonView) { 
      Toast.makeText(getApplicationContext(), "button pressed", Toast.LENGTH_LONG).show(); 
     } 
    }; 

    @Override 
    public boolean onDown(MotionEvent motionEvent) { 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent motionEvent) { 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent motionEvent) { 
     return false; 
    } 

    @Override 
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) { 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent motionEvent) { 
    } 

    @Override 
    public boolean onFling(MotionEvent start, MotionEvent finish, float v, float v2) { 
     if (start.getRawY() < finish.getRawY()) { 
      Toast.makeText(getApplicationContext(), "Fling detected", Toast.LENGTH_LONG).show(); 
     } 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me) { 
     Log.i("Touch", "onTouchEvent"); 
     return gDetector.onTouchEvent(me); 
    } 
} 

가 어떻게이 onFling 먼저 실행해야받을 수 있나요?

다른 게시물 (예 : onClick blocking onFling)을 보았지만 적절한 대답을 찾을 수 없습니다.

답변

0

당신이 결정하는 Button의 부모 (또는 계층 구조에서 더 높은 무엇인가)의 (내가 더 잘 맞게되는 모르겠어요이 시점에서, 어쩌면 나, dispatchTouchEvent()) onInterceptTouchEvent()를 사용하여 시도해야 행 노선의 터치를할지 여부 버튼 또는 제스쳐 디텍터. MotionEvent의 RECT의 좌표가 Button에 속하는 '와 ACTION_DOWN이 곧 ACTION_UP 다음 경우

, 그것은 클릭의와 Button에 전달해야하지만 ACTION_MOVE을받을 경우 운동은 정도 계속 어디를 스 와이프인지 확인하십시오. 제스쳐 디텍터로 처리해야합니다.

UPD 다음은이 기술을 https://stackoverflow.com/a/3834952/375929

+0

감사를 설명하는 대답 - 해당 게시물은 확실히 도움이됩니다. 늦은 응답에 대해 죄송합니다 – dubman23

+0

'ViewGroup' 내에'onInterceptTouchEvent'를 포함시키는 방법과이'ViewGroup'에 레이아웃을 연결하는 방법을 보여주는 다음 링크에서 매우 유용한 답변을 발견했습니다 : http://stackoverflow.com/questions/1367983/how-to-use-viewgroup-in-android – dubman23