2012-06-19 2 views
0

У меня есть макет, где у меня есть ScrollView и некоторые вещи. Он выглядит так:Как отключить ScrollView

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/welcome_scrol_lay" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    android:background="@drawable/bg"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:background="@drawable/bg" 
     android:weightSum="100" > 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="250dp" 
      android:orientation="vertical" 
      android:weightSum="100" 
      android:background="@drawable/specialmapholder"> 
      <android.support.v4.view.ViewPager 
       android:id="@+id/welcomeViewPager" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_marginTop="15dp" 
       android:layout_marginLeft="15dp" 
       android:layout_marginRight="15dp" 
       android:layout_weight="90" 
       android:clickable="true" /> 
      <LinearLayout 
       android:id="@+id/welcome_indicatorLayout" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="10" 
       android:gravity="center" > 
      </LinearLayout> 
     </LinearLayout> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="50" 
      android:orientation="vertical"> 
      <TextView 
       android:id="@+id/welcome_header" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="15dp" 
       android:layout_marginLeft="20dp" 
       android:layout_marginRight="20dp" 
       android:text="Large Text" 
       android:textColor="@color/white" 
       android:textStyle="bold" 
       android:textSize="26dp" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
      <TextView 
       android:id="@+id/welcome_body" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="20dp" 
       android:layout_marginRight="20dp" 
       android:text="Medium Text" 
       android:textColor="@color/white" 
       android:textSize="14dp" 
       android:textStyle="bold" 
       android:layout_marginTop="20dp" 
       android:textAppearance="?android:attr/textAppearanceMedium" /> 
     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

Как вы можете видеть, у меня есть Viewpager в ScrollView. Я хочу отключить прокрутку, когда я касаюсь ViewPager, потому что когда я хочу изменить страницу с картинкой, прокручивается. Как отключить функцию прокрутки, когда я касаюсь ViewPager?

ответ

3

В Android, родители могут потреблять TouchEvents ребенка. В этом случае ScrollView потребляет TouchEvents вашего компонента ViewPager. Чтобы избежать такого поведения, платформа Android обеспечивает onInterceptTouchEvent (MotionEvent).

В вашем случае вам необходимо подклассировать ScrollView и изменить метод onInterceptTouchEvent (MotionEvent). Вы должны изменить onInterceptTouchEvent (MotionEvent), чтобы ScrollView потреблял событие дочернего элемента только тогда, когда пользователь прокручивает ScrollView по вертикали.

пример реализации для ListView:

public class VerticalListView extends ListView { 

private float mLastX; 
private float mLastY; 
private float mDiffX; 
private float mDiffY; 

public VerticalListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public VerticalListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public VerticalListView(Context context) { 
    super(context); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // reset difference values 
      mDiffX = 0; 
      mDiffY = 0; 

      mLastX = ev.getX(); 
      mLastY = ev.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      mDiffX += Math.abs(curX - mLastX); 
      mDiffY += Math.abs(curY - mLastY); 
      mLastX = curX; 
      mLastY = curY; 

      // don't intercept event, when user tries to scroll horizontally 
      if (mDiffX > mDiffY) { 
       return false; 
      } 
    } 

    return super.onInterceptTouchEvent(ev); 
} 

}

+0

Спасибо. Отлично работает :) – user1302569

+0

рад, что я мог бы вам помочь :) – AZ13

+0

Я не получаю этот метод onInterceptTouchEvent в классе, который распространяется с классом View .. может кто-нибудь помочь? – djk

0
// Get the ScrollView 
final ScrollView myScroll = (ScrollView) findViewById(R.id.welcome_scrol_lay); 


// Disable Scrolling by setting up an OnTouchListener to do nothing 
    myScroll.setOnTouchListener(new OnTouchListener(){ 

     public boolean onTouch(View v, MotionEvent event) { 
      return true; 
     } 
    }); 


// Enable Scrolling by removing the OnTouchListner 
    tvDisplayScroll.setOnTouchListener(null); ` 

Но проблема, это может полностью отменить эффект Scroll

Смежные вопросы