安卓 实现一个加载Dialog 配合19的图片逐帧变换(20)

我们在很多地方都会遇到正在加载中的载入框,其实这个载入框我们可以通过自己继承自Dialog来自己实现一个载入框,并且实现其中逻辑来完成。

首先修改style.xml,为MyDialog写一个style样式:

    <style name="MyDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:windowIsFloating">true</item><!--是否悬浮在Activity上-->
        <item name="android:windowIsTranslucent">true</item><!--半透明-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
        <item name="android:backgroundDimEnabled">true</item><!--模糊-->
        <item name="android:backgroundDimAmount">0.6</item><!--灰度-->

         <!--<item name="android:windowContentOverlay">@null</item><!– 对话框是否有遮盖  –>-->
         <!--<item name="android:windowAnimationStyle">@style/dialog_animation</item><!– 弹出或者进入时的动画效果  –>-->
         <!--<item name="android:colorBackgroundCacheHint">@null</item><!– 背景缓存颜色  –>-->
    </style>

接着实现一个MyDialog类:

public class MyDialog extends Dialog {

    private Context context;
    private static MyDialog dialog;
    private ImageView animation_image;
    private AnimationDrawable animationDrawable;

    public MyDialog(@NonNull Context context) {
        super(context);
        this.context = context;
    }

    public MyDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        this.context = context;
    }

    protected MyDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        this.context = context;
    }

    //把MyDialog的构造方法在这个函数内实现,对于其他类使用该类时可以直接实现此函数
    public static MyDialog showDialog(Context context){
        //这里通过使用第二个构造方法来将style联系起来(layout参考文章19)
        dialog = new MyDialog(context, R.style.MyDialog);
        dialog.setContentView(R.layout.animation_layout);
        //点击加载框外的其余位置不能退出加载框,点击返回键可以退出
        //dialog.setCanceledOnTouchOutside(false);
        //点击加载框外的其余位置不能退出加载框,点击返回键也不可以退出
        dialog.setCancelable(false);
        return dialog;
    }

    //真正的窗体完成初始化可见获取焦点可交互是在onWindowFocusChanged()方法被执行时
    //关于Activity的一整个显示过程可以自行上网百度一下(onCreate->onStart->onResume->onWindowFocusChanged等等)
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(hasFocus && dialog != null){
            //实现滚动的加载框图片(这一块代码参考文章19)
            animation_image = findViewById(R.id.animation1);
            animationDrawable = (AnimationDrawable) animation_image.getDrawable();
            animationDrawable.start();
        }
    }
}

实现一个Activity:

public class MyDialogActivity extends AppCompatActivity {

    MyDialog myDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_dialog_layout);

        myDialog = MyDialog.showDialog(MyDialogActivity.this);
        myDialog.show();
//        //两秒后退出加载
//        new Handler().postDelayed(new Runnable() {
//            @Override
//            public void run() {
//                myDialog.dismiss();
//            }
//        }, 2000);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值