自定义AlertDialog(二)

先来看主页面布局

main_activity.xml里面只有一个button(添加点击事件,弹出加载框)

再看MainActivity

package com.example.loadingdialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main_activity);
		findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				LoadingDialog loadingDialog = new LoadingDialog(MainActivity.this);
				loadingDialog.setCancelable(false);
				loadingDialog.show();
			}
		});
	}
}

看加载框的布局文件

activity_custom_loding_dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >

    <LinearLayout
        android:layout_width="220dp"
        android:layout_height="220dp"
        android:layout_gravity="center"
        android:background="@drawable/dialog_bocop_loaing_bg"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:gravity="center" >

            <ImageView
                android:id="@+id/iv_route"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:background="@drawable/dialog_bocop_loading_rotate_anim_img" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:gravity="center_horizontal" >

            <TextView
                android:id="@+id/tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/tv_point"
                android:ellipsize="marquee"
                android:gravity="center"
                android:singleLine="true"
                android:text="正在加载"
                android:textColor="#6F6868"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/tv_point"
                android:layout_width="20dp"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:text="..."
                android:textColor="#6F6868"
                android:textSize="20sp" />
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

LoadingDialog(里面有详细的注释)

package com.example.loadingdialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class LoadingDialog extends Dialog {
	private static final int CHANGE_TITLE_WHAT = 1;
	private static final int CHNAGE_TITLE_DELAYMILLIS = 300;
	private static final int MAX_SUFFIX_NUMBER = 3;
	private static final char SUFFIX = '.';

	private ImageView iv_route;
	private TextView tv;
	private TextView tv_point;
	private RotateAnimation mAnim;
	private boolean cancelable = true;
	/**
	 * 定义一个handler,加载就发送一个即时消息,让原点+1,继而在每隔300毫秒发送一个延迟消息,来增加+1
	 */
	private Handler handler = new Handler(){
		//正在加载的原点数量
		private int num = 0;

		public void handleMessage(android.os.Message msg) {
			if (msg.what == CHANGE_TITLE_WHAT) {
				StringBuilder builder = new StringBuilder();
				if (num >= MAX_SUFFIX_NUMBER) {
					num = 0;
				}
				num ++;
				for (int i = 0;i < num;i++) {
					builder.append(SUFFIX);
				}
				tv_point.setText(builder.toString());
				if (isShowing()) {
					handler.sendEmptyMessageDelayed(CHANGE_TITLE_WHAT, CHNAGE_TITLE_DELAYMILLIS);
				} else {
					num = 0;
				}
			}
		};
	};

	public LoadingDialog(Context context) {
		super(context, R.style.Dialog_bocop);
		init();
	}

	private void init() {
		View contentView = View.inflate(getContext(), R.layout.activity_custom_loding_dialog_layout, null);
		setContentView(contentView);

		contentView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (cancelable) {
					dismiss();
				}
			}
		});
		iv_route = (ImageView) findViewById(R.id.iv_route);
		tv = (TextView) findViewById(R.id.tv);
		tv_point = (TextView) findViewById(R.id.tv_point);
		/**动画初始化*/
		initAnim();
		//背景暗色
		getWindow().setWindowAnimations(R.anim.alpha_in);
	}

	private void initAnim() {
		mAnim = new RotateAnimation(360, 0,Animation.RESTART, 0.5f, Animation.RESTART,0.5f);
		mAnim.setDuration(2000);
		// 设置动画重复次数
		mAnim.setRepeatCount(Animation.INFINITE);
		//动画重复的模式--执行完第一次动画之后,回到动画开始然后执行第二次动画
		mAnim.setRepeatMode(Animation.RESTART);
		mAnim.setStartTime(Animation.START_ON_FIRST_FRAME);
	}

	@Override
	public void show() {
		iv_route.startAnimation(mAnim);
		handler.sendEmptyMessage(CHANGE_TITLE_WHAT);
		super.show();
	}

	@Override
	public void dismiss() {
		mAnim.cancel();
		super.dismiss();
	}

	@Override
	public void setCancelable(boolean flag) {
		cancelable = flag;
		super.setCancelable(flag);
	}

}

