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

在项目中,想实现这么一个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



//进入和退出的动画命名

//具体的进入和退出动画
//@anim/dialog_top_enter 进入动画
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/decelerate_interpolator">
    --减速度加速器-->
    "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">
    --加速度插值器-->
    "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;
    }
}

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

你可能感兴趣的:(android常用控件)