通过style实现从屏幕底下弹出dialog动画效果

来源:互联网 发布:ubuntu怎么看硬盘大小 编辑:程序博客网 时间:2024/05/22 08:13

在项目中,想实现这么一个dialog,以前都是在代码中实现动画,写dialog,感觉要写一大推,很麻烦,今天实现了一个通用的方法:效果图如下

这里写图片描述

第一步:首先自定义Dialog

public class SelfDefineDialogUtil extends Dialog implements View.OnClickListener {    public SelfDefineDialogUtil(Context context) {    //重点实现R.style.DialogStyle 动画效果        this(context, R.style.DialogStyle) ;        mContext = context ;    }    public SelfDefineDialogUtil(Context context, int themeResId) {        super(context, themeResId);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.category_dialog_layout);        WindowManager.LayoutParams params = getWindow().getAttributes();        //设置显示的位置        params.gravity = Gravity.TOP ;        //设置Y轴的距离        params.y = ViewUtil.dp2px(mContext,60) ;        //设置dialog的宽度        params.width = ViewUtil.getScreenWidthPixels(mContext) * 9 / 10;        //设置dialog的高度        params.height = ViewUtil.getScreenHeightPixels(mContext) * 1 / 2 ;        getWindow().setAttributes(params);    }}

第二步:实现 R.style.DialogStyle

<style name="DialogStyle" parent="@android:style/Theme.Dialog">        <item name="android:windowFrame">@null</item>        <item name="android:textColor">@null</item>        <item name="android:windowNoTitle">true</item>        <item name="android:layout_width">fill_parent</item>        <item name="android:windowIsFloating">true</item>        <item name="android:windowBackground">@drawable/panel_background</item>        <item name="android:windowContentOverlay">@null</item>        <item name="android:windowIsTranslucent">true</item>        <item name="android:backgroundDimAmount">0.3</item>        <item name="android:backgroundDimEnabled">true</item>        //动画效果        <item name="android:windowAnimationStyle">@style/MyAnimation</item>        <item name="android:textColorPrimary">#DD000000</item>        <item name="android:textColorSecondary">#8A000000</item>        <item name="android:textColorHint">#42000000</item>        <item name="android:windowCloseOnTouchOutside">false</item>    </style>//进入和退出的动画命名<style name="MyAnimation">        <item name="android:windowEnterAnimation">@anim/dialog_top_enter</item>        <item name="android:windowExitAnimation">@anim/dialog_top_exit</item>    </style>//具体的进入和退出动画//@anim/dialog_top_enter 进入动画<set xmlns:android="http://schemas.android.com/apk/res/android"     android:interpolator="@android:anim/decelerate_interpolator">    <!--减速度加速器-->    <translate        android:duration="250"        android:fromYDelta="100%"        android:toYDelta="0"/></set>// @anim/dialog_top_exit 退出动画<set xmlns:android="http://schemas.android.com/apk/res/android"     android:interpolator="@android:anim/accelerate_interpolator">    <!--加速度插值器-->    <translate        android:duration="250"        android:fromYDelta="0"        android:startOffset="100"        android:toYDelta="100%"/></set>

第三步:显示Dialog的位置
如第一步已经显示出来了

第四步:贴出ViewUtil工具类

/** * 常用单位转换的辅助类 */public class ViewUtil {    private ViewUtil() {        /** cannot be instantiated **/        throw new UnsupportedOperationException("cannot be instantiated");    }    private static int screenWidthPixels;    private static int screenHeightPixels;    /**     * dp转px     *     * @param context     * @param dpVal     * @return     */    public static int dp2px(Context context, float dpVal) {        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                dpVal, context.getResources().getDisplayMetrics());    }    /**     * sp转px     *     * @param context     * @param spVal     * @return     */    public static int sp2px(Context context, float spVal) {        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,                spVal, context.getResources().getDisplayMetrics());    }    /**     * px转dp     *     * @param context     * @param pxVal     * @return     */    public static float px2dp(Context context, float pxVal) {        final float scale = context.getResources().getDisplayMetrics().density;        return (pxVal / scale);    }    /**     * px转sp     *     * @param pxVal     * @param pxVal     * @return     */    public static float px2sp(Context context, float pxVal) {        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);    }    /**     * @param context     * @return     */    public static int getScreenWidthPixels(Context context) {        if (context == null) {            return 0;        }        if (screenWidthPixels > 0) {            return screenWidthPixels;        }        DisplayMetrics dm = new DisplayMetrics();        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        manager.getDefaultDisplay().getMetrics(dm);        screenWidthPixels = dm.widthPixels;        return screenWidthPixels;    }    /**     * @param context     * @return     */    public static int getScreenHeightPixels(Context context) {        if (context == null) {            return 0;        }        if (screenHeightPixels > 0) {            return screenHeightPixels;        }        DisplayMetrics dm = new DisplayMetrics();        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        manager.getDefaultDisplay().getMetrics(dm);        screenHeightPixels = dm.heightPixels;        return screenHeightPixels;    }}

以上,就是一整套,大家可以直接拿着用

阅读全文
0 0
原创粉丝点击