再看super(context, R.style.Dialog_bocop);

背景色,无标题属性

<style name="Dialog_bocop">
        <item name="android:windowBackground">@color/bocop_dialog_bg</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    </style>

在color.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="bocop_dialog_bg">#77000000</color>
</resources>
<!-- window背景色 -->

接下来看这个getWindow().setWindowAnimations(R.anim.alpha_in);

alpha_in.xml(加载框之外是暗色)

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" >

</alpha>
时间: 2024-10-13 08:06:47

自定义AlertDialog(二)的相关文章

Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)

我们知道,在很多时候,我们都不用Android内置的一些控件,而是自己自定义一些自己想要的控件,这样显得界面更美观. 今天主要是讲自定义AlertDialog和popupWindow的使用,在很多需求中,我们往往需要这样一个功能,就是点击一个按钮或者其它控件,弹出一个对话框,让用户可以在这个对话框中做一些事,比如输入.选择.提示.....等等,那么,这个弹出对话框的功能我们都知道可以用popupWindow和AlertDialog实现,的却,popupWindow被称为万能的,因为它的布局都是我

Android开发之自定义Dialog二次打开报错问题解决

之前自定义了一个AlertDialog对话框,第一次点击时正常,但第二次调用时会出现错误:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 关于这个错误纠结了我好久,在网上百度了也不少,但感觉解决效果都达不到自己想要的效果.网上的解释说是一个子视图指定了多个父视图.由此可以推断出,在第二

[原创] Android 自定义AlertDialog 去黑边终极解决方案(亲测有效!)

问题:自定义AlertDialog出现黑边 运行代码段: View view = View.inflate(context, R.layout.dialog_common, null); mDialog = new AlertDialog.Builder(context).create(); mDialog.setView(view); mDialog.show(); dialog_common.xml <?xml version="1.0" encoding="utf

自定义AlertDialog(圆角+退出动画+自定义布局)

图片省略了不上传了... 首先看activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="ma

自定义AlertDialog(仿微信)

安卓自定义AlertDialog,原理很简单: AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create(); dialog.show(); Window window = dialog.getWindow(); window.setContentView(R.layout.alert_dialog); 通过window设置自定义dialog布局: 效果如图: 主界面MainActivity代码: package

Android 自定义AlertDialog 去黑边终极解决方案(亲测有效!)

问题:自定义AlertDialog出现黑边 运行代码段: View view = View.inflate(context, R.layout.dialog_common, null); mDialog = new AlertDialog.Builder(context).create(); mDialog.setView(view); mDialog.show(); dialog_common.xml <?xml version="1.0" encoding="utf

关于带有EditText的自定义AlertDialog,不能弹出软件盘的解决方法

原文 : 关于带有EditText的自定义AlertDialog,不能弹出软件盘的解决方法 mDialog = new AlertDialog.Builder(context, R.style.AlertDialog).create(); mDialog .show(); mDialog .getWindow().setContentView(layout); 原先的代码是这样的,但是运行后发现当弹出对话框的时候点击edittext无法弹出软键盘,但是这样写又能弹出软键盘: mDialog =

自定义View(二)(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 上一篇自定义View(一)(Android群英传)中说的是对现有控件进行拓展,这篇介绍第二种自定义View方法,创建复合控件. 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合.这种方式通常需要继承一个合适的ViewGroup,再给它添加指定功能的控件,从而组合成新的复合控件.通过这种方式创建的控件,我们一般会给它指定一些可配置的属性,让它具有更强的拓展性.下面就以一个TopBar为示例,讲解如何创

vue2.0 自定义 生成二维码(QRCode)组件

1.自定义 生成二维码组件 QRCode.vue <!-- 生成二维码 组件 --> <template> <canvas class="qrcode-canvas" :class="{show: show}" :style="{height: size + 'px', width: size + 'px'}" :height="size" :width="size" ref=