我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义等待对话框

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义等待对话框

最近,看了好多的APP的等待对话框,发现自己的太lower,于是就研究了一番,最后经过苦心努力,实现一个。

自定义一个LoadingIndicatorView(extends View )类 编写values/attrs.xml,在其中编写styleable和item等标签元素 在布局文件中LoadingIndicatorView使用自定义的属性(注意namespace) 在LoadingIndicatorView的构造方法中通过TypedArray获取

描述就提供这些,一下是代码的展示,非常的详细。
1、自定义属性的声明文件


<declare-styleable name="AVLoadingIndicatorView"> 
    <attr name="indicator"> 
      <flag name="BallSpinFadeLoader" value="22"/> 
    </attr> 
    <attr name="indicator_color" format="color"/> 
  </declare-styleable> 
<pre name="code" class="html">

LoadingIndicatorView.java 


import android.annotation.TargetApi; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Build; 
import android.support.annotation.IntDef; 
import android.util.AttributeSet; 
import android.view.View; 
import com.chni.lidong.androidtestdemo.R; 
 
public class LoadingIndicatorView extends View { 
  //indicators 指示器 
  public static final int BallSpinFadeLoader=22; 
  @IntDef(flag = true, 
      value = { 
          BallSpinFadeLoader, 
      }) 
  public @interface Indicator{} 
  //Sizes (with defaults in DP) 
  public static final int DEFAULT_SIZE=45; 
  //attrs 
  int mIndicatorId; 
  int mIndicatorColor; 
  Paint mPaint; 
  BaseIndicatorController mIndicatorController; 
  private boolean mHasAnimation; 
  public LoadingIndicatorView(Context context) { 
    super(context); 
    init(null, 0); 
  } 
  public LoadingIndicatorView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(attrs, 0); 
  } 
  public LoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(attrs, defStyleAttr); 
  } 
  @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
  public LoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    init(attrs, defStyleAttr); 
  } 
  private void init(AttributeSet attrs, int defStyle) { 
     
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AVLoadingIndicatorView); 
    mIndicatorId=a.getInt(R.styleable.AVLoadingIndicatorView_indicator, BallSpinFadeLoader);//获取编号属性 
    mIndicatorColor=a.getColor(R.styleable.AVLoadingIndicatorView_indicator_color, Color.WHITE);//获取颜色属性 
    a.recycle();//回收属性的集合 
    mPaint=new Paint(); 
    mPaint.setColor(mIndicatorColor);//设置画笔的颜色 
    mPaint.setStyle(Paint.Style.FILL);//设置画笔的样式为填充 
    mPaint.setAntiAlias(true);//去锯齿 
    applyIndicator();// 
  } 
  private void applyIndicator(){ 
    switch (mIndicatorId){ 
      case BallSpinFadeLoader: 
        mIndicatorController=new BallSpinFadeLoaderIndicator(); 
        break; 
    } 
    mIndicatorController.setTarget(this);//将控件设置到当前View 
  } 
  @Override 
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = measureDimension(dp2px(DEFAULT_SIZE), widthMeasureSpec);//获取View的宽度 
    int height = measureDimension(dp2px(DEFAULT_SIZE), heightMeasureSpec);//获取View的高度 
    setMeasuredDimension(width, height);// 
  } 
   
  private int measureDimension(int defaultSize,int measureSpec){ 
    int result = defaultSize; 
    int specMode = MeasureSpec.getMode(measureSpec);//测量规范 
    int specSize = MeasureSpec.getSize(measureSpec);//测量大小 
    if (specMode == MeasureSpec.EXACTLY) {//父控件已经为子控件设置确定的大小,子控件会考虑父控件给他的大小,自己需要多大设置多大 
      result = specSize; 
    } else if (specMode == MeasureSpec.AT_MOST) {//子控件可以设置自己希望的指定大小 
      result = Math.min(defaultSize, specSize);//取最小值 
    } else { 
      result = defaultSize; 
    } 
    return result; 
  } 
  @Override 
  protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    drawIndicator(canvas); 
  } 
  @Override 
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    if (!mHasAnimation){ 
      mHasAnimation=true; 
      applyAnimation(); 
    } 
  } 
  void drawIndicator(Canvas canvas){ 
    mIndicatorController.draw(canvas,mPaint); 
  } 
  void applyAnimation(){ 
    mIndicatorController.createAnimation(); 
  } 
  private int dp2px(int dpValue) { 
    return (int) getContext().getResources().getDisplayMetrics().density * dpValue; 
  } 

BaseIndicatorController.java


package com.chni.lidong.androidtestdemo.loading; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.view.View; 
 
public abstract class BaseIndicatorController { 
  private View mTarget; 
  public void setTarget(View target){ 
    this.mTarget=target; 
  } 
  public View getTarget(){ 
    return mTarget; 
  } 
   
  public int getWidth(){ 
    return mTarget.getWidth(); 
  } 
   
  public int getHeight(){ 
    return mTarget.getHeight(); 
  } 
   
  public void postInvalidate(){ 
    mTarget.postInvalidate(); 
  } 
   
  public abstract void draw(Canvas canvas,Paint paint); 
   
  public abstract void createAnimation(); 
} 

 BallSpinFadeLoaderIndicator.java


package com.chni.lidong.androidtestdemo.loading; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import com.nineoldandroids.animation.ValueAnimator; 
 
public class BallSpinFadeLoaderIndicator extends BaseIndicatorController { 
  public static final float SCALE=1.0f; 
  public static final int ALPHA=255; 
   
  float[] scaleFloats=new float[]{SCALE, 
      SCALE, 
      SCALE, 
      SCALE, 
      SCALE, 
      SCALE, 
      SCALE, 
      SCALE}; 
   
  int[] alphas=new int[]{ALPHA, 
      ALPHA, 
      ALPHA, 
      ALPHA, 
      ALPHA, 
      ALPHA, 
      ALPHA, 
      ALPHA}; 
  @Override 
  public void draw(Canvas canvas, Paint paint) { 
    float radius=getWidth()/10; 
    for (int i = 0; i < 8; i++) { 
      canvas.save(); 
      Point point=circleAt(getWidth(),getHeight(),getWidth()/2-radius,i*(Math.PI/4)); 
      canvas.translate(point.x,point.y); 
      canvas.scale(scaleFloats[i],scaleFloats[i]); 
      paint.setAlpha(alphas[i]); 
      canvas.drawCircle(0,0,radius,paint); 
      canvas.restore(); 
    } 
  } 
   
  Point circleAt(int width,int height,float radius,double angle){ 
    float x= (float) (width/2+radius*(Math.cos(angle))); 
    float y= (float) (height/2+radius*(Math.sin(angle))); 
    return new Point(x,y); 
  } 
  @Override 
  public void createAnimation() { 
    int[] delays= {0, 120, 240, 360, 480, 600, 720, 780, 840}; 
    for (int i = 0; i < 8; i++) { 
      final int index=i; 
      ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);//创建ValueAnimator对象 
      scaleAnim.setDuration(1000);//设置动画的持续时间 
      scaleAnim.setRepeatCount(-1);//设置动画是否重复 
      scaleAnim.setStartDelay(delays[i]);//延迟启动动画 
      scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//ValueAnimator只负责第一次的内容,因此必须通过监听来实现对象的相关属性的更新 
        @Override 
        public void onAnimationUpdate(ValueAnimator animation) { 
          scaleFloats[index] = (float) animation.getAnimatedValue();//获取当前帧的值 
          postInvalidate(); 
        } 
      }); 
      scaleAnim.start();//启动属性动画 
      ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 77, 255);//透明度动画 
      alphaAnim.setDuration(1000);// 
      alphaAnim.setRepeatCount(-1); 
      alphaAnim.setStartDelay(delays[i]); 
      alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
        @Override 
        public void onAnimationUpdate(ValueAnimator animation) { 
          alphas[index] = (int) animation.getAnimatedValue(); 
          postInvalidate(); 
        } 
      }); 
      alphaAnim.start(); 
    } 
  } 
  final class Point{ 
    public float x; 
    public float y; 
    public Point(float x, float y){ 
      this.x=x; 
      this.y=y; 
    } 
  } 
} 

UIHelp.java


package com.chni.lidong.androidtestdemo.utils; 
import android.app.Activity; 
import android.app.Dialog; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import com.chni.lidong.androidtestdemo.R; 
 
public class UIHelper { 
   
  private static Dialog mLoadingDialog; 
   
  public static void showDialogForLoading(Activity context, String msg, boolean cancelable) { 
    View view = LayoutInflater.from(context).inflate(R.layout.layout_loading_dialog, null); 
    TextView loadingText = (TextView)view.findViewById(R.id.id_tv_loading_dialog_text); 
    loadingText.setText(msg); 
    mLoadingDialog = new Dialog(context, R.style.loading_dialog_style); 
    mLoadingDialog.setCancelable(cancelable); 
    mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); 
    mLoadingDialog.show();    
  } 
   
  public static void hideDialogForLoading() { 
    if(mLoadingDialog != null && mLoadingDialog.isShowing()) { 
      mLoadingDialog.cancel(); 
    } 
  } 
} 

对话框的布局:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/bg_loading_dialog_shape"
  android:gravity="center"
  android:minHeight="60dp"
  android:minWidth="180dp"
  android:orientation="vertical"
  android:padding="@dimen/padding_10" >
  <LinearLayout
    android:layout_width="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:layout_height="wrap_content">
    <com.chni.lidong.androidtestdemo.loading.AVLoadingIndicatorView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:indicator="BallSpinFadeLoader"
      app:indicator_color="@color/green"
      />
  </LinearLayout>
  <TextView
    android:id="@+id/id_tv_loading_dialog_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/padding_5"
    android:text="正在登录…"
    android:textColor="@color/content"
    android:textSize="14sp" />
</LinearLayout>

对话框的样式:


<!-- 自定义Loading Dialog -->
<style name="loading_dialog_style" parent="@android:style/Theme.Dialog">
  <item name="android:windowFrame">@null</item>
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowBackground">@color/transparent</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowContentOverlay">@null</item>
</style>

MainActivity.java


public class Main7Activity extends AppCompatActivity { 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main7); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
            .setAction("Action", null).show(); 
      } 
    }); 
    UIHelper.showDialogForLoading(this, "正在加载...", true); 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
        UIHelper.hideDialogForLoading(); 
      } 
    },10000); 
  } 
} 

效果图;

您可能感兴趣的文章:Android中自定义对话框(Dialog)的实例代码Android中制作自定义dialog对话框的实例分享Android实现自定义圆角对话框Dialog的示例代码Android对话框自定义 对话框美化操作Android自定义控件实现万能的对话框Android自定义对话框DialogAndroid如何自定义升级对话框示例详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义等待对话框

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android自定义等待对话框

最近,看了好多的APP的等待对话框,发现自己的太lower,于是就研究了一番,最后经过苦心努力,实现一个。自定义一个LoadingIndicatorView(extends View )类编写values/attrs.xml,在其中编写st
2022-06-06

Android自定义ProgressDialog进度等待框

Android本身已经提供了ProgressDialog进度等待框,使用该Dialog,我们可以为用户提供更好的体验:在网络请求时,弹出此框等待网络数据。 不过,既然是为了提高用户体验,我们肯定希望该Dialog能更加炫酷,让用户看着更舒服
2022-06-06

Android自定义对话框Dialog

本文简单介绍自定义对话框Dialog的使用,代码和结构都非常简单,目的是能够快速使用自定义对话框,在本文中不具体讲解对话框的高级使用。 实现步骤 首先需要自己在我们的.xml文件中自己构建布局 布局文件做好之后,我们可以在style文件下自
2022-06-06

Android 自定义对话框 showSetPwdDialog

样式如下所示:布局:layoutdialog_set_pwd.xml 2022-06-06

android自定义AlertDialog对话框

前面一篇文章//www.jb51.net/article/103036.htm介绍了alertDialog的四种简单使用,但是有些时候为了让整个app的风格统一,或者说前面的四种形式不符合项目中的需求,这个时候就需要我们自定义alertDi
2022-06-06

android如何自定义对话框

这篇文章给大家分享的是有关android如何自定义对话框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.实现效果 2.定义dialog.xml (res/layout/dialog.xml)
2023-06-22

Android常用的AlertDialog对话框及自定义对话框

常用的Dialog有确认对话框,单选按钮对话框,多选按钮对话框,复选按钮对话框另外还有自定义的对话框 AlertDialog的常用方法 setTitle:为对话框设置标题 setMessage:为对话框设置内容 setIcon:为对话框设置
2022-06-06

Android中如何自定义对话框

本文小编为大家详细介绍“Android中如何自定义对话框”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android中如何自定义对话框”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本文测试的harbor的版本是
2023-06-29

Android基础篇-对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

一:AlterDialog对话框2:对话框圆角显示(在drawable下创建radius_bomb_box.xml)3:Styles样式设置@color/colorPrimary@color/colorPrimaryDark@color/c
2022-06-06

Android对话框自定义标题 对话框标题美化操作

Android自带的对话框标题不好看,如果我们需要给弹出的对话框设置一个自己定义的标题,可以使用AlertDialog.Builder的setCustomTitle()方法。 定义一个对话框标题的title.xml文件:
2022-06-06

Android自定义对话框Dialog的简单实现

本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的App中。首先来看一下效果图:首先是activity的界面点击了上述图片的按钮后,弹出对话框:点击对话框的确定按钮:点
2023-05-30

ANDROID中自定义对话框AlertDialog使用示例

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式。AlertDialog中定义的一些对话框
2022-06-06

Android中怎么自定义AlertDialog对话框样式

这篇文章给大家介绍Android中怎么自定义AlertDialog对话框样式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。根据自己实际的需求,为AlertDialog创建一个布局,在此我需要定义一个如图所示的WIFI密
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录