1. 程式人生 > >android 動畫效果 translate 詳解,包括 Dialog 上方彈出,底部彈出,中間彈出

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

    }

更多好內容戳下面: