Android 计时器Chronometer 使用及源码分析(1),android音视频框架

这篇具有很好参考价值的文章主要介绍了Android 计时器Chronometer 使用及源码分析(1),android音视频框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_textview_chronometer);//加载布局文件

initView();

}

private void initView() {

btn_start = findViewById(R.id.btn_start);

btn_stop = findViewById(R.id.btn_stop);

btn_reset = findViewById(R.id.btn_reset);

chronometer = findViewById(R.id.chronometer);

btn_start.setOnClickListener(this);

btn_stop.setOnClickListener(this);

btn_reset.setOnClickListener(this);

chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

@RequiresApi(api = Build.VERSION_CODES.N)

@Override

public void onChronometerTick(Chronometer chronometer) {

MLog.e(String.valueOf(chronometer.getBase()));

//当前时间-基准时间>20秒

if(SystemClock.elapsedRealtime()-chronometer.getBase()>20*1000)

{

chronometer.setCountDown(true);

}

}

});

btn_format_1 = findViewById(R.id.btn_format_1);

ch_format = findViewById(R.id.ch_format);

btn_format_1.setOnClickListener(this);

ch_format.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

@Override

public void onChronometerTick(Chronometer chronometer) {

//当前时间-基准时间

long time = SystemClock.elapsedRealtime()-chronometer.getBase();

Date d = new Date(time);

SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”, Locale.US);

sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));

//设置为HH:mm:ss格式

ch_format.setText(sdf.format(d));

}

});

}

@RequiresApi(api = Build.VERSION_CODES.N)

@Override

public void onClick(View v) {

switch (v.getId()){

case R.id.btn_start:

//SystemClock.elapsedRealtime(),自启动以来经过的毫秒数。

//设置基准时间

chronometer.setBase(SystemClock.elapsedRealtime());

//true,倒计时

chronometer.setCountDown(false);

chronometer.setFormat(“计时: %s 秒”);

//开始计时

chronometer.start();

break;

case R.id.btn_stop:

//结束计时

chronometer.stop();

//文字显示

ch_format.setText(“00:00”);

break;

case R.id.btn_reset:

//重置基准时间

chronometer.setBase(SystemClock.elapsedRealtime());

break;

case R.id.btn_format_1:

ch_format.setBase(SystemClock.elapsedRealtime());

ch_format.setCountDown(false);

ch_format.start();

break;

}

}

}

Format格式修改

将Format默认的显示格式是00:00(MM:SS),修改为00:00:00(H:MM:SS)的显示格式。

只要Chronometer发生变化,**「onChronometerTick」**都会被触发,所以我们可以在触发后进行处理。得到我们想要显示样式。

ch_format.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

@Override

public void onChronometerTick(Chronometer chronometer) {

//当前时间-基准时间

long time = SystemClock.elapsedRealtime()-chronometer.getBase();

Date d = new Date(time);

SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”, Locale.US);

sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));

//设置为HH:mm:ss格式

ch_format.setText(sdf.format(d));

}

});

源码分析


setBase()

public void setBase(long base) {

//设置基准时间

mBase = base;

//触发监听事件

dispatchChronometerTick();

//修改当前界面

updateText(SystemClock.elapsedRealtime());

}

dispatchChronometerTick()

//触发监听事件

void dispatchChronometerTick() {

if (mOnChronometerTickListener != null) {

mOnChronometerTickListener.onChronometerTick(this);

}

}

updateText()

「修改当前界面」,首先拿**「当前时间和mBase时间作比较」,second是两种之间的「差值」**。DateUtils把second格式化,一般是"MM:SS"或"H:MM:SS",输出text。

如果定义了format格式,利用Formatter将text进一步格式化。

//修改

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);

}

start()

public void start() {

mStarted = true;

updateRunning();

}

stop()

public void stop() {

mStarted = false;

updateRunning();

}

updateRunning()

「start()」 和**「stop()」** 方法修改了**「mStarted」的状态,然后调用「updateRunning()」。 Chronometer状态由三部分组成,「mVisible」(Window是否可见)、「mStarted」(Chronometer开始计时)和「isShown」**(View是否可见)。

