1. 程式人生 > >android自定義帶入場出場動畫dialog

android自定義帶入場出場動畫dialog

先上效果圖

res資料夾下建一個anim資料夾,然後anim資料夾下建這倆xml:dialog_in.xml和dialog_out.xml

dialog_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true"
android:shareInterpolator="true"
android:interpolator="@android:anim/accelerate_interpolator"
> <!--anim/accelerate_interpolator加速度變化--> <!--android:interpolator="@android:anim/accelerate_interpolator"插值器必須在set的節點裡設--> <!--大小變化--> <scale android:fromXScale="1.0" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" android:pivotX="0%" android:pivotY="100%"
android:duration="1000"/> </set>
dialog_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true"
android:shareInterpolator="true"
android:interpolator="@android:anim/bounce_interpolator"
> <!--@android:anim/bounce_interpolator回彈效果--> <!--fillBefore是指動畫結束時畫面停留在第一幀,fillAfter是指動畫結束是畫面停留在最後一幀。--> <!--最關鍵的問題是這2個引數不能在</alpha>,</scale>,</translate>,</rotate>中設定,這是沒有用的,必須--> <!--在動畫xml檔案的</set>節點中設定--> <!--大小變化--> <scale android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.0" android:toYScale="0.0" /> </set>

value資料夾下styles.xml裡面加上倆:

<!--dialog的背景屬性-->
<style name="MyReasonDialog" parent="android:style/Theme.Dialog">
<!--背景顏色及和透明程度-->
<item name="android:windowBackground">@color/bantouming</item>
<!--是否去除標題 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除邊框-->
<item name="android:windowFrame">@null</item>
<!--是否浮現在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊-->
<item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>
<!--動畫的style-->
<style name="MyReasonDialogAnim" parent="android:Animation" mce_bogus="1">
    <item name="android:windowEnterAnimation">@anim/dialog_in</item>
    <item name="android:windowExitAnimation">@anim/dialog_out</item>
</style>
color裡面加上一個半透明背景色:
<color name="bantouming">#0ef8fdf8</color>

接下來就是dialog的佈局:my_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
    <LinearLayout
android:layout_width="260dp"
android:layout_height="200dp"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="10dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@android:color/white"
>
        <LinearLayout
android:layout_width="match_parent"
android:layout_height="30dp"
android:orientation="horizontal">
            <TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="點選右邊小圖示退出"
android:gravity="center_vertical"/>
            <ImageView
android:id="@+id/exit_img"
android:layout_width="30dp"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"/>
        </LinearLayout>
        <ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"/>
        <Button
android:id="@+id/queding_btn"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="確定"/>
    </LinearLayout>
</RelativeLayout>
再就是重寫dialog類:MyDialog.class
/**
 * 自定義對話方塊
 */
public class MyDialog extends Dialog {
    private Button quedingBtn;                  //確定按鈕
private ImageView exitImg;                  //退出按鈕
    //介面的例項
private OnQudingListener qudingListener;    //確定監聽例項
private OnExitListener onExitListener;      //退出監聽例項
Context context;
    public MyDialog(Context context) {
        //關聯style
super(context, R.style.MyReasonDialog);
Window window = getWindow();
//設定動畫效果
window.setWindowAnimations(R.style.MyReasonDialogAnim);
        this.context = context;
}

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//關聯佈局樣式
setContentView(R.layout.my_dialog);
//按空白處不能取消動畫  
setCanceledOnTouchOutside(false);
setCancelable(false);
//初始化介面控制元件
initView();
//初始化介面資料  
initEvent();
}

    /**
     * 初始化介面控制元件的顯示資料
     */
private void initEvent() {
        quedingBtn.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                qudingListener.qudingclick();
}
        });
exitImg.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                onExitListener.exitclick();
}
        });
}

    /**
     * 確定例項賦值
     */
public void setquedingclickListener(OnQudingListener onQudingListener) {
        qudingListener = onQudingListener;
}

    /**
     * 退出例項賦值
     */
public void setexitListener(OnExitListener onExitListener) {
        this.onExitListener = onExitListener;
}

    /**
     * 初始化介面控制元件
     */
private void initView() {
        exitImg = (ImageView) findViewById(R.id.exit_img);
quedingBtn = (Button) findViewById(R.id.queding_btn);
}

    /**
     * 確定鈕介面
     */
public interface OnQudingListener {
        void qudingclick();
}

    /**
     * 退出鈕介面
     */
public interface OnExitListener {
        void exitclick();
}

}  

使用方法MainActivity中:
 final MyDialog myDialog=new MyDialog(MainActivity.this);
myDialog.setquedingclickListener(new MyDialog.OnQudingListener() {
            @Override
public void qudingclick() {
                Toast.makeText(MainActivity.this,"我最帥~~~",Toast.LENGTH_SHORT).show();
myDialog.dismiss();
}
        });
myDialog.setexitListener(new MyDialog.OnExitListener() {
            @Override
public void exitclick() {
                myDialog.dismiss();
}
        });
myDialog.show();
}
});
大功告成!!!