目录
[1.1 图形Drawable](#1.1 图形Drawable)
[1.2 形状图形](#1.2 形状图形)
[1.2.1 属性说明](#1.2.1 属性说明)
[1.2.2 shape下级节点------参数设置](#1.2.2 shape下级节点——参数设置)
[1.2.3 创建](#1.2.3 创建)
[1.3 九宫格图片(点九图片)](#1.3 九宫格图片(点九图片))
[1.3.1 作用](#1.3.1 作用)
[1.3.2 创建](#1.3.2 创建)
[1.3.3 点九图片处理](#1.3.3 点九图片处理)
[1.3.4 背景图片被主题覆盖导致无法显示问题](#1.3.4 背景图片被主题覆盖导致无法显示问题)
[1.4 状态列表图形](#1.4 状态列表图形)
[2.1 复选框CheckBox](#2.1 复选框CheckBox)
[2.2 开关按钮Switch](#2.2 开关按钮Switch)
[2.3 单选按钮RadioButton](#2.3 单选按钮RadioButton)
[3.1 编辑框EditText](#3.1 编辑框EditText)
[3.2 焦点变量监听器](#3.2 焦点变量监听器)
[3.3 文本变化监听器](#3.3 文本变化监听器)
[4.1 编辑对话框AlertDialog](#4.1 编辑对话框AlertDialog)
[4.2 日期对话框DatePickerDialog](#4.2 日期对话框DatePickerDialog)
[4.3 时间对话框TimePickerDialog](#4.3 时间对话框TimePickerDialog)
[5 自动消失提示框](#5 自动消失提示框)
1.图形定制
1.1 图形Drawable
Drawable类型表达了各种各样的图形 ,包括图片、色块、画板、背景等。
包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性的XML文件,而图片文件一般放在具体分辨率的drawable目录下。例如:
- drawable-ldpi里面存放低分辨率的图片(如240 * 320),现在基本没有这样的只能手机。
- drawable-mdpi里面存放中等分辨率的图片(如320 * 480),这样的只能手机已经很少了。
- drawable-hdpi俩面存放加高分辨率的图片,例如(480* 800),一般对应4英寸~4.5英寸的手机(但不绝对,同尺寸的手机有可能分辨率不同,手机分辨率有高有低,因为分辨率低了屏幕会有模糊的感觉)。
- drawable-xhdpi里面存放加高分辨率的图片(如720 * 1280),一般对应5英寸~5.5英寸的手机。
- drawable-xxhdpi里面存放加高分辨率的图片(1080 * 1920),一般对应6英寸~6.5英寸的手机。
- drawable-xxxhpi里面存放超超高分辨率的图片(如1440 * 2560),一般对应7英寸以上的平板电脑。
基本上,分辨率每加大一级,宽度和高度就要增加二分之一或三分之一像素,如果各目录存在同名图片,Android就会根据手机的分辨率分辨适配对应文件夹里的图片。在开发APP时,为了兼容不同的手机屏幕,在各目录存放不同分辨率的图片,才能打到最合适的显示效果。
例如,在drawable-hdpi放了一张背景图片bg.png(分辨率480 * 800),其他目录没放,使用分辨率为480 * 800的手机查看该App屏幕,但使用分辨率为720 * 1280的手机查看该App,会发现背景图片有点模糊,原因是Android为了让背景图片是适应高分辨的屏幕,强行把bg.png拉伸到720 * 1280,拉伸的后果就是图片变模糊了。
在XML布局文件中引用图形文件可使用"@drawable/不含扩展名的文件名称"这种形式。
"@drawable/null"表示图形资源引用为空。
XML引用图形资源的属性:各视图的background属性 、ImageView和ImageButton的src属性 、TextView和Button四个方向的drawable***系列属性都可引用图形文件。
1.2 形状图形
1.2.1 属性说明
shape图形又成形状图形,它用来描述常见的几何形状,包括矩形、圆角矩形、圆形、椭圆等等。
形状图形的定义文件是以shape标签为根节点的XML描述文件,它支持四种类型的形状:
- rectangle:矩形,默认值。
- oval:椭圆。此时corners节点会失效。
- line:直线。此时必须设置stroke节点,不然会报错。
- ring:圆环。
1.2.2 shape下级节点------参数设置
size(尺寸),描述形状图形的宽高尺寸。若无size节点,则表示宽高与宿主视图一样大小。
- height:像素类型,图形高度。
- width:像素类型,图形宽度。
stroke(描边),描述了形状图形的描边规格。若无stroke节点,则表示不存在描边。下面是stroke节点的常用属性说明。
- color:颜色类型,描边颜色。
- dashGao:像素类型,每段虚线之间的间隔。
- dashWidth:像素类型,没端序点的宽度。若dashGap和dashWidth有一个值为0,则描边为实线。
- width:像素类型,描边的厚度。
corners(圆角),corners是shape的下级节点,它描述了形状图形的圆角大小。若无corners节点的常用属性说明。
- bottomLeftRadius:像素类型,左下圆角的半径。
- bottomRightRadius:像素类型,右下圆角的半径。
- topLeftRadius:像素类型,左下圆角的半径。
- topRightRadius:像素类型,右下圆角的半径。
- radius:像素类型,4个圆角的半径(若有上面4个圆角半径的定义,则不需要radius定义)。
solid(填充),描述了形状图形的填充色彩。若无solid节点,则表示无填充颜色。下面是solid节点的常用属性说明。
- color:颜色类型,内部填充的颜色。
padding(间隔),描述了形状图形与周围边界的间隔。若无padding节点,则表示四周不设间隔。下面是padding节点的常用属性说明。
- top:像素类型,与上方的间隔。
- bottom:像素类型,与下方的间隔。
- left:像素类型,与左边的间隔。
- right:像素类型,与右边的间隔。
gradient(渐变),描述形状图形的颜色渐变。若无gradient节点,则表示没有渐变效果。下面是gradient节点的常用属性说明。
- angle:整数型,渐变的起始角度,为0时表示时钟的9点位置,值增大表示往逆时针方向旋转。例如,值为90表示6点位置,值为180表示3点位置,值为270表示0点/12点位置。
- type:字符串类型,渐变类型,渐变类型的取值说明见下表
| 渐变类型 | 说明 | 
|---|---|
| linear | 线性渐变,默认值 | 
| radial | 放射渐变,起始颜色就是圆心颜色 | 
| sweep | 滚动渐变,即一个线段以某个端点为圆心坐360度旋转 | 
| [渐变类型的取值说明] | 
- conterX:浮点型,圆心的X坐标。当android:type="linear"时不可用。
- conterY:浮点型,圆心的Y坐标。当android:type="linear"时不可用。
- gradientRadius:整数型。渐变的半径。当android:type="radial时需要设置该属性。
- centerColor:颜色类型,渐变的中间颜色。
- useLevel:布尔类型,设置为true为无渐变色、false为有渐变色。
1.2.3 创建


1.3 九宫格图片(点九图片)
1.3.1 作用
将某张图片设置成视图背景时,如果图片尺寸太大,则系统会自动拉伸图片使之填满背景,但一旦图片拉伸过大,画面容易变得模糊。
点九图片就是为了避免这一问题。之所以叫点九图片,是因为后缀是".9.png"。
1.3.2 创建
在原图片的基础上,创建点九图片。

1.3.3 点九图片处理
9pathfilevideo
 效果对比图
 效果对比图
1.3.4 背景图片被主题覆盖导致无法显示问题
找到res->value->theme,修改为一个以**.Bridge**结尾的主题。如下图:


1.4 状态列表图形
创建:在drawable中创建xml文件,根节点是selector。同上面shape创建方式一致,只有根节点的区别。主要用于设置控件样式。
用于:状态列表图形不仅可以用于按钮控件,还可以用于其他拥有多种状态的控件。
使用:xml文件android:backgroud属性中。
| 状态类型的属性名称 | 说明 | 适用的控件 | 
|---|---|---|
| state_pressed | 是否按下 | 按钮Button | 
| state_checked | 是否勾选 | 复选框CheckBox、单选按钮RadioButton | 
| state_focused | 是否获取焦点 | 文本编辑框EditText | 
| state_selected | 是否选中 | 各控件通用 | 
| [状态类型的取值说明] | 
            
            
              XML
              
              
            
          
          <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="默认点击样式"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义点击样式"
        android:background="@drawable/button_click_selector"/>
</LinearLayout>2.选择按钮
 按钮继承关系示意图
 按钮继承关系示意图
CompoundButtom在XML文件中主要使用以下属性:
- checked:指定勾选状态。默认不勾选,true表示勾选,false表示未勾选。
- button:指定勾选框图标样式。如果不指定则使用系统默认图标。
CompoundButton在Java代码中主要使用以下4种方法:
- setChecked:设置勾选状态。
- setButtonDrawable:设置左侧勾选状态图标样式。
- setOnCheckedChangeListener:设置勾选状态变化的监听器。
- isChecked:判断按钮是否勾选。
2.1 复选框CheckBox
继承自CompoundButtom类,可使用CompoundButtom属性。
2.2 开关按钮Switch
继承自CompoundButtom类,可使用CompoundButtom属性。
| 名称 | 说明 | 
|---|---|
| textOn | 设置右侧开启时的文本(需要启用showText属性)  | 
| textOff | 设置左侧关闭时的文本(需要启用showText属性)  | 
| track | 设置开关轨道的背景 | 
| thumb | 设置开关标识的图标 | 
| [相比CompoundButton增加的XML属性] | 
2.3 单选按钮RadioButton
继承自CompoundButtom类,可使用CompoundButtom属性。
单选按钮要在一组按钮中选择其中一项,并且不能多选,这要求有个容器确定这组按钮的范围,这个容器便是单选组RadioGroup。
RadioGroup实质上是个布局,继承自LinearLayout。同一组RadioButton都要放在同一个RadioGroup节点下。除了RadioButton,也允许放置其他控件。二者区别:
RadioGroup支持管理单选按钮的功能,而线性布局不具备该功能。
RadioGroup默认垂直布局,而LinearLayout默认水平布局。
判断哪个RadioButton被选中,通常是监听RadioGroup。而不是监听RadioButton。以下是RadioGroup常用的3个方法:
- check:选中指定资源编号的单选按钮。
- getCheckdRadioButtonId:获取选中状态单选按钮的资源编号,即R.id。
- setOnCheckedChangeListener:获取单选按钮勾选变化的监听器。
3.文本输入
3.1 编辑框EditText
EditText继承自TextView。可使用TextView的各种属性。
EditText的getText()返回的是Editable,而不是String,如果想要输出文本,需要toString()转换一下。
相比TextView,EditText新增的XML属性。
- inputType:指定输入的文本类型,输入类型的取值说明见下表,若同时使用多种文本类型,则可是使用竖线"|"把多种文本类型拼接起来。
| 输入类型 | 说明 | 
|---|---|
| text | 文本 | 
| textPassword | 文本密码。显示时用圆点"."代替 | 
| number | 整数型 | 
| numberSigned | 带符号的数字。允许在开头带符号"-" | 
| numberDecimal | 带小数点的数字 | 
| numberPassword | 数字密码。显示时用圆点"."代替 | 
| datetime | 时间日期格式。除了数字外,还允许输入横线,斜杠,空格,冒号 | 
| date | 日期格式。除了数字外,还允许输入横线"-"和斜杠"/" | 
| time | 时间格式。除了数字外,还允许输入冒号":" | 
| [输入文本类型] | 
- maxLength:文本允许输入的最大长度。
- hint:提示文本的内容。
- textColorHint:提示文本的颜色。
3.2 焦点变量监听器
编辑框点击两次后才会触发点击事件。第一次点击只触发焦点变更事件,第二次点击才触发点击事件。
若要判断是否切换编辑框输入,应当监听焦点变更事件,而非监听点击事件。
调用编辑框对象的setOnFoucusChangeListener方法,即可在光标切换之时(获得光标和失去光标)触发焦点变更事件。
            
            
              java
              
              
            
          
          //请求焦点,即将光标返回到当前控件
void requestFocus();
//使用方法
控件名称.requestFocus();3.3 文本变化监听器
文本编辑框达到指定长度自动关闭软键盘,此时要注册文本变化监听器。主要有两个功能点:
- 如何关闭软键盘。
- 如何判断已输入的文字达到指定位数。
调用编辑框对象的addTextChangedListener方法注册文本监听器。
文本监听器的接口名称为TextWacher,该接口提供了3个监听方法:
- beforeTextChanged:在文本改变之前触发。
- onTextChanged:在文本改变过程中触发。
- afterTextChanged:在文本改变之后触发。
文本监听器使用方法。先使用下面功能函数,然后使用Alt键+回车键,自动补全监听器类函数。注意传递参数。
            
            
              java
              
              
            
          
          //1.设置监听 et_number和et_password是创建的控件,HideTextWatcher是自定义的私有类
et_number.addTextChangedListener(new HideTextWatcher(et_number,11));
et_password.addTextChangedListener(new HideTextWatcher(et_password,6));
            
            
              java
              
              
            
          
          //2.此功能函数在onCreate函数外面
 private class HideTextWatcher implements TextWatcher {
        //声明变量,用来接收外部传来的控件和变量
        private EditText m_et;
        private int m_maxLength;
        
        public HideTextWatcher(EditText editText, int maxLength) {
            this.m_et = editText;
            this.m_maxLength = maxLength;
        }
        @Override
        public void afterTextChanged(Editable s) {
            //如果当前文本编辑框输入的内容和设置的最大长度一致,则隐藏软件盘
            if(m_et.length() == m_maxLength){
                Utils.HideInputMethod.hideOneInputMethod(LoginActivity.this,m_et);
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
    }4.对话框
4.1 编辑对话框AlertDialog
AlertDialog可以完成常见的交互操作,例如提示、确认、选择等功能。
AlertDialog借助建造器AlertDialog.Builder 才能完成参数设置。AlertDialog.Builder的常用方法说明如下:
- secIcon:设置对话框的标题图标。
- setTitle:设置对话框的标题文本。
- setMessage:设置对话框的内容文本。
- setPositiveButton:设置肯定按钮的信息,包括按钮文本和点击监听器。
- setNegativeButton:设置否定按钮的信息,包括按钮文本和点击监听器。
- setNeutralButton:设置中性按钮的信息,包括按钮文本和点击监听器,该方法比较少用。
            
            
              java
              
              
            
          
              //创建一个AlertDialog对话框建造器
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    //设置对话框内容和样式
    builder.setTitle("这是一个注册提示框");
    builder.setMessage("是否需要注册新账号?");
    builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            tv_show_number.setText("确认注册");
        }
    });
    builder.setNegativeButton("我再想想",new DialogInterface.OnClickListener(){
       @Override
       public void onClick(DialogInterface dialog, int which) {
           tv_show_number.setText("取消注册");
            }
        });
    AlertDialog dialog = builder.create();
    dialog.show();通过AlertDialog.Builder设置完对话框参数,还需要调用建造器的create方法生成对话框示例,再调用对话框实例的show方法,在页面上弹出提醒对话框。
            
            
              java
              
              
            
          
          /根据建造器构建提醒对话框对象
AlertDialog dialog = builder.create();
//显示提醒对话框
dialog.show();4.2 日期对话框DatePickerDialog
主要有两种:DatePicker(控件) 和DatePickerDialog(对话框)
虽然EditText提供了inputType="date"的日期输入,但是很少有人会手工输入完整日期,况且EditText还不支持"年**月**日"这样的中文日期,所以系统提供了专门的日期选择器DatePicker ,供用户选择具体的年月日。不过,DatePicker并非弹窗模式,而是在当前页面占据一块区域,并且不会自动关闭 。按习惯来说,日期控件应该弹出对话框,选择完日期就要自动关闭对话框。因此很少直接在界面上显示DatePicker,而是利用已经封装好的日期选择对话框DatePickerDialog。
DatePickerDialog相当于在AlertDialog上装载了DatePicker,编码时只需调用构造方法设置当前的年、月、日。然后调用show方法即可弹出日期对话框。日期选择事件则是由监听器OnDateSetListener负责响应,在该监听器的onDateSet方法中,开发者获取用户选择的具体日期,再做后续处理。特别注意onDateSet的月份参数,他的起始值不是1而是0。也就是说,一月份对应的参数值为0,十二月份对应的参数值为11,中间月份的数值以此类推。
DatePick控件XML属性
            
            
              XML
              
              
            
          
          //用于显示日期控件的显示方式 滚轮显示还是日历形式
andorid:datePickerMode
//用于确认是否带日历表
android:calendarViewShownDatePickerDialog日期对话框创建接口
            
            
              java
              
              
            
          
          public DatePickerDialog(@NonNull Context context, @Nullable OnDateSetListener listener,
            int year, int month, int dayOfMonth)
            
            
              java
              
              
            
          
          //显示对话框
public void show()
            
            
              java
              
              
            
          
          //获取日历实例
Calendar calendar = Calendar.getInstance();
//创建日期对话框
DatePickerDialog dateDialog = new DatePickerDialog(this
        ,this
        ,calendar.get(Calendar.YEAR)
        ,calendar.get(Calendar.MONTH)
        ,calendar.get(Calendar.DAY_OF_MONTH)
);//月份从0开始
dateDialog.show();获取当前时间Calendar类
            
            
              java
              
              
            
          
          //获取日历实例
Calendar calendar = Calendar.getInstance();
//获取年
calendar.get(Calendar.YEAR)
//获取月
calendar.get(Calendar.MONTH)
//获取日
calendar.get(Calendar.DAY_OF_MONTH)
//获取时
calendar.get(Calendar.HOUR_OF_DAY)
//获取分
calendar.get(Calendar.MINUTE)
//获取秒
calendar.get(Calendar.SECOND)4.3 时间对话框TimePickerDialog
主要有两种:TimePicker(控件) 和TimePickerDialog(对话框)
TimePicker属性
            
            
              XML
              
              
            
          
          //滚轮模式和时钟模式切换
android:timePickerMode
<attr name="timePickerMode">
            <!-- Time picker with spinner controls to select the time. -->
            <enum name="spinner" value="1" />
            <!-- Time picker with clock face to select the time. -->
            <enum name="clock" value="2" />
        </attr>
            
            
              java
              
              
            
          
          //timePicker设置24小时制和12小时制切换
public void setIs24HourView(@NonNull Boolean is24HourView)TimePickerDialog创建
            
            
              java
              
              
            
          
          方式一
public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,boolean is24HourView)
方式二
public TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener,
            int hourOfDay, int minute, boolean is24HourView)
            
            
              java
              
              
            
          
          //对话框需要调用show显示
public void show()
            
            
              java
              
              
            
          
          //使用示例
//获取日历实例
Calendar calendar = Calendar.getInstance();
//创建时间选择对话框
TimePickerDialog timeDialog = new TimePickerDialog(this,this
        ,calendar.get(Calendar.HOUR_OF_DAY)
        ,calendar.get(Calendar.MINUTE)
        ,true
);
timeDialog.show();5 自动消失提示框
Toast类 是一个视图(View),包含给用户的简短消息。Toast 类帮助你创建和显示这些消息。当视图显示给用户时,它会作为悬浮视图出现在应用程序上方。它永远不会获得焦点。用户可能正在输入其他内容。这种设计的目的是尽量不打扰用户,同时仍然向用户显示你希望他们看到的信息。例如音量控制,和显示设置已保存的简短消息。使用此类最简单的方法是调用静态方法之一,该方法构建所需的一切并返回一个新的 Toast 对象。请注意,当应用处于前台时,Snackbar 更适合显示简短消息。请注意,从后台发送的 toast 有速率限制,因此避免快速连续发送此类 toast。从 Android 12(API 级别 31)开始,针对 Android 12 或更高版本的应用,其 toast 会限制为两行。
创建接口
            
            
              java
              
              
            
          
              /**
     * Make a standard toast that just contains text.
     *
     * @param context  The context to use.  Usually your {@link android.app.Activity} object.
     * @param text     The text to show.  Can be formatted text.
     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
     *                 {@link #LENGTH_LONG}
     *
     */
    public static Toast makeText(Context context, CharSequence text, @Duration int duration)
            
            
              java
              
              
            
          
          //使用示例
Toast.makeText(this,"请输入11位电话号码", Toast.LENGTH_SHORT).show();