如果状态变化,修改当前控件。

  • updateText(long)修改界面。

  • dispatchChronometerTick()触发监听事件。

  • postDelayed(Runnable, long)在一秒后修改界面。

private void updateRunning() {

boolean running = mVisible && mStarted && isShown();

if (running != mRunning) {

if (running) {

updateText(SystemClock.elapsedRealtime());

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

结尾

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

Android 计时器Chronometer 使用及源码分析(1),android音视频框架,程序员,android,音视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-851478.html

着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

[外链图片转存中…(img-8I1s4c6P-1712364550910)]

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-A3vKHKBY-1712364550911)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

到了这里,关于Android 计时器Chronometer 使用及源码分析(1),android音视频框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Unreal Engine11:触发器和计时器的使用

    Unreal Engine11:触发器和计时器的使用

    主要是介绍一下触发器和计时器的使用; 1. 新建一个C++类 创建的C++类也是放在Source文件夹中的Public和Private文件夹中; 选择Actor作为继承的父类; 头文件包括一个触发器和两个静态网格,它们共同组成一个Actor,定义如下: cpp 文件的构造函数实现如下: 一些注意的点如下:

    2024年02月03日
    浏览(8)
  • 【嵌入式】STM32计时器编码器接口模式使用

    【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(9)
  • Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化

    Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 本篇文章为大家带来的仍然是多线程编程,计时器是许多场景都会应用到的一个非常方便快捷实用的类。 🦉定时器,顾

    2024年02月04日
    浏览(11)
  • 14、计时器、定时器设计与应用

    14、计时器、定时器设计与应用

    掌握同步四位二进制计数器 74LS161 的工作原理和设计方法 掌握时钟/定时器的工作原理与设计方法 任务 1:采用行为描述设计同步四位二进制计数器 74LS161 任务 2:基于 74LS161 设计时钟应用 1.创建工程并创建 Verilog 文件 建立 HDL 类型的工程 My74LS161,创建 Verilog 文件 My74LS161,

    2024年02月03日
    浏览(6)
  • 51单片机通过计时器实现倒计时

    51单片机通过计时器实现倒计时

    软件 : Keil5+Proteus7 元件 : AT89C51 * 1,7SEG-MPX2-CA * 1

    2024年02月16日
    浏览(43)
  • WPF计时器功能

    WPF计时器功能

    本文实现WPF的计时器功能是通过system.timers.timer这个组件实现的。现在网上相关的资料有很多,我只是在自己的工作中刚好遇到要实现这个功能,中间也走了很多的弯路,不停的参考网上现有的资源,终于实现了基本的定时功能。希望本文可以帮助到您,让您花更少的时间来完

    2024年02月05日
    浏览(13)
  • java计时器

    java计时器

      在 Java中,我们有一个重要的概念:同步和异步。同步就是 Java中的线程安全,异步就是 Java中的线程非安全。 在使用 JVM时,我们一般都是用 start ()方法启动一个线程,然后设置时间,比如定时器,定时器是在某个指定的时间执行相应的任务。但是,在实际应用中,我们

    2023年04月18日
    浏览(12)
  • 555计时器原理

    555计时器原理

    以Multisim上的555计时器为例: 图0.0 555计时器包含八个引脚 分别为: RST - Reset 复位引脚(低电平有效) DIS - Discharge 三极管集电极Collector输入引脚 THR - Threshold 上阈值电压引脚 TRI - Trigger 触发引脚 CON - Control voltage 1 电压控制引脚 OUT - Output 信号输出引脚 VCC GND 555定时器内部功能图

    2024年02月05日
    浏览(10)
  • 24秒计时器

    24秒计时器

    方案一:采用计数器(74LS192)作为核心部分。同时选择(74LS47)作为BCD码译码器来对7段数码显示管进行译码驱动,两个七段共阳数码显示管进行显示。采用计时器(NE555)制成的多谐振荡器,进行秒脉冲的输入。因为我们需要对其进行暂停、清零、报警和自动清零等控制,所

    2024年02月06日
    浏览(21)
  • Qt实现计时器

    Qt实现计时器

    一、样图 二、代码 mainwidow.h mainwindow.cpp main.cpp ui_mainwindow.h

    2024年02月07日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包