自定義Android電子時鐘控件

        參照Google的鬧鐘源碼,提取出來其中的一個部分,獲取系統的當前時間,並實時進行更新顯示,寫成一個控件view,以後有需要的話可以放在自己的App中,當做一個通用的控件來使用。本例子中只是簡單的把源代碼中的相關內容和邏輯提取了出來,並沒有做美化的工作,但思路就是這樣的,按個人喜歡去修改就可以了。該控件顯示有兩種狀態,一個是24小時制的時候會顯示形如“15:30”的風格,12小時制的時候會顯示“8:00上午”的風格,根據自己系統的設定而識別,下面的是顯示後的兩張截圖,圖中的時間顯示區域就是主要實現的控件了。


圖中上下午的顯示是根據你的系統的語言而定的,圖中是中文顯示“上午”,若英文則顯示“AM”

                                                                                                   


這個名爲DigitalClock的控件繼承自LinearLayout,並在其中做了相關的更改與控制,主要的代碼塊有如下:


註冊了一個廣播,當檢測到系統的時區內容發生變化時,更新下時間以便正確的顯示

/** 時區發生變化的廣播接收者 */
	private BroadcastReceiver receiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {
				mCalendar = Calendar.getInstance();
			}
			updateTime();

		}
	};


寫一個觀察者類,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理

/** 當時間改變時的觀察者類 */
	private class FormatChangeObserver extends ContentObserver {

		public FormatChangeObserver() {
			super(new Handler());
		}

		@Override
		public void onChange(boolean selfChange) {
			// TODO Auto-generated method stub
			super.onChange(selfChange);
			setDateFormat();
			updateTime();
		}

	}

同時還要在onAttachedToWindow()和onDetachedFromWindow()方法中對觀察者進行註冊和取消註冊

@Override
	protected void onAttachedToWindow() {
		// TODO Auto-generated method stub
		super.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();
	}


@Override
	protected void onDetachedFromWindow() {
		// TODO Auto-generated method stub
		super.onDetachedFromWindow();
		if (!mAttached)
			return;
		mAttached = false;

		getContext().unregisterReceiver(receiver);

		getContext().getContentResolver().unregisterContentObserver(
				mFormatChangeObserver);

	}

這個小控件只是安卓鬧鐘的電子鐘部分,要想實現鬧鐘還要有好多東西實現,嘗試去仿照源碼寫個小鬧鐘,不過單獨的這個控件也是蠻有用的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章