1

ストーリーが短いため、カスタムビューをスナックバーと同じように上下に動かしたときに浮動アクションボタンを上下に移動できますか?カスタムポップアップがアニメーション化されたときにコーディネーターレイアウトを使用してフローティングアクションボタンを移動する

私は、スナーバーが表示されたときに上に移動するコーディネーターレイアウトにフローティングアクションボタンを持っています。私はFABの "Behavior"をチュートリアルでカスタマイズして上下に動かすのではなく、縮小して成長させることさえできました。

また、ボタンを押したときにボトムアップして戻ってくるカスタムポップアップ(LinearLayout)もあります。現在は移動していないフローティングアクションボタンの後ろにポップアップしています。両方ともCoordinatorLayoutにありますカスタム・ポップアップが上下に動くと浮動アクション・ボタンが上下に動くようにしたいと思います。スナックバーの場合と同じように。

FloatingActionButtonビヘイビアークラスのlayoutDependsOnメソッドの呼び出しに依存するカスタムポップアップを追加することで、それを動作させることができました。しかし、私の実装では、onDependentViewChangedメソッドを実際にFABを上下にアニメーション化するには、カスタムポップアップアニメーションと一致するようにコーディネートされたアニメーションと浮動アクションボタンを別々にアニメーション化する必要があります。

これをより簡単に、より簡単に行う方法を教えてもらえますか?

私は意味のあるコードスニペットを提供しようとするでしょう

....

カスタムポップアップ:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="bottom" 
android:id="@+id/selected_item_popup_linear_layout" 
android:elevation="4dp" 
android:visibility="gone" 
> 

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/selectedItemPopupBackground" android:elevation="4dp" 
    android:id="@+id/selected_item_popup_content"> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/selected_item_popup_delete_button" 
     android:layout_gravity="center" 
     android:padding="14dp" 
     android:src="@drawable/ic_delete_black_24dp" 
     android:background="@color/selectedItemPopupBackground" 
     android:tint="@color/selectedItemPopupDeleteTint" 
     /> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/selected_item_popup_edit_button" 
     android:layout_gravity="center" 
     android:padding="14dp" 
     android:src="@drawable/ic_mode_edit_black_24dp" 
     android:background="@color/selectedItemPopupBackground" 
     android:tint="@color/selectedItemPopupEditTint"/> 

</LinearLayout> 

フローティングアクションボタン:

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/floating_action_button_add_item" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_add_white_24dp" 
    android:visibility="visible" 
    android:layout_marginBottom="@dimen/fab_margin_bottom" 
    android:layout_marginRight="@dimen/fab_margin_right" 
    app:layout_anchor="@id/pager" 
    app:layout_anchorGravity="bottom|right|end" 
    app:layout_behavior=".FloatingActionButtonBehaviour" 
    app:rippleColor="@color/boardItemBackgroundSelected"/> 

フローティングアクションボタンの動作:

public class FloatingActionButtonBehaviour extends CoordinatorLayout.Behavior<FloatingActionButton> { 

    private Context mContext; 

    public FloatingActionButtonBehaviour(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { 

     if (dependency.equals(parent.findViewById(R.id.selected_item_popup_linear_layout))) { 
      return true; 
     } 

     if (dependency instanceof Snackbar.SnackbarLayout) { 
      return true; 
     } 

     return false; 
    } 


    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, final FloatingActionButton child, View dependency) { 

     if(dependency instanceof Snackbar.SnackbarLayout) { 

      float translationY = getFabTranslationYForSnackbar(parent, child); 
      float percentComplete = -translationY/dependency.getHeight(); 
      float scaleFactor = 1 - percentComplete; 

      child.setScaleX(scaleFactor); 
      child.setScaleY(scaleFactor); 
     } 

     if (dependency.equals(parent.findViewById(R.id.selected_item_popup_linear_layout))) { 

      View contentView = dependency.findViewById(R.id.selected_item_popup_content); 
      int contentViewHeight = contentView.getHeight(); 

      if (dependency.getVisibility() == View.VISIBLE) { 

       Animation bottomUp = AnimationUtils.loadAnimation(mContext, R.anim.fab_move_up); 
       child.startAnimation(bottomUp); 
       child.setVisibility(View.VISIBLE); 
       float translationY = Math.min(0, dependency.getTranslationY() - contentViewHeight); 
       child.setTranslationY(translationY); 

      } else { 

       Animation bottomDown = AnimationUtils.loadAnimation(mContext, R.anim.fab_move_down); 
       child.startAnimation(bottomDown); 
       child.setVisibility(View.VISIBLE); 
       child.setTranslationY(dependency.getTranslationY()); 
      } 

     } 

     return true; 

    } 

    private float getFabTranslationYForSnackbar(CoordinatorLayout parent, FloatingActionButton fab) { 
     float minOffset = 0; 
     final List<View> dependencies = parent.getDependencies(fab); 
     for (int i = 0, z = dependencies.size(); i < z; i++) { 
      final View view = dependencies.get(i); 
      if (view instanceof Snackbar.SnackbarLayout && parent.doViewsOverlap(fab, view)) { 
       minOffset = Math.min(minOffset, ViewCompat.getTranslationY(view) - view.getHeight()); 
      } 
     } 

     return minOffset; 
    } 
} 

コードは、カスタムポップアップアニメーション化:私はBottomSheets/ModalSheetsで私の答えを見つけたと思う

 Animation bottomUp = AnimationUtils.loadAnimation(mActivity, R.anim.bottom_up); 
    final ViewGroup selectedItemPopupLinearLayout = (ViewGroup)mActivity.findViewById(R.id.selected_item_popup_linear_layout); 
    selectedItemPopupLinearLayout.startAnimation(bottomUp); 
    selectedItemPopupLinearLayout.setVisibility(View.VISIBLE); 

答えて

関連する問題