我的应用使用以下ViewPager
:
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
。
我不知道它为什么不起作用。
答案 0 :(得分:2)
行。我想这次我有。经过一些研究here和here,我得出了这个答案。我没有尝试使用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
}
});
希望这会起作用