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();
    }
});
大功告成!!!


版权声明:本文为chen_jiang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。