安卓Android自定义控件:200行代码实现一个简约时钟

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

上效果图: 


以下标记一些绘图的核心点:


① 测量自定义view的大小

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = getDimension(DEFAULT_WIDTH, widthMeasureSpec);
    int height = getDimension(DEFAULT_HEIGHT, heightMeasureSpec);
    viewW = width;
    cenP.x = viewW / 2;
    cenP.y = height / 2;
    radius = Math.min(viewW, height) / 2;
    setMeasuredDimension(width, height);
}

private int getDimension(int defaultSize, int measureSpec) {
    int result;
    int measureMode = MeasureSpec.getMode(measureSpec);
    int measureSize = MeasureSpec.getSize(measureSpec);
    if (measureMode == MeasureSpec.EXACTLY) {
        result = measureSize;
    } else if (measureMode == MeasureSpec.AT_MOST) {
        result = Math.min(defaultSize, measureSize);
    } else {
        result = defaultSize;
    }
    return result;
}

自定义控件的一般测量测量方式, 大家温习一下


②获取系统时间,这里我使用的是Calendar,非常方便,小小的不足是返回时间是24制式

private void getTime() {
    Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int min = calendar.get(Calendar.MINUTE);
    int sec = calendar.get(Calendar.SECOND);
    if (hour > 12) {
        hour = hour - 12;
    }
    angelS = 360 * sec / 60f;
    angelM = 360 * min / 60f + sec / 60f;
    angelH = 360 * hour / 12f + 360 * min / (60 * 12f) + 360 * sec / (60 * 60 * 12f);
    angelStartS = angelS;
    angelStartM = angelM;
    angelStartH = angelH;
    dateOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
    dateOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
}
这里获取的系统时间作用:计算进入View时,时针、分针、秒针的角度——也就是一开始的初始角度。【这是最重要的一步】


之后的表针转动问题就相对简单了——获取每帧秒针角度angleS,则每帧分针角度angleM = angleS/60,每帧时针角度angleH = angle/3600。


**这里多说几句: 为了实现指针跟随系统时间,我首先想到的使用Animation,而没有使用线程去一直跑。

因为本自定义控件就是简单实现一个时钟,所有工作都可以交给主线程完成,所以使用Animation更为方便,然后通过设置周期单元duration 和 插值器Interpolator 以及循环属性repeatMode和循环次数数repeatCount,这样一个跟随系统时间,简单方便的逻辑就基本形成。


有了清晰的思路,接下来的工作就按部就班了:


首先,我们来获取绘制表盘背景所需要的Bitmap ,

然后初始化一下绘画的一些相关对象:

private void init() {
    src = BitmapFactory.decodeResource(getResources(), R.drawable.iron_bg);
   
    //初始化绘画相关
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    cenP = new PointF();
    path = new Path();
    Animation animation = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            float mAngelS = 24 * 60 * 360 * interpolatedTime;
            angelS = angelStartS + mAngelS;
            angelM = angelStartM + mAngelS / 60f;
            angelH = angelStartH + mAngelS / 3600f;
            invalidate();
        }
    };
    animation.setDuration(24 * 60 * 60 * 1000);//一天24个小时为一个周期
    animation.setRepeatCount(Animation.INFINITE);
    animation.setRepeatMode(Animation.REVERSE);
    animation.setInterpolator(new LinearInterpolator());
    startAnimation(animation);
}

有了这些工作,之后剩下的就是绘制各个图形元素了:

首先绘制背景图,这里因为表盘是圆形的,所以使用到Path,通过画布canvas.clipPath()剪裁已经添加了圆形路径的path,得到我们需要的圆形画布,然后在画布上绘制图片。

【**View 绘画的思路跟ps很相似, 当然了如果你没有使用过ps, 那么更形象的比喻就是,跟裁缝剪裁衣服一样。不同的是,裁缝更多的时候是拼接,而画布则更多的是层叠。】

mPaint.setAntiAlias(true);
path.reset();
path.addCircle(cenP.x, cenP.y, radius, Path.Direction.CW);
canvas.clipPath(path);
canvas.drawBitmap(src, 0, 0, mPaint);
path.close();

绘制好了背景,再来为表盘加一个黑色边框

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(6.18f * 2);
mPaint.setColor(Color.BLACK);
canvas.drawCircle(cenP.x, cenP.y, radius, mPaint);

接下来是什么? 。。。。。。聪明的你或许想到,接下来就是绘制表盘刻度, 然后是表针...done

