CollapsingToolBarLayout 动画停止
CollapsingToolBarLayout Animation Stops
有没有办法禁止 CollapsingToolBarLayout 的动画中断?
我们有一个带有图像的折叠工具栏,我们通过调用方法以编程方式将其与动画一起折叠
app_bar.setExpanded(假,真)
在封闭的 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);
欢迎任何帮助、技巧或提示。
提前谢谢你。
我能够解决一些问题,我将解决方案发布在这里。希望对某人有用。
问题的根源在于始终响应触摸事件的 CollapsingToolBarLayout 小部件的性质。因此,解决方案包括在触发折叠动画后忽略触摸事件。
下面是折叠工具栏的方法,并创建了一个布尔实例变量 collapseTriggered,以保持折叠被触发的状态。
public void collapseToolBar(){
collapseTriggered = true;
app_bar.setExpanded(expanded, true);
tab_layout.setVisibility(View.GONE);
}
覆盖 activity 中的触摸事件侦听器。这是至关重要的,这样动画就不会在触摸 event.The 的情况下在执行过程中中断。有问题的方法是 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[=40 的奇怪场景=] 设置为 true 后不会设置为 false。在这种情况下,可以忽略触摸事件,这可能会向用户发出应用已冻结的信号。在我的例子中,collapsedTriggered 被设置为 false 作为 onResume() 方法的一部分。
有没有办法禁止 CollapsingToolBarLayout 的动画中断?
我们有一个带有图像的折叠工具栏,我们通过调用方法以编程方式将其与动画一起折叠 app_bar.setExpanded(假,真) 在封闭的 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);
欢迎任何帮助、技巧或提示。
提前谢谢你。
我能够解决一些问题,我将解决方案发布在这里。希望对某人有用。
问题的根源在于始终响应触摸事件的 CollapsingToolBarLayout 小部件的性质。因此,解决方案包括在触发折叠动画后忽略触摸事件。
下面是折叠工具栏的方法,并创建了一个布尔实例变量 collapseTriggered,以保持折叠被触发的状态。
public void collapseToolBar(){ collapseTriggered = true; app_bar.setExpanded(expanded, true); tab_layout.setVisibility(View.GONE); }
覆盖 activity 中的触摸事件侦听器。这是至关重要的,这样动画就不会在触摸 event.The 的情况下在执行过程中中断。有问题的方法是 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[=40 的奇怪场景=] 设置为 true 后不会设置为 false。在这种情况下,可以忽略触摸事件,这可能会向用户发出应用已冻结的信号。在我的例子中,collapsedTriggered 被设置为 false 作为 onResume() 方法的一部分。