Android自定义View画钟表

第一种使用背景表盘

主要代码:

package com.zjs.zidingyiview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;import java.util.Calendar;public class MyClock extends View {private Paint mPaint;private Calendar mCalendar;private int DEFAULT = 400;private int mSecond;private int mMinute;private int mHour;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mCalendar = Calendar.getInstance();mHour = mCalendar.get(Calendar.HOUR);mMinute = mCalendar.get(Calendar.MINUTE);mSecond = mCalendar.get(Calendar.SECOND);
//            获取时间后,重新绘制invalidate();mHandler.sendEmptyMessageDelayed(1234, 1000);}};private void init() {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.BLACK);mPaint.setStyle(Paint.Style.STROKE);mHandler.sendEmptyMessageDelayed(123, 1000);}public MyClock(Context context) {super(context);init();}public MyClock(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);switch (widthMode) {case MeasureSpec.AT_MOST:widthSize = DEFAULT;break;case MeasureSpec.EXACTLY:heightSize = widthSize;break;}switch (heightMode) {case MeasureSpec.AT_MOST:heightSize = DEFAULT;break;case MeasureSpec.EXACTLY:heightSize = widthSize;break;}setMeasuredDimension(widthSize, heightSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);
//        圆心mPaint.setStyle(Paint.Style.FILL);canvas.drawCircle(getWidth() / 2, getWidth() / 2, 8, mPaint);mPaint.setStyle(Paint.Style.STROKE);
//        绘制时针mPaint.setStrokeWidth(10);canvas.save();canvas.rotate((float) (360 / 12 * mHour + (mMinute * 0.5)), getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 5, mPaint);canvas.restore();
//         绘制分针mPaint.setStrokeWidth(8);canvas.save();canvas.rotate(360 / 60 * mMinute, getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 4, mPaint);canvas.restore();
//         绘制秒针mPaint.setStrokeWidth(6);canvas.save();canvas.rotate(360 / 60 * mSecond, getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 3, mPaint);canvas.restore()}
}

效果

在这里插入图片描述

自定义画表盘

package com.zjs.zidingyiview;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;import java.util.Calendar;public class MyClock extends View {private Paint mPaint;private Calendar mCalendar;private int DEFAULT = 400;private int mSecond;private int mMinute;private int mHour;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mCalendar = Calendar.getInstance();mHour = mCalendar.get(Calendar.HOUR);mMinute = mCalendar.get(Calendar.MINUTE);mSecond = mCalendar.get(Calendar.SECOND);
//            获取时间后,重新绘制invalidate();mHandler.sendEmptyMessageDelayed(1234, 1000);}};private void init() {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.BLACK);mPaint.setStyle(Paint.Style.STROKE);mHandler.sendEmptyMessageDelayed(123, 1000);}public MyClock(Context context) {super(context);init();}public MyClock(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);switch (widthMode) {case MeasureSpec.AT_MOST:widthSize = DEFAULT;break;case MeasureSpec.EXACTLY:heightSize = widthSize;break;}switch (heightMode) {case MeasureSpec.AT_MOST:heightSize = DEFAULT;break;case MeasureSpec.EXACTLY:heightSize = widthSize;break;}setMeasuredDimension(widthSize, heightSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setStrokeWidth(8);
//        外圆canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - 10, mPaint);mPaint.setStrokeWidth(8);
//        内圆canvas.drawCircle(getWidth() / 2, getWidth() / 2, (getWidth() / 2) - 30, mPaint);
//        圆心mPaint.setStyle(Paint.Style.FILL);canvas.drawCircle(getWidth() / 2, getWidth() / 2, 8, mPaint);
//        刻度
//        保留 画布中已经存在的位置信息canvas.save();for (int i = 0; i < 12; i++) {canvas.rotate(360 / 12, getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, 20, getWidth() / 2, 40, mPaint);}
//        将画布恢复canvas.restore();mPaint.setStyle(Paint.Style.STROKE);
//        绘制时针mPaint.setStrokeWidth(10);canvas.save();canvas.rotate((float) (360 / 12 * mHour + (mMinute * 0.5)), getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 5, mPaint);canvas.restore();
//         绘制分针mPaint.setStrokeWidth(8);canvas.save();canvas.rotate(360 / 60 * mMinute, getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 4, mPaint);canvas.restore();
//         绘制秒针mPaint.setStrokeWidth(6);canvas.save();canvas.rotate(360 / 60 * mSecond, getWidth() / 2, getWidth() / 2);canvas.drawLine(getWidth() / 2, getWidth() / 2, getWidth() / 2, getWidth() / 2 - getWidth() / 3, mPaint);canvas.restore();}
}

效果

在这里插入图片描述

背景表盘图片:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录程序人生

许久&#xff0c;没有在博客上发关于自己的记录了。 以前还是经常在博客上写长篇大论来记录生活的&#xff0c;其中有几篇博文被学生和其他朋友们都做一个励志来勉励自己的&#xff0c;我不由的感到自豪。 那时候在上学&#xff0c;貌似在上班之后就没有在写过类似“励志”的…

理解C# 4 dynamic(3) – DynamicObject的使用

上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了xpandoObject的基本使用。但ExpandoObject的问题就是它是一个万金油&#xff0c;什么都可以做&#xff0c;但是又都不专注。使用DynamicObject正好可以解决这个问题。这篇文章介绍DynamicJson是如何继承…

jsx中的注释的写法

{}表示里面要写js语句 js语句里面的注释为/**/

Java中的位移运算

