2017-11-14 11 views
0

CollapsingToolBarLayoutのアニメーションの中断を無効にする方法はありますか?CollapsingToolBarLayoutアニメーションが停止する

我々はプログラムで囲んAppBarLayoutオブジェクトに(真偽)メソッド app_bar.setExpanded を呼び出すことによって、アニメーションで崩壊している画像と崩壊ツールバーを持っています。これは、のsetExpanded(false、true)メソッドをトリガーするボタンにonClickListenerをアタッチして行います。

私たちが遭遇している問題は、画面を1度以上タップするとアニメーションが中断することです。タップは、デバウンサに包まれたトリガボタン上にあります。追加の時間は、画面上の一度に、またはどこでもボタン上に表示されます。それが起こると、イメージビューが停止し、ツールバーが崩壊することはなく、手動でアニメーションを完了することはできません。ビューを元の状態にするには、戻るボタンを押す必要があります。以下は

は、レイアウトの以外です:

<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

私は何かを働かせることができました。私はここで解決策を投稿しています。うまくいけば、それは誰かに役に立つだろう。

問題の根本は、常にtouchイベントに応答する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. 崩壊アニメーションが完了すると、falseにcollapseTriggered変数を変更します。これは、折りたたみアニメーションが完了した後、つまりツールバーが完全に折りたたまれた後で、タッチイベントの通常の処理を再開するために必要です。そのために、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がtrueに設定された後、falseに設定されません。このような場合、タッチイベントは無視され、アプリがフリーズしたことをユーザーに通知する可能性があります。私の場合、collapsedTriggeredはの偽に設定され、のonResume()メソッドの一部として設定されます。

関連する問題