扩展ViewPager的触摸区域

时间:2017-07-29 19:34:07

标签: android android-layout android-viewpager touch android-view

我的应用使用以下ViewPager

Screenshot

ViewPager与展示广告的宽度相同。

我在xml中为ViewPager添加了边距,这样我就可以看到左(蓝色)和右(灰色)页面。 结果一切正常,但我只能触摸绿色区域来移动页面。

我想将触摸区域扩展到整个屏幕,以便我可以触摸任何地方移动ViewPager

我尝试添加TouchDelegate

binding.pagerContainer.post {
        val rect = Rect()  
        binding.touchArea.getHitRect(rect)
        binding.pagerContainer.touchDelegate = TouchDelegate(rect, binding.viewPager)
    }

在xml中:

 <FrameLayout
        android:id="@+id/pager_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:clipChildren="false">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginBottom="150dp"
            android:layout_marginLeft="70dp"
            android:layout_marginRight="70dp"
            android:layout_marginTop="150dp"
            android:clipChildren="false"/>

        <View
            android:id="@+id/touchArea"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0">
        </View>
    </FrameLayout>

Rect的大小正确。 我发布了一个Runnable以确保这些视图的布局。 我阅读了TouchDelegate

的文档

我不知道它为什么不起作用。

2 个答案:

答案 0 :(得分:2)

行。我想这次我有。经过一些研究herehere,我得出了这个答案。我没有尝试使用TouchDelegate扩展ViewPager的区域,而是将触摸事件从FrameLayout重新路由到ViewPager。 1,制作自己的FrameLayout

public class MyFrameLayout extends FrameLayout {

    // make sure to include all the necessary constructors here
    // with calls to super

    // only need to override 1 method
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        ViewPager pager = null;
        int count = getChildCount();
        for(int i=0; i<count; i++) {
            if(getChildAt(i) instanceof ViewPager) {
                pager = (ViewPager)getChildAt(i);
                break;
            }
        }
        if(pager != null) {
            return pager.onTouchEvent(event);
        }
        return super.onTouchEvent(event);
    }
}

如果您知道ViewPager将始终位于FrameLayout中的相同位置,则onTouchEvent()可以简化为

    ViewPager pager = (ViewPager)getChildAt(0); 
    return pager.onTouchEvent(event);

然后在布局文件中使用自定义FrameLayout

 <your.package.name.MyFrameLayout
    android:id="@+id/pager_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    etc. etc.

我已经对它进行了测试,这对我来说也是如此。希望它适合你。

答案 1 :(得分:1)

在yourlayout.xml中添加以下行:

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

试试这个块:

YOURActivityLayout.setOnTouchListener(new View.OnTouchListener() {  
        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {

            return true;//always return true 
        }
    });

希望这会起作用