2

我的应用的触摸区域使用下列ViewPager来扩展ViewPager

Screenshot

ViewPager的具有相同的宽度显示。

我添加利润率的ViewPager在XML中,这样我可以看到左(蓝色)和右(灰色)页面。 因此,一切正常,但我只能触摸到绿色区域来移动页面。

我想扩大触摸区域到整个屏幕,以便我能够随时随地触及到移动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的文档。

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

回答

1

确定。我想我这次有。经过一些研究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. 

我已经测试过它,这对我来说是这样。希望对你有效。

+0

天才!爱你:) – Appyx

+0

它肯定有帮助,如果我读完整个问题:) – Gary99

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 
     } 
    }); 

希望这将工作

+0

xml为touchareaview? – Appyx

+0

验证您的布局@Appyx –

+0

我在我的FrameLayout中添加了您的xml。我将onTouchListener添加到了我的FrameLayout。不用找了。 – Appyx