• 一起Talk Android吧(第四百一十九回:让时钟走起来)


    各位看官们,大家好,上一回中咱们说的例子是"制作时钟",这一回咱们介绍的例子是"让时钟走起来"。闲话休提,言归正转,让我们一起Talk Android吧!

    看官们,我们在上一章回中制作了一个时钟,不过时钟只能显示当前的时间,不能随时间变化而变化。本章回中将让时钟走起来,也就是随着时间变化而变化。

    整体思路

    我们把时钟当作自定义的控件,可以使用View的invalidate()方法来刷新控件,刷新的频率为1秒,此时就会回调控件的onDraw()方法,进而更新时钟指针。在刷新控件时需要在子线程中操作,因此使用Handler机制来实现。

    具体步骤

    • 1.把时钟控件添加到布局中,这里使用的是完成的包名;
    <com.android..ui.ClockView
        android:id="@+id/id_clock_view"
        android:background="@color/teal_200"
        android:layout_width="400dp"
        android:layout_height="800dp">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 2.在主程序中绑定布局中的时钟控件;

      //使用数据绑定来绑定布局中的控件

      mClockView = mBinding.idClockView;
    
    • 1
    • 3.使用Handler机制来刷新控件;
       private void initHandle() {
            mHandler = new UpdateTimeHandle();
            mMessage = new Message();
            mMessage.what = 100;
    
            mHandler.sendMessage(mMessage);
            mHandler.sendMessage(new Message());
        }
    
        private class UpdateTimeHandle extends Handler {
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
    
                mClockView.invalidate();
                mMessage = mHandler.obtainMessage(100);
                //刷新时间为1秒
                mHandler.sendMessageDelayed(mMessage,1000);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    我们需要在onCreate()方法中初始化Handler,并且在onPause方法中remvoe Handler中的消息,以免引起内存泄漏。

    分析总结

    我们把时钟做成了一个控件,在其他程序中可以像使用普通控件一样去使用。因此整体上来看使用很方便。不过该控件也有一些缺点,后续我们会持续改进。

    • 没有重新计算控件的长度和宽度,影响长度和宽度属性。后续我们在介绍自定义View时会修改此问题。
    • 部分长度写成了固定数值,比如表盘的半径,这样会影响控件兼容,有可能换一个布局后控件显示不美观。
    • 在绘制显示时间的数字时没有计算数字的宽度和高度,导致部分数字显示的位置不准确。
    • 从性能角度看,我们是整体刷新控件的,这个在性能上表现不太好,比如表盘绘制完成后就不需要刷新了,只需要刷新指示时间的指针就可以,后续也会对此做性能上的优化。

    以上内容是我对时钟控件的分析和总结,大家也可以发表自己的观点,欢迎大家在评论区交流与讨论。

    看官们,关于Android中"让时钟走起来"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

  • 相关阅读:
    自制OS 5-1==用C语言不用C库写内核。一个独立内核OS的制作
    链表oj题 && 链表与LinkedList && 栈的概念 && 队列的概念 && 树和二叉树
    Compact格式下MySQL的数据如何存储到磁盘
    离线方式安装supervisor
    新手必看!!附源码!!STM32通用定时器输出PWM
    Android--Retrofit2执行多个请求任务并行,任务结束后执行统一输出结果
    小程序隐私保护授权处理方式之弹窗组件
    【Leetcode】1030. Matrix Cells in Distance Order
    2022系统分析师下午卷(案例分析)
    css 文字溢出问题
  • 原文地址:https://blog.csdn.net/talk_8/article/details/127934112