user1302569
user1302569

Reputation: 7191

How disable ScrollView

I have a layout where I have a ScrollView and some stuffs. It looks like:

<?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>

As you can see I have a Viewpager in the ScrollView. I want to disable scroll when I touch ViewPager, because when I want to change picture page is scrolled. How can I disable the scroll function when I touch the ViewPager?

Upvotes: 0

Views: 2880

Answers (1)

AZ13
AZ13

Reputation: 14507

In Android, parents can consume child's TouchEvents. In this case, the ScrollView consumes the TouchEvents of your ViewPager component. To avoid this behaviour, Android framework provides the onInterceptTouchEvent(MotionEvent).

In your case, you have to subclass ScrollView and change the onInterceptTouchEvent(MotionEvent) method. You should change the onInterceptTouchEvent(MotionEvent), so that the ScrollView consumes the child's event only when the user scrolls the ScrollView vertically.

example implementation for 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);
}

}

Upvotes: 3

Related Questions