Android 高级控件(2)

本篇继续学习高级控件及独具特色的监听器,目录如下:

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过程如下:

运行:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容