欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-31 16:49:39
...

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

通过style实现从屏幕底下弹出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;
    }
}

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