CollapsingToolBarLayout动画停止

时间:2017-11-14 06:31:43

标签: android animation android-collapsingtoolbarlayout

有没有办法禁用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);

欢迎任何帮助,提示或提示。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我能够解决问题,我在这里发布解决方案。希望它对某人有用。

问题的根源是CollapsingToolBarLayout小部件的性质,它始终响应触摸事件。因此,解决方案包括一旦触发折叠动画就忽略触摸事件。

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

    public void collapseToolBar(){ 
        collapseTriggered = true; 
        app_bar.setExpanded(expanded, true); 
        tab_layout.setVisibility(View.GONE); 
    }
    
  2. 覆盖活动中的触摸事件侦听器。这是至关重要的,以便在触摸事件的情况下动画不会在执行中被中断。所讨论的方法是 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 后设置为false的奇怪场景真正。在这种情况下,触摸事件可以被忽略,这可能会向用户发出应用已冻结的信号。就我而言,collapsedTriggered设置为 false ,作为 onResume()方法的一部分。