当包含CollapsingToolbarLayout的AppBarLayout顶部时,MovableFloatingActionButton不会收到onTouch

问题描述 投票:0回答:1

我使用了一些我在这里找到的代码来添加一个MovableFloatingActionButton(这个对象扩展了FloatingActionButton,只是让它可以移动)到我的MainActivity。 MovableFloatingActionButton在屏幕上移动很好,包括CollapsingToolbarLayout区域,但是一旦我从屏幕上释放手指然后再次尝试移动FloatingActionButton,AppBarLayout开始移动(垂直方向)而不是垂直方向上的MovableFloatingActionButton。 AppBarLayout中是否有一些标志告诉它不要从悬停在它上面的对象接管onTouch()命令?

我已经使用了AppBarLayout behavior.setDragCallback解决方法使AppBarLayout停止接管onTouch但不是最佳的,因为这会禁用触摸AppBarLayout以上下滚动整个View的能力。 “layout / content_main”内部只是一个LinearLayout,其RecyclerView显示了CollapsingToolbarLayout区域下方的List。在CollapsingToolbarLayout内部是一个8个垂直堆叠的TextViews的LinearLayout。

activity_main.xml
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="HardcodedText"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        >
        <!--app:layout_behavior="com.ktoonsez.golfclubtracker.FixedAppBarLayoutBehavior"
        app:layout_collapseMode="parallax"-->

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary">

            <!--<ImageView
                android:src="@drawable/background_sky"
                android:id="@+id/imageView"
                android:layout_width="match_parent"
                android:layout_height="156dp"
                android:scaleType="centerCrop"
                />-->

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <com.ktoonsez.golfclubtracker.MovableFloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_menu_mylocation" />

</android.support.design.widget.CoordinatorLayout>

我用来覆盖垂直拖动的示例


        appBarLayout = findViewById(R.id.appBarLayout);

        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
        params.setBehavior(new AppBarLayout.Behavior());
        //params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
        AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
        behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
            @Override
            public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
                return false; //Globals.AppBarLayoutCanDrag;
            }
        });

所以最后我只想在整个屏幕(RecyclerView区域和AppBarLayout区域)周围移动我的MovableFloatingActionButton,并且仍然可以从AppBarLayout滚动(该区域相当大,约为1/3到1) / 4屏幕取决于数据。

谢谢

android floating-action-button android-collapsingtoolbarlayout android-appbarlayout
1个回答
0
投票

所以这就是我想出来解决我的问题:

创建了一个扩展“AppBarLayout.Behavior”的类。关键是覆盖onInterceptTouchEvent()函数并返回false。

public class AppBarLayoutBehavior extends AppBarLayout.Behavior {

    public AppBarLayoutBehavior() {
        super();
    }

    public AppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
        return false;
    }

}

然后将以下行添加到activity_main.xml中的AppBarLayout:

app:layout_behavior="com.codename.AppBarLayoutBehavior"

回顾一下,这允许触摸AppBarLayout并允许自己和屏幕的其余部分滚动,同时不接管我覆盖的MovableFloatingActionButton的拖动/触摸功能,如果这是被触摸的AppBarLayout的区域。

© www.soinside.com 2019 - 2024. All rights reserved.