Android 自定义Dialog 实例

开发中经常需要请求网络获取数据,我们在请求网络到得到数据时当中需要等待一些时间,为了增加用户体验,我们一般会用一个Dialog来提示用户我们在加载网络数据。

今天我们来实现如下效果的加载中Dialog。

从图中我们可以看到要这个Dialog是图片还有文字组成的,(不过我这里使用代码实现的,没有用图片),以下是这个加载图形的代码:

public class LVCircularRing extends View {

private float mWidth = 0f;
private float mPadding = 0f;
private float startAngle = 0f;
private Paint mPaint;

public LVCircularRing(Context context) {
 this(context, null);
}

public LVCircularRing(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
}

public LVCircularRing(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 initPaint();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);

 if (getMeasuredWidth() > getHeight())
  mWidth = getMeasuredHeight();
 else
  mWidth = getMeasuredWidth();
 mPadding = 5;
}

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 mPaint.setColor(Color.argb(100, 255, 255, 255));
 canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2 - mPadding, mPaint);
 mPaint.setColor(Color.WHITE);
 RectF rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding);
 canvas.drawArc(rectF, startAngle, 100
   , false, mPaint);//第四个参数是否显示半径

}

private void initPaint() {
 mPaint = new Paint();
 mPaint.setAntiAlias(true);
 mPaint.setStyle(Paint.Style.STROKE);
 mPaint.setColor(Color.WHITE);
 mPaint.setStrokeWidth(8);
}

public void startAnim() {
 stopAnim();
 startViewAnim(0f, 1f, 1000);
}

public void stopAnim() {
 if (valueAnimator != null) {
  clearAnimation();
  valueAnimator.setRepeatCount(1);
  valueAnimator.cancel();
  valueAnimator.end();
 }
}

ValueAnimator valueAnimator;

private ValueAnimator startViewAnim(float startF, final float endF, long time) {
 valueAnimator = ValueAnimator.ofFloat(startF, endF);

 valueAnimator.setDuration(time);
 valueAnimator.setInterpolator(new LinearInterpolator());
 valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环
 valueAnimator.setRepeatMode(ValueAnimator.RESTART);//

 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator valueAnimator) {

   float value = (float) valueAnimator.getAnimatedValue();
   startAngle = 360 * value;

   invalidate();
  }
 });
 valueAnimator.addListener(new AnimatorListenerAdapter() {
  @Override
  public void onAnimationEnd(Animator animation) {
   super.onAnimationEnd(animation);
  }
 });
 if (!valueAnimator.isRunning()) {
  valueAnimator.start();
 }

 return valueAnimator;
}
}

 Dialog 代码:

public class LoadingDialog {
LVCircularRing mLoadingView;
Dialog mLoadingDialog;

public LoadingDialog(Context context,String msg) {
 // 首先得到整个View
 View view = LayoutInflater.from(context).inflate(
   R.layout.loading_dialog_view, null);
 // 获取整个布局
 LinearLayout layout = (LinearLayout) view.findViewById(R.id.dialog_view);
 // 页面中的LoadingView
 mLoadingView = (LVCircularRing) view.findViewById(R.id.lv_circularring);
 // 页面中显示文本
 TextView loadingText = (TextView) view.findViewById(R.id.loading_text);
 // 显示文本
 loadingText.setText(msg);
 // 创建自定义样式的Dialog
 mLoadingDialog = new Dialog(context, R.style.loading_dialog);
 // 设置返回键无效
 mLoadingDialog.setCancelable(false);
 mLoadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
   LinearLayout.LayoutParams.MATCH_PARENT,
   LinearLayout.LayoutParams.MATCH_PARENT));
}

public void show(){
 mLoadingDialog.show();
 mLoadingView.startAnim();
}

public void close(){
 if (mLoadingDialog!=null) {
  mLoadingView.stopAnim();
  mLoadingDialog.dismiss();
  mLoadingDialog=null;
 }
}
}

 布局文件loading_dialog_view 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@drawable/dialog_bg"
android:padding="20dp"
android:orientation="vertical">

<com.ye.daqiapp.ui.widget.loading.LVCircularRing
 android:id="@+id/lv_circularring"
 android:layout_width="50dp"
 android:layout_height="50dp"/>

<TextView
 android:id="@+id/loading_text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textColor="#ffffff"
 android:layout_marginTop="5dp"
 android:textSize="15sp"/>

</LinearLayout>

 Dialog中Style代码:

<style name="loading_dialog" parent="android:style/Theme.Dialog">
 <item name="android:windowFrame">@null</item>
 <item name="android:windowNoTitle">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
 <item name="android:windowIsFloating">true</item>
 <item name="android:backgroundDimEnabled">false</item>
 <item name="android:windowContentOverlay">@null</item>
