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 小部件的性质。因此,解决方案包括在触发折叠动画后忽略触摸事件。

  1. 下面是折叠工具栏的方法,并创建了一个布尔实例变量 collapseTriggered,以保持折叠被触发的状态。

    public void collapseToolBar(){ 
        collapseTriggered = true; 
        app_bar.setExpanded(expanded, true); 
        tab_layout.setVisibility(View.GONE); 
    }
    
  2. 覆盖 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
    }
    
  3. 完成折叠动画后,将 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;
                }
            }
     });
    
  4. 当心 记住考虑 collapseTriggered[=40 的奇怪场景=] 设置为 true 后不会设置为 false。在这种情况下,可以忽略触摸事件,这可能会向用户发出应用已冻结的信号。在我的例子中,collapsedTriggered 被设置为 false 作为 onResume() 方法的一部分。