但是先让我们绘制日期和星期 —— 因为前面说到了, View的绘制是层叠的,而现实中指针肯定实在日期和星期的上面, 所以必须先绘制出较底层的层次:

//日期
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(0);
mPaint.setTextSize(44);
canvas.drawText(String.valueOf(dateOfMonth), cenP.x + radius / 4, cenP.y + 22, mPaint);
//星期
mPaint.setTextSize(44);
String weekDay = null;
switch (dateOfWeek) {
    case 1:
        weekDay = "SUN";
        break;
    case 2:
        weekDay = "MON";
        break;
    case 3:
        weekDay = "TUE";
        break;
    case 4:
        weekDay = "WED";
        break;
    case 5:
        weekDay = "THU";
        break;
    case 6:
        weekDay = "FRI";
        break;
    case 7:
        weekDay = "SAT";
        break;
    default:
        break;
}
assert weekDay != null;
canvas.drawText(weekDay, cenP.x + radius / 2, cenP.y + 22, mPaint);

那么这里,我们就来到了指针的绘制步骤啦:

//绘制时针
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(20f);
float hLen = radius / 2f;
canvas.drawLine(cenP.x, cenP.y, (float) (viewW / 2f + hLen * Math.sin(angelH * Math.PI / 180f)),
        (float) (radius - hLen * Math.cos(angelH * Math.PI / 180f)), mPaint);

//绘制分针
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(12.5f);
float mLen = 2 * radius / 3f;
canvas.drawLine(cenP.x, cenP.y, (float) (viewW / 2f + mLen * Math.sin(angelM * Math.PI / 180f)),
        (float) (radius - mLen * Math.cos(angelM * Math.PI / 180f)), mPaint);

//绘制秒针
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(5f);
float sLen = 5 * radius / 6f;
canvas.drawLine(cenP.x, cenP.y, (float) (viewW / 2f + sLen * Math.sin(angelS * Math.PI / 180f)),
        (float) (radius - sLen * Math.cos(angelS * Math.PI / 180f)), mPaint);

*** 需要简单说一下,,,因为时、分、秒针长度不同, 则我们先设定各个指针的长度,然后指针长度和设定的画笔大小、颜色, 依据各自的角度绘制出一条线,即我们的指针。

***另外,时、分、秒针的绘制顺序依据 (先——时 - 分 - 秒——后),原因同上,就是个层叠问题哈


为了让三个指针看上去更加真实, 而不是简单的将三根线段堆叠在一起,这里还需要在指针轴心点绘制一个圆点,覆盖在最顶层的秒针上。

这样就像我们真实的手表一样啦——三根针一次层叠,然后一根轴心柱插在交点处,如此很好理解啦, 代码如下:

mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.WHITE);
canvas.drawCircle(cenP.x, cenP.y, radius / 30, mPaint);

哈哈,快到站咯...........................

忘了点什么? 

对, 我们的刻度呢? ———— 为了避免遮盖,这里我们最后绘制刻度。   为了简单,我简单的绘制了1——12个文字,没有真的绘制出刻度(计算是个大而细的工作,各位可以根据自己喜好去慢慢实现, 原理都简单、相似, 但是过程复杂,呵呵( ̄▽ ̄)")


//12个点
float txtSize = 35f;
mPaint.setTextSize(txtSize);
mPaint.setStrokeWidth(3.09f);
float rR = radius - 35f;
for (int i = 0; i < 12; i++) {
    String txt;
    if (i == 0) {
        txt = "12";
    } else {
        txt = String.valueOf(i);
    }
    canvas.drawText(
            txt
            , (float) (viewW / 2f - txtSize / 2f + rR * Math.sin(i * 30 * Math.PI / 180f))
            , (float) (radius + txtSize / 2f - rR * Math.cos(i * 30 * Math.PI / 180f))
            , mPaint);

}

-----------------------------------------------------------------------------------------------Moses 分割线---------------------------------------------------------------------------------------------------------------


最后,但绝不是最次要的来了。 ——————如何,让我们的指针跑起来——前面说了,我们使用Animation:


Animation animation = new Animation() {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        float mAngelS = 24 * 60 * 360 * interpolatedTime;
        angelS = angelStartS + mAngelS;
        angelM = angelStartM + mAngelS / 60f;
        angelH = angelStartH + mAngelS / 3600f;
        invalidate();
    }
};
animation.setDuration(24 * 60 * 60 * 1000);//一天24个小时为一个周期
animation.setRepeatCount(Animation.INFINITE);
animation.setRepeatMode(Animation.REVERSE);
animation.setInterpolator(new LinearInterpolator());
startAnimation(animation);


