MovableFloatingActionButton не получает onTouch при нахождении поверх AppBarLayout, который содержит CollapsingToolbarLayout - PullRequest
0 голосов
/ 29 марта 2019

Я использовал некоторый код, который нашел здесь, чтобы добавить MovableFloatingActionButton (этот объект расширяет FloatingActionButton, просто делает его подвижным) к моей MainActivity. MovableFloatingActionButton перемещается по экрану очень хорошо, включая область CollapsingToolbarLayout, но как только я освобождаю палец от экрана, а затем снова пытаюсь переместить FloatingActionButton, AppBarLayout начинает двигаться (в вертикальном направлении) вместо MovableFloatingActionButton в вертикальном направлении. Нет ли в AppBarLayout какого-либо флага, который бы указывал не принимать команды onTouch () от объектов, нависающих над ним?

Я использовал обходной путь AppBarLayout поведения.setDragCallback, чтобы AppBarLayout прекратил захват onTouch, но это не оптимально, потому что это отключает возможность касания AppBarLayout для прокрутки всего просмотра вверх и вниз. Внутри "layout / content_main" находится просто LinearLayout с RecyclerView, который показывает список под областью CollapsingToolbarLayout. Внутри CollapsingToolbarLayout находится LinearLayout из 8 вертикально сложенных TextView.

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

Итак, в конце я просто хочу иметь возможность перемещать свою MovableFloatingActionButton по всему экрану (область RecyclerView и область AppBarLayout) и по-прежнему иметь возможность прокручивать из AppBarLayout (область довольно большая, около 1 / От 3 до 1/4 экрана в зависимости от данных.

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2019

Итак, вот что я придумала, чтобы решить мою проблему:

Создан класс, который расширяет "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;
    }

}

Затем добавили строку ниже к AppBarLayout в activity_main.xml:

app:layout_behavior="com.codename.AppBarLayoutBehavior"

Напомним, что это позволило прикоснуться к AppBarLayout и позволить прокручивать самому себе и остальной части экрана и в то же время не брать на себя функции перетаскивания / касания моего наложенного MovableFloatingActionButton, если это было областью AppBarLayout. это было тронуто.

...