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!!!最终展示的位置确定的!!!!!不是屏幕的中心点!!也不是屏幕的左上角!!!!网上找的文章什么都不说!!!!说的清楚一点要死啊!!!!