</style>

 背景dialog_bg 代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#444444" />

<!-- 圆角的幅度 -->
<corners
 android:bottomLeftRadius="3dp"
 android:bottomRightRadius="3dp"
 android:topLeftRadius="3dp"
 android:topRightRadius="3dp" />
</shape>

如何使用:在需要使用的地方初始化Dialog:

LoadingDialog dialog=new LoadingDialog(context,"玩命加载中...");
//显示Dialog
dialog.show();
//关闭Dialog
dialog.close();

以上是对Android Dialog 重写的小示例,有需要的朋友可以参考下。

(0)

相关推荐

  • Android编程经典代码集锦(复制,粘贴,浏览器调用,Toast显示,自定义Dialog等)

    本文实例总结了Android编程经典代码段.分享给大家供大家参考,具体如下: 1. 复制,粘贴 clip = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); clip.setText("copy"); // 复制 clip.getText(); // 粘贴 2.调用浏览器 核心代码如下: Intent intent = new Intent(); intent.setAction("android.

  • Android编程中自定义dialog用法实例

    本文实例讲述了Android编程中自定义dialog用法.分享给大家供大家参考,具体如下: dialog是android中提供的一组弹出提示框,非常好用,可是它的样式是一个定式,有时候我们需求定义一些自己的样式 1.定义一个样式文件,此文件继承自Theme.Dialog,在style.xml文件中建立一个自己的样式 <style name="addNoteType_error_Dialog" parent="@android:Theme.Dialog">

  • Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)

    虽然Android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的APK都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,那我们就需要自定义了,为了方便大家对自定义组件的学习,我接下来准备了几遍有关自定义的Dialog的文章,希望对大家有帮助. 在开发APK中最常见的估计就数弹出对话框了,这种对话框按照按钮数量来分大致是三种:一个按钮,两个按钮,三个按钮.现在要讲的就是按照按钮数量分为以上三类吧(当然了可以有更多的按钮,只要你愿意). 自定义Di

  • Android编程自定义Dialog的方法分析

    本文实例讲述了Android编程自定义Dialog的方法.分享给大家供大家参考,具体如下: 功能: android 提供给我们的只有2种Dialog 即 AlertDialog & ProgressDialog 但是 Dialog 有其自身的特点:1. 不是 Activity 2. 开销比 Activity 小得多 鉴于以上的优点 我们就有定制自己Dialog 的需求 原理: 1. android 系统提供了一个class: Dialog. 而且你可以把自己的工作放在"protected

  • Android 自定义dialog的实现代码

    Android 自定义dialog的实现代码 搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog.把自己整合的完整代码发上来. 要点: 1.设置自定义dialog的布局文件my_dialog.xml 2.设置一份自定义的样式文件styles_wx.xml,该文件用于覆盖Android的默认主题样式,如黑色边框等. 3.Java代码继承Dialog实现自定义类MyDialog,实现自定义布局,还有设置窗口的大小.位置等. (网上文章要么少介绍第2点,

  • Android自定义dialog可选择展示年月日时间选择栏

    自定义dialog package com.poptest; import android.app.DatePickerDialog; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; //dialog类 public class YearPickerDialog extends DatePickerD

  • Android中用Builder模式自定义Dialog的方法

    前言 我们开发人员在实际项目过程中遇到的需求是多种多样的,有时我们要匹配APP自己的设计风格,有时我们会觉得系统的对话框使用起来不够自由,因此自己定义一个适合自己的Dialog是很有必要的. 为什么要用Builder模式 Builder设计模式是一步步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.它的优点就在于将对象的构建和表示分离从而解耦.我们都知道Android系统自身的对话框如AlertDialog就采用了Builder模式,因此可见

  • Android中制作自定义dialog对话框的实例分享

    自定义dialog基础版 很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用. 首先创建布局文件dialog: 代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.and

  • Android 去掉自定义dialog的白色边框的简单方法

    在value目录下,创建styles.xml文件 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?><resources xmlns:android="http://schemas.android.com/apk/res/android"> <style        name="dialog"        parent="@androi

  • Android自定义Dialog实现文字动态加载效果

    之前在技术问答上面看到一个提问 "加载中-" 后面三个点是动态的,这么一个效果实现.想来想去,好像没想到好的处理方式. 尝试了一下,以一个最笨的方式实现了.先来看一下效果 : 我是通过自定义一个Dialog,加载中的效果,是在Dialog内部实现的,进度还是从Activity里面控制的. 下面是Dialog实现类: public class CustomDialog extends AlertDialog { public CustomDialog(Context context) {

  • Android自定义dialog简单实现方法

    本文实例讲述了Android自定义dialog简单实现方法.分享给大家供大家参考,具体如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.function_music); // 实例化新的窗口 Window w = getWindow(); // 获取默认显示数据 Display display

随机推荐