有没有办法禁用CollapsingToolBarLayout动画的中断?
我们有一个折叠工具栏,其中包含一个图像,我们通过调用方法以编程方式将动画与动画折叠 app_bar.setExpanded(false,true) 在封闭的AppBarLayout对象上。这是通过在触发 setExpanded(false,true)方法的按钮上附加onClickListener来完成的。
我们遇到的问题是,如果我们足够快地点击屏幕,动画会被中断。敲击可以在触发按钮上,该按钮包裹在去抖动器中;或者在屏幕上随时随地按一下按钮。发生这种情况时,图像视图会卡住,工具栏不会崩溃,也无法手动完成动画。需要按下后退按钮才能使视图进入原始状态。
以下是布局除外:
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="@dimen/rc_tab_elevation">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<TextView
android:id="@+id/image_placeholder_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<ImageView
android:id="@+id/image_pic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:clickable="false"/>
</FrameLayout>
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
style="@style/Tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
在fragment.java子类中调用的侦听器的摘录代码:
app_bar.setExpanded(expanded, true);
tab_layout.setVisibility(View.GONE);
欢迎任何帮助,提示或提示。
提前谢谢。
答案 0 :(得分:0)
我能够解决问题,我在这里发布解决方案。希望它对某人有用。
问题的根源是CollapsingToolBarLayout小部件的性质,它始终响应触摸事件。因此,解决方案包括一旦触发折叠动画就忽略触摸事件。
下面是折叠工具栏的方法,并创建一个布尔实例变量 collapseTriggered ,以保持触发折叠的状态。
public void collapseToolBar(){
collapseTriggered = true;
app_bar.setExpanded(expanded, true);
tab_layout.setVisibility(View.GONE);
}
覆盖活动中的触摸事件侦听器。这是至关重要的,以便在触摸事件的情况下动画不会在执行中被中断。所讨论的方法是 dispatchTouchEvent(MovtionEvent)。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if( collapseTriggered == true){
return true; //if collapsed is triggered ignore all touch events
}
return super.disptachTouchEvent(ev); //otherwise, dispatch as usual
}
完成折叠动画后,将 collapseTriggered 变量更改为false。这是必需的,以便在完成折叠动画后可以恢复触摸事件的常规处理 - - 换句话说,一旦工具栏完全折叠。为此,将onOffSetListener()添加到工具栏中,并检测工具栏何时完全拼写错误。
private void addFullyCollapsedListener() {
app_bar.addOnOffSetChangedListener(
new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) {
showMapSelected = false;
}
}
});
提防请记住在设置为 collapseTriggered 后设置为false的奇怪场景真正。在这种情况下,触摸事件可以被忽略,这可能会向用户发出应用已冻结的信号。就我而言,collapsedTriggered设置为 false ,作为 onResume()方法的一部分。