位移运算符 左移 “a<<b”将二进制形式的a逐位左移b位&#xff0c;最低位空出来的b位补0。 带符号右移 “a>>b”将二进制形式的a逐位右移b位&#xff0c;最高位空出来的b位补原来的符号位。 无符号右移 “a>>>b”将二进制形式的a逐位右移b位&#xff0c…

sqlserver存储过程

一、存储过程 1.预先存储好的sql程序&#xff0c;保存在sqlserver中&#xff0c;通过名称和参数执行。 2.存储过程中可以包含&#xff1a;insert语句&#xff0c;update语句&#xff0c;delete语句&#xff0c;select语句&#xff0c;逻辑控制语句以及变量。 二、存储过程的优点…

微软正在用实际行动告诉你: 拥抱开源,微软是认真的

2017年4月19日至20日&#xff0c;由工业和信息化部指导、中国信息通信研究院主办、云计算开源产业联盟承办的"全球云计算开源峰会"在国家会议中心举行。微软.NET CORE开发平台荣获由峰会云计算开源产业联盟(OSCAR) 评选出的“尖峰开源技术”奖&#xff0c;标志着国内…

初识Windows程序

一、创建windows应用程序的步骤 1.新建项目 2.项目类型为C#项目 3.模板为windows应用窗体 二、构造方法&#xff1a; 语法&#xff1a;访问修饰符 类名(){} 三、命名规范前缀&#xff1a; 标签–>lable–>lbl 文本框–>textbox–>txt 组合框–>combobox–>cb…

React不提交表单并且获取表单中的数据

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_非受控组件</title> </head> <body><!-- 准备好一个“容器” --><div id"test"></div><!-- 引入…

Java中数组的赋值方式

方法一&#xff1a; 使用默认是初始值来初始化数组中的每一个元素 语法&#xff1a;数组元素类型 [ ] 数组名 new 数组元素类型[数组中元素的个数&#xff08;数组的长度&#xff09;] int [ ] number new int [10]; 方法二&#xff1a; 先赋值&#xff0c;然后在赋予默认的初…

分布式系统Paxos算法

转载自 分布式系统Paxos算法 这是一个有关Paxos算法非常形象的讲解与示范。Paxos是能够基于一大堆完全不可靠的网络条件下却能可靠确定地实现共识一致性的算法。也就是说&#xff1a;它允许一组不一定可靠的处理器&#xff08;服务器&#xff09;在某些条件得到满足情况下就能…

winform实现简单的计算器V1版本

最近在整winform程序&#xff0c;就做了些简单的案例出来&#xff0c;比如说下面的这个计算器&#xff1a; 这个的实现方式还是比较简单的。 首先按照图中的界面从工具箱中拉出来一个窗体&#xff0c;其中的显示结果“86”“1849”也是lable控件&#xff0c;最后放一个计算的…

用.netcore写一个简单redis驱动,调试windows版本的redis

1. 下载windows版本的redis 2.开发环境vs2017 新建一个 .net core控制台。 private static Socket socket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static BufferedStream buffer null; socket.NoDelay true; s…

JAVA封装性

1、封装性的概念 &#xff08;1&#xff09;封装性是面向对象思想的三大特征之一 &#xff08;2&#xff09;封装就是隐藏实现细节&#xff0c;仅对外提供访问接口。 &#xff08;3&#xff09;属性的封装、方法的封装、类的封装、组件的封装、模块化的封装、系统级封装。 2、封…

分布式系统的Raft算法

转载自 分布式系统的Raft算法 过去, Paxos一直是分布式协议的标准&#xff0c;但是Paxos难于理解&#xff0c;更难以实现&#xff0c;Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。 来自Stanford的新的分布式协议研究称为Raft&#xff0c;它是一个为真实世界应…

React类里面能写的东西

1.一般方法 2.赋值语句 3.静态方法 4.构造函数

构建布局良好的Windows程序

一、菜单栏控件MenuStrip&#xff1a; 1.name:菜单栏控件的名称 2.items:在菜单中显示项的集合 3.Text:与菜单相关联的文本 二、工具栏控件ToolStrip&#xff1a; 1.DisplayStyle:设置文本的显示方式&#xff0c;ImageAndText,显示图像和文本 2.Image:显示的图片 3.Text:显示的…

拆分:分解单块系统——《微服务设计》读书笔记

通常&#xff0c;我们可能已有有一个巨大的单块系统&#xff0c;如何实现微服务&#xff0c;我们需要把它分解。 从哪里开始拆分&#xff1a;接缝 接缝&#xff1a;从接缝处可以抽取相对独立的一部分代码&#xff0c;对这部分代码的修改不会影响系统的其他部分。这些接缝就可以…

winfrom实现简单计算器V2版本

前面&#xff0c;使用winform实现了个简单的计算器&#xff0c;今天&#xff0c;再来给大家看一个稍微复杂点的计算器&#xff0c;效果图如下&#xff1a; 包括归零&#xff0c;退格&#xff0c;加减乘除都已经实现&#xff0c;如果想要继续扩展的可以在稍微改改即可。 现在看…

ACID中C与CAP定理中C的区别

转载自 ACID中C与CAP定理中C的区别 ACID和CAP定理中都有C&#xff0c;代表Consistent一致性&#xff0c;很多人容易将这两个C混为一谈&#xff0c;其实这两个一致性是有区别的。 事务的定义是一系列操作要么全部成功&#xff0c;要么全部不成功&#xff0c;数据库的事务机制是…

单例模式——Java

单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建…