通过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

<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;
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值