自定义Android电子时钟控件
16lz
2021-01-26
参照Google的闹钟源码,提取出来其中的一个部分,获取系统的当前时间,并实时进行更新显示,写成一个控件view,以后有需要的话可以放在自己的App中,当做一个通用的控件来使用。本例子中只是简单的把源代码中的相关内容和逻辑提取了出来,并没有做美化的工作,但思路就是这样的,按个人喜欢去修改就可以了。该控件显示有两种状态,一个是24小时制的时候会显示形如“15:30”的风格,12小时制的时候会显示“8:00上午”的风格,根据自己系统的设定而识别,下面的是显示后的两张截图,图中的时间显示区域就是主要实现的控件了。
图中上下午的显示是根据你的系统的语言而定的,图中是中文显示“上午”,若英文则显示“AM”
这个名为DigitalClock的控件继承自LinearLayout,并在其中做了相关的更改与控制,主要的代码块有如下:
注册了一个广播,当检测到系统的时区内容发生变化时,更新下时间以便正确的显示
/** 时区发生变化的广播接收者 */private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubif (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {mCalendar = Calendar.getInstance();}updateTime();}};
写一个观察者类,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理
/** 当时间改变时的观察者类 */private class FormatChangeObserver extends ContentObserver {public FormatChangeObserver() {super(new Handler());}@Overridepublic void onChange(boolean selfChange) {// TODO Auto-generated method stubsuper.onChange(selfChange);setDateFormat();updateTime();}}
同时还要在onAttachedToWindow()和onDetachedFromWindow()方法中对观察者进行注册和取消注册
@Overrideprotected void onAttachedToWindow() {// TODO Auto-generated method stubsuper.onAttachedToWindow();if (mAttached)return;mAttached = true;IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_TIME_CHANGED);filter.addAction(Intent.ACTION_TIME_TICK);filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);getContext().registerReceiver(receiver, filter);mFormatChangeObserver = new FormatChangeObserver();getContext().getContentResolver().registerContentObserver(Settings.System.CONTENT_URI, true, mFormatChangeObserver);updateTime();}
@Overrideprotected void onDetachedFromWindow() {// TODO Auto-generated method stubsuper.onDetachedFromWindow();if (!mAttached)return;mAttached = false;getContext().unregisterReceiver(receiver);getContext().getContentResolver().unregisterContentObserver(mFormatChangeObserver);}
这个小控件只是安卓闹钟的电子钟部分,要想实现闹钟还要有好多东西实现,尝试去仿照源码写个小闹钟,不过单独的这个控件也是蛮有用的。
更多相关文章
- 如何利用Activity的Dialog风格完成弹出框设计 “第二届 Google
- Android窗口管理服务WindowManagerService显示窗口动画的原理分
- 实用的Log打印类封装,助尼快速定位源码(android)
- 实现ListView的条目下自动隐藏显示Button的方法
- Android(安卓)webView中无法显示Twitter主页
- 在Android(安卓)studio 中配置高德地图api后显示地图遇到的问题
- Android(安卓)菜单开发自定义效果
- android GridView设置边框教程。
- Android在OnCreate中获取控件的宽度和高度