通过style实现从屏幕底下弹出dialog动画效果
程序员文章站
2022-05-31 16:49:39
...
在项目中,想实现这么一个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;
}
}
以上,就是一整套,大家可以直接拿着用
上一篇: 调侃职场和生活的俏皮雷语
下一篇: JQ 自定义弹出层