android 動畫效果 translate 詳解,包括 Dialog 上方彈出,底部彈出,中間彈出
先給出動畫效果程式碼,可以直接拿去用:
1.上方彈出:
滑入動畫( actionsheet_dialog_in):
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="-100%"
android:toYDelta="0" />
滑出動畫(actionsheet_dialog_out):
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="0"
android:toYDelta="-100%" />
2.底部彈出:
滑入動畫:
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="100%"
android:toYDelta="0" />
滑出動畫:
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="0"
android:toYDelta="100%" />
以上是動畫效果,下面是解析:
1.首先了解下手機螢幕的座標系,左上角為原點(如下圖),往右是 X 軸正方向,往下是 Y 軸正方向;
2.其次瞭解 translate 的內部三個屬性:
fromXDelta , fromYDelta 起始時 X ,Y 座標,螢幕右下角的座標是 X : 320 ,Y : 480
toXDelta ,toYDelta 動畫結束時 X , Y 的座標
duration 是動畫的時間,單位為毫秒
在這些屬性裡面還可以加上%和p,例如:
android:toXDelta="100%",表示自身的100%,也就是從View自己的位置開始。
android:toXDelta="80%p",表示父層View的80%,是以它父層View為參照的。
到此為止, 對translate應該有簡單的瞭解並且可以寫出一些簡單的動畫效果。下面給出三種動畫效果應用到 dialog 的 style 中的程式碼:
<!--位於上方劃出dialog的背景-->
<style name="DialogStyle" parent="@android:style/Theme.Dialog">
<!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 浮於Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 邊框 -->
<item name="android:windowFrame">@null</item>
<!-- Dialog以外的區域模糊效果 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 無標題 -->
<item name="android:windowNoTitle">true</item>
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!--點選dialog以外區域關閉彈窗-->
<item name="android:windowCloseOnTouchOutside">false</item>
<!-- Dialog進入及退出動畫 -->
<item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
</style>
<!-- ActionSheet進出動畫 -->
<style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
<item name="android:windowEnterAnimation">@anim/actionsheet_dialog_in</item>
<item name="android:windowExitAnimation">@anim/actionsheet_dialog_out</item>
</style>
actionsheet_dialog_in 和 actionsheet_dialog_out 分別為劃入劃出的動畫效果,裡面改為自己想要的動畫樣式即可,
不加動畫效果是預設為從中間彈出;
下面是自定義dialog的程式碼(直接在 onCreateView 方法中呼叫即可,從上方彈出為 wlp.gravity = Gravity.TOP;
從下方彈出改為 wlp.gravity = Gravity.BOTTOM; 從中間彈出改為 wlp.gravity = Gravity.CENTER; )
private Dialog dialog;
private View inflate;
...(中間無關程式碼省略)
//自定義dialog
private void showDialog() {
dialog = new Dialog(getActivity(),R.style.DialogStyle);
inflate = LayoutInflater.from(getActivity()).inflate(R.layout.show_dialog,null);
//彈窗點選周圍空白處彈出層自動消失彈窗消失(false時為點選周圍空白處彈出層不自動消失)
dialog.setCanceledOnTouchOutside(true);
dialog.setContentView(inflate);
Window window = dialog.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.TOP;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(wlp);
dialog.show();//顯示dialog
}
更多好內容戳下面: