检测相对布局上的水平滑动,并在没有拦截的情况下正确处理relativelayout上的滚动事件

时间:2014-08-23 13:43:11

标签: android touch scrollview gesture-recognition swipe-gesture

我是Android开发的新手,我一直坚持以下问题。我一直在努力工作几天而无法找到解决方案。在这个问题中,我正在解释我已经采取了哪些步骤来实施。请查看我的程序,并建议一个解决方案或即兴创作或另一种方法来处理这个问题。

我想设计一个分为三个部分的屏幕。我的屏幕结构如下:

整个屏幕的父布局是Scroll-View。布局文件的粗略结构是:

    <ScrollView>

           <!-- Other Views (Part: 1) -->           

     <RelativeLayout>        

       <!-- Part 2 -->
        <LinearLayout android:orientation = "vertical">

            <LinearLayout android:orientation = "horizontal">
                   <Button1 /> <Button1 /> </Button3>
            </LinearLayout> 

            <LinearLayout android:orientation = "horizontal">
                   <Button4 /> <Button5 /> </Button6>  
            </LinearLayout>

        </LinearLayout>  

       <ImageView>

     </RelativeLayout>

          <!--Other Views (Part 3) -->

    </ScrollView>

感兴趣的部分是相对布局的中间部分。我想要的东西 实施是:

  1. 我想检测此RelativeLayout上的滑动。因此,每次向左或向左滑动   我更新了这些按钮上的图像和文本。

  2. 我希望能够从屏幕上的任何位置滚动屏幕。

  3. 可以点击按钮。

  4. 现在让我告诉你我做了什么以及我面临的问题。为了检测相对布局上的滑动,我在相对布局上设置了onTouchListener。重写的onTouch方法是:

     public boolean onTouch(View v, MotionEvent event) {
    
    
        scrollview.requestDisallowInterceptTouchEvent(true);
    
    
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                downX = event.getX();
                downY = event.getY();
                return true;
            }
    
    
            case MotionEvent.ACTION_UP: {   
                if(v instanceof Button){
                    v.performClick();
                }
    
                upX = event.getX();
                upY = event.getY();
    
                float deltaX = downX - upX;
                float deltaY = downY - upY;
    
                // swipe horizontal?
                if (Math.abs(deltaX) > MIN_DISTANCE) {
                    // left or right
                    if (deltaX < 0) {
    
                        this.onLeftToRightSwipe();
                        return true;
                    }
                    if (deltaX > 0) {
    
                        this.onRightToLeftSwipe();
                        return true;
                    }
                } 
    
    
            }
            }
            return false;
        }
    

    因为按钮占据了相对布局的所有空间,所以我必须设置此监听器 所有内部线性布局和按钮。要检测按钮单击并禁止滚动视图截取,我必须包含scrollview.requestDisallowInterceptTouchEvent(true)。 但问题是,现在我无法滚动此相对布局。 滑动和按钮单击操作完全正常,但现在它没有检测到滚动。

    如果我删除scrollview.requestDisallowInterceptTouchEvent(true),则会检测到滚动,但滑动不会。这给用户带来了非常糟糕的体验,并且总体上给出了我向所有人展示应用程序的负面反馈。 所以我想要的是,用户应该能够从屏幕的任何一点滚动,他应该能够在相对布局上滑动,也可以点击按钮。

    请帮忙!可能的解决方案是否可以:

    1)实现simpleOnGesture Listener或Detector?覆盖投掷事件?请提供有价值且有用的指示。

1 个答案:

答案 0 :(得分:1)

我建议您使用ViewPager来完成此任务。您可以从以下链接了解有关ViewPagers的更多信息:http://developer.android.com/training/animation/screen-slide.html

网站上还有一个示例代码,您可以看到它是如何工作的。它允许您滑动页面并在每页中向下滚动。

所以main.xml文件如下所示:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> 

fragment.xml文件如下所示:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView android:id="@android:id/text1"
        style="?android:textAppearanceLarge"
        android:textStyle="bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp" />

    <TextView style="?android:textAppearanceMedium"
        android:lineSpacingMultiplier="1.2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/lorem_ipsum" />

</LinearLayout>

</ScrollView>