2012-10-11 4 views
3

다른보기 상단에 ScrollView (Buttons)이 있습니다. ScrollView은 전체 화면을 찍고 있으며 그 아래에있는보기를가립니다. 내 응용 프로그램의 어느 시점에서 RelativeLayout 아래의보기에 터치 이벤트를 전송하는 방법은 무엇입니까?

은 내가 ScrollView 비활성화 (하지만 여전히 볼)과 ScrollView 아래에있는 Buttons 모든 터치 이벤트를 전송해야합니다. 어떻게해야합니까? Buttons과 같은 일부보기는 비활성화되었을 때 자동으로 수행하지만, ScrollView은 그렇게하지 않습니다.

+0

어떻게 'ScrollView'를 비활성화 하시겠습니까? 또한 상황은 약간의 직관적 인 것으로 보이며'ScrollView'가 여전히 보이고'Buttons'가 그 아래에 클릭됩니다. – Luksprog

+0

이 행동의 필요성을 설명하는 것이 어렵지만 내가해야 할 일이 있습니다. 필자가 정말로 필요로하는 것은 모두 볼 수 있지만 다루기 힘든 스크롤 뷰이다. 그래서 모든 터치는 아래 레이아웃으로 간다. 그것이 가능하니?! 귀하의 질문에, 나는 스크롤보기를 해제하지 않았고, 내 문제의 일부, 누가 그것을 해제해야합니까 ... – roiberg

답변

11

시도가 상태를 나타내는 플래그를 가지고 자신의 ScrollView을 구현하기 위해 (비활성화/활성화)도 및 터치 이벤트가 ScrollView을 통과하자하는 onTouchEventdispatchTouchEvent 우선합니다.

public class DisabledScrollView extends ScrollView { 

    private boolean mIsDisable = false; 

    // if status is true, disable the ScrollView 
    public void setDisableStatus(boolean status) { 
     mIsDisable = status; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     // no more tocuh events for this ScrollView 
     if (mIsDisable) { 
      return false; 
     }  
     return super.onTouchEvent(ev); 
    } 

    public boolean dispatchTouchEvent(MotionEvent ev) { 
     // although the ScrollView doesn't get touch events , its children will get them so intercept them. 
     if (mIsDisable) { 
      return false; 
     } 
     return super.dispatchTouchEvent(ev); 
    } 

} 

그런 다음 당신이해야 할 모든 것을 플래그의 값을 변경할 수 있습니다 예를 들면 다음과 같습니다. 그것이 효과가 있는지보십시오.

+0

좋은 생각, 내가 그걸 시도 할 것입니다! – roiberg

+0

감사합니다. – Vikram

2

필자가보기 B에서 오버랩 한 뷰 A에서 터치 이벤트를 처리 한 다음 뷰 B에 이벤트를 보내야했습니다. 두 뷰 모두 동일한 RelativeLayout의 자식 이었지만 상위 - 자식이 없었습니다 뷰 A와 B이 사이의 관계는 나를 위해 일한 :

viewA.setOnTouchListener(new OnTouchListener(){ 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // do my stuff here 

      viewB.dispatchTouchEvent(event); 
     } 
} 
0

을 내가있는 ScrollView 아래 recyclerview이이 경우. scrollview의 맨 위는 수직 스크롤이고 recyclerview는 수평 스크롤입니다. 스크롤 뷰에는 위쪽 패딩이있어 스크롤 뷰 패딩의 투명도를 통해 recyclerview를 볼 수 있습니다. scrollview가 스크롤 될 때 recyclerview가 시차 효과 (이 효과는 다른 코드에 있음)를 좋아하도록 세로로 스크롤 할 것이기 때문에이 방법을 사용해야합니다. 아래에있는 내 경우에 작동하고이 코드는,이 레이아웃

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/gray0" 
android:clipToPadding="false" 
android:clipChildren="false" 
android:paddingBottom="70dp"> 
<android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerview" 
    android:layout_width="match_parent" 
    android:layout_height="320dp" 
    android:orientation="horizontal" 
    app:layoutManager="android.support.v7.widget.LinearLayoutManager"/> 
<ScrollView 
    android:id="@+id/scrollview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="301.75dp" 
    android:paddingBottom="23.5dp" 
    android:clipChildren="false" 
    android:clipToPadding="false"> 

에게 있습니다

scrollView.setOnTouchListener(new View.OnTouchListener() { 

     float mDownX,mDownY; 
     boolean mIsSwiping,isDown; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(mIsSwiping){ 
       recyclerView.dispatchTouchEvent(event); 
      } 
      switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 
        mIsSwiping = false; 
        isDown = true; 
        mDownX = event.getX(); 
        mDownY = event.getY(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if(isDown){ 
         float deltaX = Math.abs(event.getX() - mDownX); 
         float deltaY = Math.abs(event.getY() - mDownY); 
         mDownX = event.getX(); 
         mDownY = event.getY(); 
         if(deltaX!=deltaY){ 
          isDown = false; 
          if(deltaX>deltaY){ 
           mIsSwiping = true; 
          } 
         } 
        } 
      } 

      return mIsSwiping; 
     } 
    }); 

도움이 될 수 있습니다. . .

관련 문제