前言

最近开发中用到许多对话框,之前都是在外面的代码中创建AlertDialog并设置自定义布局实现常见的对话框,诸如更新提示等含有取消和删除两个按钮的对话框我们可以通过代码创建一个AlertDialog并通过它暴露的一系列方法设置我们自定义的布局和style,但有时候系统的AlertDialog并不能实现更好的定制,这时,我们就想到了自定义Dialog。通过查看AlertDialog的类结构发现它也是继承于Dialog,于是我们也可以通过继承Dialog实现我们自定义的Dialog。这篇文章将介绍如何定制当今主流的对话框,先上效果图,给大家养养眼。

代码实现

1、编写自定义布局,dialog_loading.xml

android:orientation="vertical"

android:layout_width="match_parent"

android:gravity="center"

android:background="@drawable/bg_loading_dialog"

android:layout_height="match_parent">

android:id="@+id/iv_loading"

android:layout_width="wrap_content"

android:src="@mipmap/ic_dialog_loading"

android:layout_height="wrap_content"/>

android:id="@+id/tv_loading"

android:layout_width="wrap_content"

android:layout_marginTop="20dp"

android:text="@string/loading"

android:textSize="16sp"

android:textColor="@android:color/white"

android:layout_height="wrap_content"/>

2、继承Dialog,覆盖构造方法

public class LoadingDialog extends Dialog {

private static final String TAG = "LoadingDialog";

private String mMessage; // 加载中文字

private int mImageId; // 旋转图片id

private boolean mCancelable;

private RotateAnimation mRotateAnimation;

public LoadingDialog(@NonNull Context context,String message,int imageId) {

this(context,R.style.LoadingDialog,message,imageId,false);

}

public LoadingDialog(@NonNull Context context, int themeResId,String message,int imageId,boolean cancelable) {

super(context, themeResId);

mMessage = message;

mImageId = imageId;

mCancelable = cancelable;

}

}

3、覆盖onCreate(),初始化控件

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView();

}

private void initView() {

setContentView(R.layout.dialog_loading);

// 设置窗口大小

WindowManager windowManager = getWindow().getWindowManager();

int screenWidth = windowManager.getDefaultDisplay().getWidth();

WindowManager.LayoutParams attributes = getWindow().getAttributes();

// 设置窗口背景透明度

attributes.alpha = 0.3f;

// 设置窗口宽高为屏幕的三分之一(为了更好地适配,请别直接写死)

attributes.width = screenWidth/3;

attributes.height = attributes.width;

getWindow().setAttributes(attributes);

setCancelable(mCancelable);

TextView tv_loading = findViewById(R.id.tv_loading);

ImageView iv_loading = findViewById(R.id.iv_loading);

tv_loading.setText(mMessage);

iv_loading.setImageResource(mImageId);

// 先对imageView进行测量,以便拿到它的宽高(否则getMeasuredWidth为0)

iv_loading.measure(0,0);

// 设置选择动画

mRotateAnimation = new RotateAnimation(0,360,iv_loading.getMeasuredWidth()/2,iv_loading.getMeasuredHeight()/2);

mRotateAnimation.setInterpolator(new LinearInterpolator());

mRotateAnimation.setDuration(1000);

mRotateAnimation.setRepeatCount(-1);

iv_loading.startAnimation(mRotateAnimation);

}

以上代码需要注意设置动画旋转中心坐标为我们imageView的中心点,需要先对imageView进行测量,同时初始化布局的操作请放在onCreate()方法中(别直接在构造方法中初始化布局,这样可以在Dialog要显示的时候才初始化,即调用show方法)。

4、其他

@Override

public void dismiss() {

mRotateAnimation.cancel();

super.dismiss();

}

@Override

public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_BACK){

// 屏蔽返回键

return mCancelable;

}

return super.onKeyDown(keyCode, event);

}

这一步需要注意的是我们Dialog在显示的时候就会无限重复(setRepeatCount(-1))执行旋转动画,因此在Dialog消失的时候我们要取消动画,而屏蔽返回键则是为了更好地让窗口的关闭被我们的mCancelable控制。

看到这里你或许想知道我们设置的布局背景drawable,如下:

你可以自己设置你想要的圆角大小,也可以设置背景颜色(会被透明处理,根据我们为窗口设置的透明度)。

