本篇继续学习高级控件及独具特色的监听器,目录如下:
1. ScrollView 滚动视图
2. ProgressBar 进度条
3. ProgressDialog 对话框形式进度条
4. SeekBar 可拖动进度条
5. DataPicker 日历选择器
6. DataPickerDialog 对话框形式日历选择器
7. TimePicker 时间选择器
8. TimePickerDialog 对话框形式时间选择器
1.ScrollView 滚动视图
当展示的内容很多屏幕显示不下时就需要用ScrollView来显示完整的视图。下图对比了有无ScrollView两种不同的情况:
可以看到当整个页面只有一个TextView时因为内容不完整视觉上感觉很不好,如果加上ScrollView,用户就可以滑动滚动条看到后面的内容。ScrollView使用起来也很容易,只要将TextView作为它的子标签就可以了,如果不想看到滚动条,可以设置属性android:scrollbars="none"隐藏起来。另外,根据需要也可以使用水平滚动视图HorizantalScrollView,替换SrollView标签就可以了。
之后在MainActivity获取TextView实例并set内容,运行之后就能看到之前的效果了。
再介绍一个监听器OnTouchListener,它可以监听ScrollView滑行情况,比如希望用户看完文本后继续添加一些文本内容,那么就可以在监听到ScrollView到达底部的事件后做出相应的动作,代码见下:
有必要对上述代码做一些解释:从event.getAction()可以监听到滑块各种状态,其中一种状态MotionEvent.ACTION_MOVE表示滑块在滑动的过程中。接下来在判断文本处于最顶端还是最低端时,使用了ScrollView三个测量高度的方法:scrollView.getChildAt(0).getMeasuredHeight()表示ScrollView第一个子标签即TextView文本内容总长度,scrollView.getHeight()表示ScrollView高度即屏幕总高度,scrollView.getScrollY()表示滚动条滑动距离。易得出当滑动距离+屏幕总高度=文本总长度时,正好到达文本最低端。调试结果如图:
2.ProgressBar 进度条
ProgressBar通常用于展示某个耗时操作完成的进度,来更好的提升用户界面的友好性。首先来学习ProgressBar几个关键属性:
max:最大显示进度
progress:第一显示进度
secondaryProgress:第二显示进度
三者关系见图:
style:进度条的类型,上图显示了四种常见的类型--大、中、小环形进度条以及水平进度条。其实每种类型的进度条显示风格也是多种多样的,以水平进度条举例,实际上style可选值中@android:style/下系统还提供了更多可选风格,比如选择第一项:
进度条就换了个风格。
ctrl点进去看这个style源码,发现整个进度条风格由很多Item共同组成,比如通过第二项progressDrawable就可以实现自定义一个进度条样式了。
介绍完ProgressBar几个关键属性后,再通过一个小demo学习它的几个关键方法。在布局里准备三个button和一个textview,用于控制进度条加减和重置以及显示进度条具体进度数据。
接着在MainActivity获取到所有控件的实例并给所有按钮都设置好监听器。为了显示初始进度百分比,从ProgressBar三个get方法分别获取到三个进度数值,经过相应的计算便可以得到了。
按钮监听事件中,进度的重置直接用set方法,而进度的增加和减少就需要increment方法,参数为正数即加,负数即减。这里让进度条每次变化十个百分比。
运行后点击增加按钮效果见图,减少和重置功能也能很好的完成:
3.ProgressDialog 对话框形式进度条
学习完ProgressBar,趁热打铁,看看Dialog的进度条如何做到。直接在上个demo布局最后再添加一个Button,用于打开一个ProgressDialog,给它设置监听器后,在点击事件里完成一个ProgressDialog的代码见下:
用ProgressDialog的各种set方法设置了对话框页面风格(进度条样式、标题和图标)、进度条属性和一个名为“确认”的按钮以及对应的点击事件,且这个对话框可通过返回键取消,最后一定要有progressDialog.show()否则之前设置都功亏一篑对话框是无法弹出来的。另外再说明一个方法setIndeterminate(),当值为true表示不精确显示进度条,比如环形进度条就会一直转圈,而值为false表示精确显示进度条,比如此例中水平进度条下就会显示刻度。运行程序后结果如下:
当点击确定按钮之后,确实弹出一个查看成功的Toast。
4.SeekBar 可拖动进度条
在我们调整音量或者听歌的时候,会有这样的进度条上面带有滑块允许用户拖动以改变当前进度的大小,这就是SeekBar。因为都是进度条,SeekBar的关键属性就不多说了,这里认识一个监听器OnSeekBarChangeListener,用于监听SeekBar上滑块运行状态。接下来通过一个小例子学习如何使用,先准备这样一个布局:
在MainActiviity给SeekBar注册监听器并具体实现三个方法,对应滑块三个状态,其中onProgressChanged()方法会返回当前进度progress数值使之显示在第一个文本框。
运行结果如下,“开始拖动”一瞬间很快就进入到“正在拖动”的状态。
5.DataPicker 日历选择器
当我们在备忘录写每日行程或设置闹钟的时候必不可少需要填写日期和时间,安卓有提供相应的选择器,帮助我们快速选择日期和时间,剩下部分就来介绍这些Picker。
DataPicker日历选择器可选择年月日,下图预览可看到就是一个很常见的日历。
既然是选择器,那么肯定可以监听到用户选择的内容,所以每个选择器固然有对应的监听器。现在做这样的小demo来看监听器的作用,标题栏显示当前日期和时间,每当用户在DataPicker上选择一个日期后,标题栏实时变化以显示当前选择的日期。
先利用系统提供的Calendar类可获取到当前年月日时分,这里注意Calendar计算月是从0开始。初始时标题栏显示当前时间。
DataPicker想要注册监听器OnDateChangedListener,要通过它的一个方法init()并提供四个参数,前三个参数正是之前获取的年月日,表示初始时日历上所显示的日期,注意月份的计算和Calendar相同,所以不需要加1,第四个参数是监听器对象。触发事件后会返回被用户选择的年月日三个参数,再显示到标题上即可。
看看运行后效果吧!
6.DataPickerDialog 对话框形式日历选择器
根据不同的需求,还可以通过对话框的形式选择日期。方法是直接在代码中new一个DataPickerDialog对象,再show()出来就完成了。和DataPicker非常相似的,初始化DataPickerDialog的时候需要五个参数,第一个参数是上下文,然后就是监听器OnDateSetListener对象,之后才是年月日。
此时程序一启动会先弹出一个对话框,用户可直接选择日期,确定后就可以看到刚刚选择的日期显示在标题上了。
7.TimePicker 时间选择器
下面来看看可选择时分的TimePicker 时间选择器,可在钟表上先选择小时的数值,再选择分钟的数值。
比DataPicker简单的是,它可以直接通过setOnTimeChangedListener()方法注册监听器OnTimeChangedListener,就不需要提供其他参数了。这里同样地在事件触发后让标题显示被选择的时分。
运行后:
8.TimePickerDialog 对话框形式时间选择器
最后一个TimePickerDialog,学到现在,是不是能很容易掌握了?注册监听器OnTimeSetListener过程如下:
运行: