Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> 重繪TextView類演示Android的Handler

重繪TextView類演示Android的Handler

編輯:初級開發

今天Android123通過DigitalClock類講解下android平台下自繪TextVIEw類,演示下相關的Handler、Runnable線程和Observer觀察者類。首先我們回憶下上次 android自定義VIEw實例AnalogClock源碼 一文中的自繪控件,上次主要是重寫View類onDraw方法實現自己繪制,本次我們直接從TextVIEw控件來實現自己的數字時鐘控件。

  1. 將涉及android平台UI線程的更新原理 Handler、Runnable

  2. 對於Content數據存儲對象可以使用Observer觀察者類來獲取SQLite數據庫的變化

  3. 由於本次沒有改變控件的外觀顯示特性,所以沒有重寫TextView的onDraw方法,當然TextView也是從VIEw中繼承的所以可以直接調用基類的onDraw方法。Android開發網提示目前所有Android控件包android.widget.XXX都是從android.view.VIEw類繼承的。

public class DigitalClock extends TextVIEw {

    Calendar mCalendar;
    private final static String m12 = "h:mm:ss aa";
    private final static String m24 = "k:mm:ss";
    private FormatChangeObserver mFormatChangeObserver;

    private Runnable mTicker;
    private Handler mHandler;

    private boolean mTickerStopped = false;

    String mFormat;

    public DigitalClock(Context context) {
        super(context);
        initClock(context); //資源初始化,本次為了清晰直接放到獨立的initClock方法中實現。
    }

    public DigitalClock(Context context, AttributeSet attrs) {
        super(context, attrs);
        initClock(context); //同上
    }

    private void initClock(Context context) {
        Resources r = mContext.getResources();

        if (mCalendar == null) {
            mCalendar = Calendar.getInstance();
        }

        mFormatChangeObserver = new FormatChangeObserver(); //構造一個Observer
        getContext().getContentResolver().registerContentObserver(Settings.System.CONTENT_URI, true, mFormatChangeObserver); //注冊該對象,用於檢查小時制

        setFormat();
    }

    @Override
    protected void onAttachedToWindow() {
        mTickerStopped = false;
        super.onAttachedToWindow();
        mHandler = new Handler();

          mTicker = new Runnable() { //開一個線程獲取系統時間變化,這點和上次接收action而言性能更高,可以獲取到毫秒的精度

                public void run() {
                    if (mTickerStopped) return;
                    mCalendar.setTimeInMillis(System.currentTimeMillis());
                    setText(DateFormat.format(mFormat, mCalendar));
                    invalidate();
                    long now = SystemClock.uptimeMillis();
                    long next = now + (1000 - now % 1000);
                    mHandler.postAtTime(mTicker, next);
                }
            };
        mTicker.run();
    }

    @Override
    protected void onDetachedFromWindow() { //android開發網上次的AnalogClock中已經詳細講述,這裡CWJ不再贅述
        super.onDetachedFromWindow();
        mTickerStopped = true;
    }

    private boolean get24HourMode() {
        return android.text.format.DateFormat.is24HourFormat(getContext());
    }

    private void setFormat() { //設置小時制
        if (get24HourMode()) {
            mFormat = m24;
        } else {
            mFormat = m12;
        }
    }

    private class FormatChangeObserver extends ContentObserver { //android123提示大家應該多了解下ContentObserver,用處很大
        public FormatChangeObserver() {
            super(new Handler());
        }

        @Override
        public void onChange(boolean selfChange) {
            setFormat();
        }
    }
}

  通過本次DigitalClock類的了解,可以看到android平台的控件重繪以及消息處理很簡單吧,其實本節的涉及到的Observer類可以做很多底層的事情,由於可以捕獲SQLite數據庫的變化,聰明的你可以想象到設計哪些安全產品了吧。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved