自定义View+Handle 实现模拟时钟效果

Android自定义控件之ClockView时钟效果 最近在网上看到一个仿锤子时钟效果的源代码,在此对其代码进行阅读,修改及分析,加强自己在自定义视图方面的技术及经验,便写该文章为以后参考阅读。代码实现效果如下:    该自定义时钟由ClockView实现,其代码如下:         import android.annotation.TargetApi;import android.content.Context;i 阅读详情

初级效果

利用自定义View 绘画时钟,实现时针,分针,秒针

package com.example.liyang.customview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

import java.util.Calendar;

/**
 * paint a clock
 * Created by liyang on 2016/3/28.
 */
public class ClockView extends View implements  Handler.Callback{
    private Paint paint;
    private Handler handler = new Handler(this);
    private Bitmap bitmap;
    private BitmapShader bitmapShader;

    public ClockView(Context context) {
        this(context,null);

    }

    public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        paint = new Paint();
        handler.sendEmptyMessage(0);
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.img1);
        bitmapShader = new BitmapShader(bitmap,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP);
    }

    public ClockView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //draw a clock
        // between 200px
        // we can translate  canvas to clock'center
        canvas.save();

        // make clock in center
        canvas.translate(getWidth()/2,getHeight()/2);
        float min = Math.min(getWidth()/200.0f,getHeight()/200.f);
        canvas.scale(min,min);// let clock bigger
        canvas.drawColor(Color.WHITE);


        // draw backGround-----------------------------------
        canvas.save();
        Paint temp = new Paint();
        temp.setShader(bitmapShader);
        canvas.translate(-100, -100);
        canvas.drawCircle(100, 100, 100,temp);
        canvas.restore();
//----------------------------------------------------------------


       // canvas.translate(100,100);
        //canvas.drawColor(Color.WHITE);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        canvas.drawCircle(0,0,100,paint);

        // draw 1 2 ..
        canvas.save();
        for (int i =0; i<12;i++){
            if (i%3==0){
                paint.setStrokeWidth(7);
                canvas.drawLine(0,-100,0,-85,paint);

            }else
                paint.setStrokeWidth(5);
            canvas.drawLine(0,-100,0,-90,paint);

            canvas.rotate(30,0,0);//默认的锚点就是 00 写不写都行
        }

        // only after translate
        canvas.restore();
        Calendar calendar = Calendar.getInstance();

        //draw miao
        canvas.save();

        paint.setStrokeWidth(3);
        paint.setColor(Color.RED);

        //draw


        // calculate rotate one circle is 360  so  * 360
        canvas.rotate(calendar.get(Calendar.SECOND)*6,0,0);
        // draw miao
        canvas.drawLine(0,10,0,-90,paint);
        canvas.restore();


        //  ------------------minutes
        canvas.save();
        // move to init
        canvas.rotate(calendar.get(Calendar.MINUTE)*6+calendar.get(Calendar.SECOND)*6f/60,0,0);

        //draw line
        canvas.drawLine(0,10,0,-80,paint);
        canvas.restore();


        //  ------------------hour
        canvas.save();
        canvas.rotate(calendar.get(Calendar.HOUR)*30+calendar.get(Calendar.SECOND)*6f/3600,0,0);
        canvas.drawLine(0,10,0,-50,paint);
        canvas.restore();

        // as same start
        canvas.restore();


    }

    @Override
    public boolean handleMessage(Message msg) {

        switch (msg.what){
            case 0:


                // 通知画布去 刷新
                //同步刷新 通知 快 缺点是 只能在主线程 中有用
                invalidate();
                handler.sendEmptyMessage(0);
                //异步通知  优点是 : 可以在子线程中 使用 缺点是慢
              //  postInvalidate();
                break;
        }

        return true;
    }
}
Python游戏开发入门:Pygame核心框架与实战指南 游戏开发是理解实时交互程序设计的绝佳实践领域,其核心在于游戏主循环机制,即持续处理用户输入、更新游戏状态并渲染画面的循环过程。这一原理构成了几乎所有实时应用的基础。在技术实现上,轻量级的游戏开发库能够帮助开发者快速验证创意,聚焦于游戏逻辑本身。Pygame正是这样一个基于SDL的Python库,它通过提供直接的图形绘制、事件处理和精灵系统,降低了2D游戏开发的门槛。其技术价值在于以纯Python实现,便于教学、原型开发和算法可视化。在应用场景上,它非常适合独立游戏、教育演示和交互艺术程序。本文聚焦于Pyga 阅读详情

相关推荐

LPC2387嵌入式开发实战:ARM7架构核心外设与工业应用解析

在嵌入式系统开发领域,微控制器(MCU)的选型与深度应用是构建稳定设备的基础。其核心在于理解芯片的架构与外设工作原理,这直接决定了系统的实时性、可靠性与成本控制。ARM7TDMI-S作为经典的RISC内核,以其确定的指令执行时序和出色的能效比,在硬实时控制场景中依然具有独特价值。通过深入掌握其多层级AHB总线、向量中断控制器(VIC)及引脚连接块等硬件机制,开发者能构建出高度集成的解决方案。这种技术能力在工业控制、汽车电子等对通信接口和可靠性要求严苛的领域尤为重要。例如,集成以太网MAC、USB OTG和C

weixin_30660027的博客 414

Android——消息队列handle,多线程,自定义view

作业 postInvalidateDelayed(delaymillliseconds):重绘,调用后会在delaymilliseconds后重新调用onDraw方法画一次。 Handler机制(Android的消息队列机制): 多线程 自定义view Viewgroup绘制:查看C...

qq_35706707的博客 353

Python构建Minecraft风格体素引擎:从零实现3D游戏核心架构

游戏引擎是驱动现代电子游戏运行的核心软件框架,它负责图形渲染、物理模拟、资源管理等关键任务。其基本原理是通过游戏循环持续处理用户输入、更新游戏状态并渲染画面,实现实时交互体验。在3D游戏开发中,体素引擎作为一种特殊类型,使用三维像素(体素)构建游戏世界,具有独特的视觉风格和数据结构优势。从技术价值看,亲手实现引擎能深入理解图形管线、空间数据结构等底层原理,比使用现成引擎更能培养系统架构能力。常见的应用场景包括教育演示、原型开发以及特定风格的独立游戏制作。本文聚焦于使用Python及相关库构建Minecraf

cuhongjiao7003的博客 287

巧用Handler获取View控件信息

文章导引巧用Handler获取View控件信息为何获取宽高要如此?巧用Handler获取View控件信息为何如此就可获取到正确的值了呢? 巧用Handler获取View控件信息 众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放、大小控制并非是xml类型的layout文件完全可以搞定的。此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放在相应的位置,并限定其...

编程二三事 1300

C++工业级开发九重修炼:从现代语法到系统架构实战

C++作为一门接近系统底层的编程语言,其核心价值在于提供零成本抽象和对硬件的直接掌控力,从而实现无与伦比的运行时性能。其原理建立在资源获取即初始化的RAII哲学之上,通过智能指针、移动语义等机制,将资源生命周期与对象生命周期绑定,确保了异常安全和内存安全。这种精细的控制能力,使其在需要极致性能与稳定性的技术领域具有不可替代的价值,广泛应用于游戏引擎、高频交易系统、嵌入式设备和大型分布式后台等场景。现代C++标准引入了模块、协程、概念等新特性,持续演进着开发范式,而像CMake这样的现代构建系统和vcpkg等

lvwenwen 475

C++高性能主题统计系统:零拷贝无锁实时计数方案