当然,仔细的你会发现我们还少了一些必要的配置,那就是窗口的style,如下:

@android:color/transparent

false

•android:windowBackground:设置窗口的背景,这里设为透明;

•android:backgroundDimEnabled:设置窗口是否变暗(true变暗,false不变暗,见效果图1和2)。

总结

以上所述是小编给大家介绍的Android自定义Dialog实现加载对话框效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

android dialog 自定义布局,Android自定义Dialog实现加载对话框效果相关推荐

  1. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题...

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: 1 @Overr ...

  2. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  3. android 自定义加载动画效果,Android 自定义View修炼-自定义加载进度动画LoadingImageView...

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  4. 从自定义TagLayout看自定义布局的一般步骤[手动加精]

    从自定义TagLayout看自定义布局的一般步骤[手动加精] 我们常用的布局有LinearLayout,FrameLayout,RelativeLayout,大多数情况下都能满足我们的需求,但是也有很 ...

  5. 自定义布局和自定义流水布局(CollectionViewLayout和CollectionViewFlowLayout)实例

    自定义布局和自定义流水布局(CollectionViewLayout和CollectionViewFlowLayout) 转载:https://www.jianshu.com/p/83f2d6ac7e ...

  6. android+底部评论框,Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)...

    实现的效果图: 自定义Fragment继承BottomSheetDialogFragment 重写它的三个方法: onCreateDialog() onCreateView() onStart() 他 ...

  7. Android开发中的正在加载动画效果

    有两种实现效果,一种是系统默认效果,一种是自定义效果:默认效果比较简单但效果也比较单调,自定义可以做出比较好看的效果来: 第一种:通过创建一个ProgressDialog对象并设置属性来显示 publ ...

  8. 一个常用的自定义弹框封装(适配 AndroidX),加载 ProgressDialog,状态显示的 StatusDialog 和自定义 Toast,全部支持背景颜色,圆角,边框和文字的自定义,构建者模

    MNProgressHUD 项目地址:maning0303/MNProgressHUD  简介: 一个常用的自定义弹框封装(适配 AndroidX),加载 ProgressDialog,状态显示的 S ...

  9. Android之利用回调函数onCreateDialog实现加载对话框

    效果图: 有时候我们需要去做一个Activity启动时的数据加载对话框,关于对话框的各种实现可以通过一起学android之对话框 Dialog的创建(7)来完成,在这里另外介绍一个,利用onCreat ...

最新文章

  1. 无线节能信标核心板V4-测试-2021-4-3
  2. 做网站没有技术万万不能
  3. php 下载exe 打不开,EXE文件打不开的解决方法
  4. 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
  5. Linux 命令之 chown -- 用来变更文件或目录的拥有者或所属群组
  6. 常见的通配符_8、数据库常见操作
  7. GitHub开源控件的使用合集
  8. Android——最全的系统对话框(AlertDialog)详解
  9. python路线图_Python路线图
  10. I2C接口触摸屏驱动分析
  11. Spring Boot配置文件yml格式详解
  12. uniapp app中导出手机号码到通讯录
  13. 谁动了你的 MSN?—— MSN 帐号被盗原因的分析和解决办法,鄙视msnlivesn.com
  14. Pytorch Image Models (timm)
  15. C++ SLT中的容器学习与函数谓词
  16. 基努·里维斯继续出演《黑客帝国4》|| 程序员吐槽大会精选片段
  17. 【ERROR】java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit
  18. linux使用命令查看MAC地址
  19. html + layui 打开word文档
  20. Rest_Assured接口测试学习汇总

热门文章

  1. 港科喜讯|香港科大10个学科位列香港第1世界前50-QS2022学科排名
  2. 人生顿悟之那绝不是人脉
  3. OneData方法论-维度表设计
  4. 怎么提高滚珠螺杆的效率?
  5. Java封装详解,很简单
  6. 阶段性总结:复旦微的FMQL10S400ZYNQ芯片+国微SM25QH256MX的FLASH的使用感受
  7. 软路由安装启动U盘的制作
  8. MacBook Big Sur 完美解决外接显示器 字体模糊、边缘不清 HIDPI 解决办法
  9. 关于Win10英文版安装中文语言包后,新用户登录还是英文界面的问题的解决方法
  10. js 鼠标事件mouseover和mouseout在父盒子移到子盒子中的思考