我使用了一些我在这里找到的代码来添加一个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屏幕取决于数据。
谢谢
所以这就是我想出来解决我的问题:
创建了一个扩展“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的区域。