在高吞吐消息处理、IoT网关和金融行情分发等C++服务中,主题维度的实时统计是运维监控、流量建模与合规审计的核心能力。其本质是面向确定性场景(主题名有限、写入高频、查询低频)的轻量级指标采集问题,需兼顾纳秒级写入开销、线程安全、内存可控与滑动窗口精度。传统方案如Prometheus client_cpp或OpenTelemetry C++ SDK因字符串序列化、动态内存分配和定时器调度引入显著延迟与抖动。本文聚焦‘零拷贝采集’与‘无锁聚合’两大关键技术路径,通过双层哈希映射(静态ID预分配+string_v

weixin_34245749的博客 414

Android 自定义 View(一) 绘制动态时钟

1. 简介在Android中, google给我们提供了非常多的原生控件,可以用来实现各种各样的效果。有时需要实现非常酷炫的效果,这时原生控件就不足以满足我们的需求了,为了实现这些效果,我们可以自己定义控件的样式。 2. 分类自定义控件可以分为三类: (1)自绘View:继承自View,自己来绘制View的内容 (2)组合View:将许多现有控件组合在一起,形成一个新的控件

二进制的博客 820

机器学习模型生产化落地:从Notebook到高韧性ML系统

机器学习模型部署不是代码上线的终点,而是工业级系统工程的起点。其核心在于构建数据、特征、模型、服务与监控五位一体的闭环体系,解决真实场景中常见的数据漂移、特征不一致、推理延迟突增及业务指标失真等顽疾。关键技术价值体现在可观测性(如白盒诊断端点)、可维护性(乐高式工具链)与韧性保障(熔断降级、影子查询)三大维度。典型应用场景覆盖金融风控、电商推荐与IoT预测等强SLA要求领域,尤其适用于已跑通Jupyter但面临线上稳定性挑战的算法与后端工程师。本文聚焦ML Ops实践中的特征服务健壮性设计、灰度发布机制与三

weixin_30340819的博客 350

【Android 自定义 View】--> 绘制时钟(表)效果

本篇文章主要介绍使用自定义 View 来实现时钟效果,灵活地使用 Android 的 Canvas,Paint, Path 的 API 以及理清 Canvas 的 save 和 restore 的意义。

Kevin Learn Android 1209

TK1嵌入式AI开发:从硬件启动到GPU加速的底层实践

嵌入式AI开发平台的核心在于理解CPU-GPU协同计算、设备树配置与Linux内核驱动交互等底层机制。NVIDIA Jetson TK1虽已停产,但其清晰的启动流程(BootROM→cboot→u-boot→kernel)、开源的Tegra Linux源码及可调试的硬件抽象层,使其成为掌握嵌入式系统启动原理、GPU内存映射、DMA对齐与中断管理的理想教学载体。相比现代高度封装的Orin或Pi平台,TK1将CUDA 6.5显存分配、OpenCV 2.4手工DNN实现、ROS Indigo消息队列瓶颈等关键问题

weixin_33743248的博客 348

Unity2021-Input-Handler:在C#中为Unity Game Engine创建的自定义输入处理程序

Unity2021-输入处理程序 在C#中为Unity Game Engine创建的自定义输入处理程序。

线程通信之handle用法

主显示布局以及代码: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an...

157

android 罗盘 源码

android 下精美 准确的罗盘

ROS工程实战课:产线级故障诊断与系统稳定性保障

ROS(Robot Operating System)作为机器人开发的事实标准,其核心价值不仅在于模块化通信架构,更体现在真实硬件环境下的鲁棒性与可诊断性。理解ROS底层原理——如节点生命周期管理、参数服务器同步机制、TF坐标系时间一致性及跨设备时钟漂移影响——是构建稳定系统的前提。技术价值在于将抽象概念转化为可测量、可审计、可回滚的工程实践,支撑AGV调度、SLAM建图、自主导航等关键场景。本文聚焦ROS在工业现场的真实运行逻辑,深入解析tf坐标系断裂、topic通信黑洞、launch契约失效等27类高频

weixin_34258838的博客 387

Windows Sysinternals Handle Viewer

可以查看文件被哪个或者哪些进程调用

DDM-MIMO-FMCW雷达速度模糊与解模糊MATLAB仿真

本文深入解析了DDM-MIMO-FMCW雷达中的速度模糊现象及其解模糊方法,通过MATLAB仿真详细展示了相位编码解调、速度扩展算法和混合波形设计三大解决方案。文章还提供了参数配置、信号建模和结果可视化的实用技巧,并分享了工程实践中的避坑指南,帮助开发者高效解决雷达信号处理中的速度模糊问题。

weixin_31528001的博客 349

TI F29 DSP如何攻克新能源汽车三电系统实时控制难题

实时控制是嵌入式系统与工业自动化的核心技术,它要求系统在严格的时间约束内对外部事件做出确定性的响应。其原理通常基于高性能微控制器、精确的定时器中断和优化的算法调度,以确保控制环路的低延迟与高精度。这项技术的核心价值在于为电机驱动、数字电源和电池管理等复杂动态系统提供稳定、高效且安全的运行基础。在新能源汽车领域,实时控制技术直接应用于电池管理系统(BMS)、电机控制器(MCU)和整车控制器(VCU)这“三电”核心,实现对电流、电压的精准采样与毫秒级闭环调节,从而提升整车能效、安全性与驾驶体验。本文聚焦的德州仪

weixin_34297704的博客 464

实测对比:DJI O3、Walksnail Avatar、HDZero三大高清图传,谁才是低延迟王者?

本文对DJI O3、Walksnail Avatar V2和HDZero三大高清图传系统进行了实测对比,重点分析其在FPV飞行中的低延迟表现。通过专业测试环境和量化数据,揭示HDZero在原生低延迟架构上的优势,DJI O3在画质与延迟间的平衡,以及Walksnail的动态码率调整特点,为不同场景下的选购提供决策依据。

weixin_30756499的博客 446

基于ESP32-P4与LVGL的嵌入式SSH控制面板开发实践

SSH(Secure Shell)是远程管理服务器和嵌入式设备的网络协议,通过加密通道实现安全登录与命令执行。其核心原理基于客户端-服务器模型,利用非对称加密进行身份验证,对称加密保障数据传输安全。在物联网和家庭实验室(Homelab)场景中,嵌入式设备常需远程管理与监控。传统SSH客户端依赖通用计算机,而嵌入式SSH则将协议栈移植到资源受限的微控制器(MCU),实现设备直连与独立交互。这要求对SSH库(如libssh2)进行深度裁剪,并解决内存管理、实时响应等挑战。技术价值在于为智能硬件、工业网关等提供本

weixin_30338497的博客 397

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

OpenClaw实操:给网站装上“智能眼睛”?手把手教你用OpenClaw实时监控网站

本文介绍如何在Windows系统使用OpenClaw构建智能网站监控助手。手把手教你通过配置本地AI模型,让openclaw构建的ai助手自动检测指定网页的内容变化,理解更新重要性,并及时通过邮件、微信、Telegram等渠道发出预警,让你第一时间掌握关键信息,彻底告别手动刷新。

plawuyue的博客 2162

多机器人协同控制:从ROS仿真到Booster T2同步行进技术解析

多机器人协同控制是机器人技术领域的关键研究方向,它通过分布式算法与通信协议,使多个机器人能够协同完成复杂任务。其核心原理在于解决机器人间的状态同步、队形保持与避障问题,技术价值体现在提升系统整体效率、鲁棒性与可扩展性。该技术广泛应用于仓储物流、工业自动化、集群表演与搜索救援等场景。本文以近期备受关注的Booster T2机器人方阵同步行进演示为具体案例,深入剖析了其背后的ROS/ROS2技术栈与实现方案,为开发者提供了从仿真验证到实物部署的完整实践路径。

weixin_33801856的博客 432

XGBoost的简单安装及入门使用

XGBoost安装及简单入门 XGBoost支持多种操作系统,如Windows, Linux, MacOS等,并支持多种语言版本,如Python, R, Scale, Java等。XGBoost的安装方式一般有两种,一种是直接通过pip安装(适合用于Python),另外一种是通过源码编译安装 1、通过pip安装 通过pip安装Python包既简单又方便,只需执行如下的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost 使用

qq_41513230的博客 3万+
上一篇: 自定义View 绘画,Sharder 瓦片模式
下一篇: Kotlin
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值