2014-01-25 44 views
4

在Android中,是否可以在layout_gravity上應用動畫?例如假設我想從右邊改變的View(例如Button)的layout_gravity向左動畫layout_gravity

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Button" 
     android:id="@+id/button" 
     android:layout_gravity="right|top" /> 
</FrameLayout> 

在欲佈局重力在運行時與動畫改變從right|topleft|top上述佈局文件,是它有可能嗎?謝謝

回答

1

它不可能與layout_gravity屬性。您可以藉助翻譯動畫永久運行來獲得效果。

Animation animation = new TranslateAnimation(0, 500,0, 0); 
animation.setDuration(1000); 
animation.setFillAfter(true); 
myImage.startAnimation(animation); 

此代碼只會改變位置+500 X軸

5

您可以使用LayoutTransition父ViewGroup中,使其動畫更改子視圖,如佈局更改。在下面的示例中,我將屏幕右下角的浮動操作按鈕設置爲右上角,同時旋轉它(使'+'圖標變成'x'圖標)。

設置animateLayoutChanges爲true的含佈局:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/pnlFabContainer" 
    android:animateLayoutChanges="true" 
    android:clipChildren="false"> 

    <ExpandableListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white" 
     android:id="@+id/lstWhatever" 
     android:divider="@color/DividerDarkGrey" 
     android:dividerHeight="1dp" 
     android:choiceMode="singleChoice" 
     android:groupIndicator="@null" 
     android:padding="20dp"/> 

    <com.melnykov.fab.FloatingActionButton 
     android:id="@+id/fabMultiSelect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="24dp" 
     android:src="@drawable/button_plus" 
     android:scaleType="center" 
     fab:fab_type="normal" 
     fab:fab_colorNormal="@color/FloatingActionButton" 
     fab:fab_colorPressed="@color/FloatingActionButtonPressed" 
     fab:fab_colorRipple="@color/FloatingActionButtonRipple" /> 

</FrameLayout> 

使您的容器上的「改變」過渡:

FrameLayout pnlFabContainer = (FrameLayout)view.findViewById(R.id.pnlFabContainer); 
LayoutTransition transition = pnlFabContainer.getLayoutTransition(); 
transition.enableTransitionType(LayoutTransition.CHANGING); 

animateFabButton(fab); 

然後編程方式更改您的佈局重心 - 我也做同時旋轉的動畫:

protected void animateFabButton(FloatingActionButton fab) { 
    if (fab.isSelected()) { 
     FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams(); 
     layoutParams.gravity = Gravity.TOP | Gravity.END; 
     layoutParams.topMargin = -(fab.getMeasuredHeight()/2); 
     fab.setLayoutParams(layoutParams); 

     Animation rotate = new RotateAnimation(0, 45, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     rotate.setFillBefore(true); 
     rotate.setFillAfter(true); 
     rotate.setFillEnabled(true); 
     rotate.setDuration(750); 
     rotate.setRepeatCount(0); 
     rotate.setInterpolator(new LinearInterpolator()); 
     fab.startAnimation(rotate); 
    } 
    else { 
     FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams(); 
     layoutParams.gravity = Gravity.BOTTOM | Gravity.END; 
     layoutParams.topMargin = layoutParams.bottomMargin; 
     fab.setLayoutParams(layoutParams); 

     Animation rotate = new RotateAnimation(45, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     rotate.setFillBefore(true); 
     rotate.setFillAfter(true); 
     rotate.setFillEnabled(true); 
     rotate.setDuration(750); 
     rotate.setRepeatCount(0); 
     rotate.setInterpolator(new LinearInterpolator()); 
     fab.startAnimation(rotate); 
    } 
} 
+1

感謝Breeno,這完美的作品不僅在孩子觀看重力變化,也對容器重力變化 –

+0

謝謝。工作真棒 –

相關問題