Android Chronometer控件

1. Chronometer类

Chronometer是一个简单的计时器。

主要配置

  • format,显示格式,默认是"MM:SS"或"H:MM:SS",以%s来格式化。
  • countDown,是否倒计时,与base时间相比较

主要方法

  • start(),开始计时
  • stop(),停止计时
  • setBase(long),设置计时基准时间
  • setFormat(String),设置显示格式
  • setCountDown(boolean),设置是否是倒计时,只有版本大于24才有效
  • setOnChronometerTickListener(OnChronometerTickListener),设置监听器

实例代码

mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.setFormat("计时开始 %s");
mChronometer.start();

效果如下
在这里插入图片描述

2. Chronometer代码分析

start()stop()方法修改了mStarted的状态,然后调用updateRunning()
Chronometer状态由三部分组成,mVisible(Window是否可见)、mStarted(Chronometer开始计时)和isShown(View是否可见)。如果状态变化,修改当前控件。updateText(long)修改界面,dispatchChronometerTick()触发监听事件。postDelayed(Runnable, long)在一秒后修改界面。

public void start() {
    mStarted = true;
    updateRunning();
}

public void stop() {
    mStarted = false;
    updateRunning();
}

private void updateRunning() {
    boolean running = mVisible && mStarted && isShown();
    if (running != mRunning) {
        if (running) {
            updateText(SystemClock.elapsedRealtime());
            dispatchChronometerTick();
            postDelayed(mTickRunnable, 1000);
        } else {
            removeCallbacks(mTickRunnable);
        }
        mRunning = running;
    }
}

private final Runnable mTickRunnable = new Runnable() {
    @Override
    public void run() {
        if (mRunning) {
            updateText(SystemClock.elapsedRealtime());
            dispatchChronometerTick();
            postDelayed(mTickRunnable, 1000);
        }
    }
};

updateText(long)修改当前界面,首先拿当前时间和mBase时间作比较,second是两种之间的差值。DateUtilssecond格式化,一般是"MM:SS"或"H:MM:SS",输出text。如果定义了format格式,利用Formattertext进一步格式化。

private synchronized void updateText(long now) {
    mNow = now;
    long seconds = mCountDown ? mBase - now : now - mBase;
    seconds /= 1000;
    boolean negative = false;
    if (seconds < 0) {
        seconds = -seconds;
        negative = true;
    }
    String text = DateUtils.formatElapsedTime(mRecycle, seconds);
    if (negative) {
        text = getResources().getString(R.string.negative_duration, text);
    }

    if (mFormat != null) {
        Locale loc = Locale.getDefault();
        if (mFormatter == null || !loc.equals(mFormatterLocale)) {
            mFormatterLocale = loc;
            mFormatter = new Formatter(mFormatBuilder, loc);
        }
        mFormatBuilder.setLength(0);
        mFormatterArgs[0] = text;
        try {
            mFormatter.format(mFormat, mFormatterArgs);
            text = mFormatBuilder.toString();
        } catch (IllegalFormatException ex) {
            if (!mLogged) {
                Log.w(TAG, "Illegal format string: " + mFormat);
                mLogged = true;
            }
        }
    }
    setText(text);
}

dispatchChronometerTick()触发监听事件。

void dispatchChronometerTick() {
    if (mOnChronometerTickListener != null) {
        mOnChronometerTickListener.onChronometerTick(this);
    }
}

setFormat(String)设置显示格式

public void setFormat(String format) {
    mFormat = format;
    if (format != null && mFormatBuilder == null) {
        mFormatBuilder = new StringBuilder(format.length() * 2);
    }
}

setBase(long)设置计时基准时间

public void setBase(long base) {
    mBase = base;
    dispatchChronometerTick();
    updateText(SystemClock.elapsedRealtime());
}

相关文章
Android Picker控件
Android Clock控件
Android Chronometer控件
Android Handler类
Java Formatter类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值