注意一下几点: ①定义一个循环,单元为24小时,也就是一天。————从进入该时钟View开始,各个指针将在24小时后回到进入时的状态(位置、角度)。

     ②一个循环完成后,Animation重复repeat起来,这样,一个简约而不无乐趣的时钟控件就完成啦。


所有代码在222行左右, 如果出去添加表盘背景图片, 180行足够。  

以上!


附上源码地址: http://download.youkuaiyun.com/detail/donmoses/9138165点击打开链接




安卓14我们该知道的一切(从隐私到可访问性等等) 4 月 12 日,谷歌发布了第一个 Android 14 测试版,标志着今年晚些时候稳定发布的 Android 14 道路上的另一个里程碑。Google手机已经可以使用Android 14安装手机上安装预览版,使用其他品牌手机的用户将需要等待几个月后OEM特定的版本。早期预览版也让我们很好地了解了有关功能和调整的期望。让我们来看看 Android 14 中的新功能。 阅读详情

相关推荐

安卓自动化脚本技术解析:从无障碍服务到支付安全

自动化脚本技术是移动应用开发和测试领域的重要工具,其核心原理在于模拟用户操作以实现流程自动化。在安卓平台上,主要技术路径包括无障碍服务、ADB命令以及注入式框架等,它们分别从系统辅助、调试接口和进程注入等层面实现自动化交互。这项技术的价值在于提升测试效率、辅助功能开发以及进行安全审计,广泛应用于UI自动化测试、兼容性验证和性能监控等场景。其中,无障碍服务因其无需Root权限和系统级支持的特点,成为最主流的合规方案,而支付环节的自动化则涉及模拟点击已授权的免密协议或拦截支付令牌等敏感操作,必须严格在安全与法律

chengyixian7877的博客 384

Android Studio实现简单的自定义钟表

在安卓开发中,当系统自带的View已经无法满足项目需求时,就要自定义View。在Android中是没有与钟表有关的View,因此我们制作一个简单的钟表View,这样就可以在其他项目中进行使用。自定义钟表具有表盘,表盘上有12个刻度,有时针、分针、秒针,和家里面的石英表样式相同,用于显示时间会比数码表更加有内涵。总的来说,本次自定义钟表项目可以学习到编程技巧,并且加深对Canvas API的理解。大家可以考虑添加一些定制选项,如不同的表盘样式、颜色或字体,以便用户可以根据自己的喜好来个性化他们的时钟;

振华OPPO的博客世界 3379

Android桌面数字时钟实例编程

在项目的res文件夹中,找到xml文件夹并右键点击它,选择"New" -> “App Widget” -> “App Widget Configuration Activity”。在项目的res文件夹中,找到layout文件夹并右键点击它,选择"New" -> “Layout resource file”。然后点击"OK"按钮。在弹出的对话框中,输入文件名"widget_info",然后点击"OK"按钮。在应用程序中,长按桌面空白处,选择"小部件",然后找到您创建的数字时钟小部件并将其拖动到所需的位置。

SVIPCODE的博客 515

android使用canvas绘制量角器(kotlin)

最近有一个项目需要一个量角的功能,简单说就是能够在屏幕上绘制两条线行成夹角并得到夹角角度,下面来看看具体实现流程: 1、在layout布局中放置一个ImageView(iv_canvas) 2、首先定义默认画笔paint,画笔的几个属性一看就知道是什么意思,这里就不在讲解了: paint = Paint() paint!!.strokeWidth = 16f paint!!.color =...

XiaZhenghang的博客 1594

Android开发量角器,Paint绘制量角器,使用传感器获测量角度,使用相机预览。

Android开发量角器,Paint绘制量角器,使用传感器获测量角度,使用相机预览。

Android绘图之Paint的使用方法详解

主要给大家介绍了关于Android绘图之Paint使用的相关资料,文中通过示例代码介绍的非常详细,并给大家介绍了DrawText 基线确定的方法,需要的朋友可以参考借鉴,下面随着小编来一些学习学习吧。

Android自定义View实现方位刻度尺(类似于吃鸡手游)

Android自定义View实现方位刻度尺(类似于吃鸡手游) 先上效果图 gif可能看不清,我下面放几张图片 原理分析 首先,我们应该把看得到的内容从上至下分成三部分:最上面的文字、中间的竖线和最下面的三角形。 其次,每个竖线的间隔,根据屏幕宽度均分为10等份,每等分是5°,最小刻度单位1°(相当于1等份里又分成了5等份),屏幕上显示的区间间隔为50°。所以,每次...

求知的程序员 1964

华为Atlas200DK实战指南:从零搭建AI开发环境到人像语义分割模型部署

本文提供了一份详尽的华为Atlas 200DK AI开发环境搭建与模型部署实战指南。文章采用合设环境方案,从SD卡准备、系统镜像烧录、网络配置到必备工具安装,逐步引导开发者完成环境搭建。核心部分详细讲解了如何利用华为ATC工具将TensorFlow模型转换为昇腾专用格式,并最终成功编译和运行人像语义分割模型,实现实时人像识别效果。

weixin_29309213的博客 356

Android自定义View实现时钟效果ClockView

目录目录 废话不多说先上图 分析 SurfaceView注意事项 废话啰嗦完了 咱们开始实战 总结 Tips1.废话不多说先上图 录制的可能略卡,三次时间图片是因为我分别点了下面三个按钮的效果,并非bug2.分析 观看上图咱们需要绘制的有:时针 分针 秒针 时刻度 秒刻度 仪表盘上的数字 上下午区分标识(AM/PM) View与Surface的取舍:View一般用于绘制静态页面或者界面元素跟随用户的

chuwe1的博客 2776

ArcGIS Pro中协同区位熵方法在商业选址分析中的应用

本文详细介绍了如何利用ArcGIS Pro中的协同区位熵方法进行科学的商业选址分析。该方法通过量化目标客户与竞争对手在空间上的关联程度,精准识别市场空白区与竞争红海,帮助决策者从“凭感觉”转向“用数据说话”,有效提升选址成功率和投资回报。

weixin_29214559的博客 359

从放弃到再入门之拉格朗日对偶问题推导

普通同学的解法 无约束条件:求导就可以了 等式约束:代入消元,再求导 不等式约束:分情况讨论(在边界上和不在边界上),分别对应1,2的情况 然而发现,有些情况消元特别复杂,甚至不能求解 聪明同学的解法 发现:在最优点的情况下,约束曲面的法向量和目标函数的梯度反向必相同或相反 拉格朗日乘子法如何理解? (在2维里可以形象的解释为z=f(x,y)在约束条件g(x,y)=c中,极值...

qq_34564612的博客 1万+

Android之Canvas自定义画一个时钟

Android之Canvas自定义画一个时钟自定义控件,在安卓是也是一种无所不能的技术了,所有自带控件,以及组合自带控件不能实现的一些效果,我们都可以通过自定义控件来实现,不过,如果能有系统控件使用的就用系统自带的控件去实现,而不必要用自定义去实现,我们都知道,自定义控件在一定的程度上,效率往往会比系统自带的控件效率低,所以我不到万不得已,不要使用自定义控件,今天用自定一控件,实现一个小小的时钟,具

GodV的博客 1163

angular中访问本地json文件

先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g...

蜗牛~~ 1830

android身高控件_安卓自定义滑动刻度尺,选择身高体重等

由于最近项目需求,需要一个滑动的刻度尺来选择会员体重,所以自己写了一个选择体重的控件,成品效果就不展示了,下边直接上代码描述基本原理,以及基本的效果:package view;import android.annotation.TargetApi;import android.content.Context;import android.content.res.TypedArray;import ...

weixin_39602891的博客 338

零基础学写《扫雷》游戏(Qt扫雷源码)

扫雷游戏是在windows系统中自带的游戏,他的游戏玩法其实很简单,20世纪初期电脑上没有啥游戏可以玩,所以扫雷游戏也算是当时是最常火爆的一个电脑游戏。以下文章详细介绍扫雷游戏的实现。实现语言为C++。

啊渊的专栏 1万+

要理解成本中心与利润中心的根本区别与适用场景,需从 “责任范围、考核核心、管理目标” 三个核心维度切入,同时明确二者在企业管理体系中的联动关系

摘要: 成本中心与利润核心区别在于责任范围、考核目标和管理权限。成本中心仅对成本负责(如生产、行政部门),考核成本控制能力;利润中心需同时管控成本与收入(如独立产品线、区域分公司),以利润为核心指标。选择标准取决于单元是否拥有收入决策权:无收入权的支持/执行部门设为成本中心,能独立经营、核算盈亏的单元设为利润中心。二者协同运作,成本中心为利润中心提供基础支持,利润中心的需求动态影响成本中心资源配置,共同实现企业整体目标。划分本质是确保考核指标与责任范围匹配,避免管理失效。

金牌架构师 657

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

本章回中主要介绍了如何让时钟动起来的方法,先是介绍整体思路,接着介绍具体的实现步骤,并且配有详细的文字说明和代码。最后对时钟控件做了分析和总结,总结了它的优缺点。

talk_8的专栏 783

如何用matlab扫频法测考虑频率耦合的并网逆变器的序阻抗,如何实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1193

Android自定义控件View(实现控件的动画效果,自定义类画简略时钟,TextView中文字逐一显示,动态设置progress的圆环/扇形ProgressBar等)

工作内容: 自定义控件——实现动画效果(TextView中文字逐一显示) 学习分享: 第一步:.新建一个java类继承自View,内容如下: import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graph

风吹草低见牛羊 1440

嵌入式工程师成长之路(2)——电路设计

为什么你的电源模块总是发热炸机?DC/DC和LDO选型的“潜规则”你踩坑了吗? LM2596降压芯片用错电容导致输出振荡?LED恒流驱动设计让灯珠寿命缩水50%?24V转12V方案成本超预算被老板狂喷?——这些血泪教训,谁能懂得!

云轩阁 13万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

圆形时钟控件

这是我在一个项目中用到的时钟控件,也是在网上找的别人的代码,在这记一下,为了以后用到的时候便于找到。 package com.example.administrator.wy_exclusivecalender.view;/** * Created by qby on 2017/1/21 0021. */import android.content.Context; import androi

brave_shine的博客 3349

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android自定义view实现一个钟表

先看效果图: 自定义view大家肯定已经不陌生了,所以直接今天直接步入正题:如何利用canvas去绘制出一个钟表 当然绘制之前我们必须进行测量(重写onMeasure),根据自己的规则去测量,这暂时是将控件限制为一个正方形。 首先我们先把钟表分解,看它由哪几部分组成。如上图:钟表包括表盘(刻度)和表针还有文字构成。 分清结构之后我们再明确canvas需要画什么,表盘的构成其实就是...

implements 2522

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

自定义控件-时钟

1:做这个控件让自己对自定义控件的概念更加熟悉,总结一下 canvas.save(); 和canvas.restore();这两个方法要是没有用到还好,用到了却没能了解这个用法,会让很多人搞不明白,这两个的作用究竟是什么,首先最最重要的一点是这两个函数是配对使用的,没错,假如使用了save,那么restore后就能回到save前的canvas状态,如果直接restore而不save,那么canv

qq_29333911的博客 416

android 时钟进度加载器

接触过很多等待加载的View,今天就给大家介绍自写控件实现时钟加载View,不多说废话,开始。一、实现思路:1:画时钟盘,获取View大小适配圆心和半径。 2:画刻度,通过旋转画布15度来分别画出刻度线。 3:画时针,旋转画布角度来实现,并通过线程死循环来改变旋转角 度,更新画布,从而动态旋转。 4:对外开放接口控制线程结束。二、程序运行如下图:三、主要代码(ClockL

u012925323的博客 748

Android学习笔记-自定义视图之比例图

前一段时间看一个学习效率的问题,发现自己的学习效率的确不高,写博客主要是为了加深映像,然后的在写的时候希望能够进一步能够理解。给大家看一张图 图片里面有一项:教授给他人 学习内容的留存率最大为90%1.首先看下效果图,效果很简单2. 实现思路这个控件是由三部分组成的,分别是中间的文字,包括文字的圆圈,在加上最外层的圆环就可以了。3.看一下自定义的Viewpublic class SweepView

昕哇的专栏 695

自定义控件---自定义钟表

private Context mContext; /** * 画笔 */ private Paint mPaint; /** * 控件的宽 */ private int mWidth; /** * x方向的圆心坐标 */ private int center; /** * 钟表的半径 */ private int mRadio; /** * 圆环的宽 */ private int strokeWidth = 8; /** * 当前小时 */ private int mCu.

m0_37550680的博客 270
上一篇: 安卓笔记android 图片缓存 LurCache 值得注意的几点
下一篇: 自定义控件实现弹出菜单选项
DonMoses
博客等级 码龄12年 3粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值