dialog的弹出动画(最关键的是坐标系)

    dialog的弹出动画设置(本例实现的效果是从屏幕的下方进入,然后再退出)

准备工作

     1.在style文件里面新建一个style

<style name="dialogWithShare" mce_bogus="1" parent="android:Animation">
    <item name="android:windowEnterAnimation">@anim/share_in</item>
    <item name="android:windowExitAnimation">@anim/share_out</item>
</style>

    2.分别新建share_in,share_out动画文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="400"
        android:fillAfter="true"//是否让动画完成后停留在结束位置
        android:fromXDelta="0"
        android:toXDelta="0.0"
        android:fromYDelta="800"
        android:toYDelta="0.0" //这里需要特别注意,0.0代表你的dialog显示的位置,如果你的dialog显示位置是在屏幕的最中央,那这个0.0就是以屏幕的最中央为原点,在衍生出整个animation的坐标系,同理适用于其他的位置。
        />
</set>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="0.0"
        android:toXDelta="0.0"
        android:fromYDelta="0.0"
        android:toYDelta="800"
        android:fillAfter="true"
        android:duration="400"/>
</set>

    3.自定义dialog

class ShareDialog extends Dialog{

    private double wPercent;
    private double yPercent;
    
    public ShareDialog(Context context) {
        super(context);
    }

    public ShareDialog(Context context, int theme,double wPercent,double yPercent) {
        super(context, theme);
        this.wPercent = wPercent;
        this.yPercent = yPercent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.dialog_share);

        Window window = getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = (int) (window.getWindowManager().getDefaultDisplay().getWidth() * wPercent);
        params.height = (int) (window.getWindowManager().getDefaultDisplay().getHeight() * yPercent);
        window.setAttributes(params);

    }

    public void showDialog(int x, int y) {
        windowDeploy(x, y);
        setCanceledOnTouchOutside(true);  // 设置触摸对话框意外的地方取消对话框
        show();
    }

    // 设置窗口显示(此处的x,y就是定位坐标原点)
    public void windowDeploy(int x, int y) {
        Window window = getWindow();
        window.setWindowAnimations(R.style.dialogWithShare);//这里设置动画
        window.setBackgroundDrawableResource(R.color.white);
        WindowManager.LayoutParams wl = window.getAttributes();
        wl.x = x;
        wl.y = y;
        window.setAttributes(wl);

    }

}

    然后就调用就好啦

    

//弹出分享列表
public void clickToShare(){

    Window window = getWindow();
    int fromXValue = (int) (window.getWindowManager().getDefaultDisplay() .getWidth() );
    int toYDelta = (int) (window.getWindowManager().getDefaultDisplay() .getHeight() );//大家应该可以看出这里的坐标原点是屏幕的最下方。

    shareDialog = new ShareDialog(this, R.style.notifyDialog,1,0.15);//这里的1 和 0.15是我的dialog分别对于整个屏幕的宽高比例
    shareDialog.showDialog(fromXValue, toYDelta);

}

是不是很简单!!!!但是!!!我就是因为坐标原点所以位置研究了半天!!!!妈蛋啊!!!!相比较而言我还是更喜欢xml定义动画,这样更加直观,也让代码更加规范。

坐标原点的定义大家一定要记住!!!!是!!!根据!!!你的!!dialog!!!最终展示的位置确定的!!!!!不是屏幕的中心点!!也不是屏幕的左上角!!!!网上找的文章什么都不说!!!!说的清楚一点要死啊!!!!

你可能感兴趣的:(dialog的弹出动画(最关键的是坐标系))