效果:

一,自定义一个view的大致步骤:

1.自定义View,首先定义一个MyView类继承View类。

2. 重写View的两个构造器。View是包含四个构造器的,我们必须重写MyWidgetView(Context context, AttributeSet attrs)构造器,因为该构造器的第二个参数是与xml布局文件相联系的,如果没有重写该构造器,将不能在布局中使用该控件。这里我们重写他的两个构造器。

3.重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法,定义控件的尺寸:宽度和高度。在布局中使用该控件时会会传入控件的尺寸,只有当传入尺寸之后且调用onMesure之后,控件才会有宽度和高度。

4.根据需要重写onLayout()

5.重写onDraw(Canvas canvas)方法,我们在该方法中定义绘制View,当我们在Activity或其他地方使该控件时, UI主线程会调用onDraw方法绘制。

二,自定view的流程图

三,代码示例:

package com.example.mytest;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.util.AttributeSet;
import android.util.Log;
import android.view.View;import java.util.Calendar;public class MyView extends View {private int width;//设置高private int height;//设置高private Paint mPaintLine;//定义一个绘制直线的画笔private Paint mPaintSecondLine;//定义一个绘制直线的画笔private Paint mPaintInterCircle;//定义一个绘制圆的画笔private Paint mPaintOutSideCircle;//定义一个绘制圆的画笔private Paint mPaintText;//定义一个绘制文字的画笔private Calendar mCalendar;//创建一个时间类private static final int NEED_INVALIDATE=0X6666;//操作UI主线程private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case NEED_INVALIDATE:
//跟新时间mCalendar=Calendar.getInstance();invalidate();sendEmptyMessageDelayed(NEED_INVALIDATE,1000);break;}}};public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);//初始化画直线的画笔mPaintLine = new Paint();mPaintLine.setAntiAlias(true);//消除锯齿mPaintLine.setColor(Color.GRAY);//设置画笔颜色mPaintLine.setStyle(Paint.Style.STROKE);//设置为空心mPaintLine.setStrokeWidth(10);//设置宽度// 初始化秒针的画笔mPaintSecondLine = new Paint();mPaintSecondLine.setAntiAlias(true);//消除锯齿mPaintSecondLine.setColor(Color.GRAY);//设置画笔颜色mPaintSecondLine.setStyle(Paint.Style.STROKE);//设置为空心mPaintSecondLine.setStrokeWidth(7);//设置宽度//初始化内圆的画笔mPaintInterCircle = new Paint();mPaintInterCircle.setAntiAlias(true);//消除锯齿mPaintInterCircle.setColor(Color.BLACK);mPaintInterCircle.setStyle(Paint.Style.STROKE);//设置为空心mPaintInterCircle.setStrokeWidth(5);//初始化外圆的画笔mPaintOutSideCircle = new Paint();mPaintOutSideCircle.setAntiAlias(true);//消除锯齿mPaintOutSideCircle.setColor(Color.BLACK);mPaintOutSideCircle.setStyle(Paint.Style.STROKE);//设置为空心mPaintOutSideCircle.setStrokeWidth(10);//绘制文字的画笔mPaintText = new Paint();mPaintText.setAntiAlias(true);//消除锯齿mPaintText.setColor(Color.GRAY);mPaintText.setStyle(Paint.Style.STROKE);//设置为空心mPaintText.setTextAlign(Paint.Align.CENTER);mPaintText.setTextSize(40);mPaintText.setStrokeWidth(6);//初始化日历mCalendar = Calendar.getInstance();//发送一个消息给UI主线程handler.sendEmptyMessageDelayed(NEED_INVALIDATE,2000);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 主线程自动调用canvas.drawCircle(width / 2, height / 2, 300, mPaintInterCircle);canvas.drawCircle(width / 2, height / 2, 320, mPaintOutSideCircle);for(int i=1; i<=12;i++){canvas.save();//保存当前状态canvas.rotate(360 / 12 * i, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 - 300, width / 2, height / 2 - 270, mPaintLine);canvas.drawText("" + i, width / 2, height / 2 - 240, mPaintText);canvas.restore();//回到save()方法保存的状态}//绘制分针int minute= mCalendar.get(Calendar.MINUTE);float minuteDegree = minute/60f*360;canvas.save();canvas.rotate(minuteDegree, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 - 200, width / 2, height / 2 + 40, mPaintLine);canvas.restore();//绘制时针int hour= mCalendar.get(Calendar.HOUR);float hourDegree = (hour*60+minute)/(12f*60)*360;canvas.save();canvas.rotate(hourDegree, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 - 170, width / 2, height / 2 + 30, mPaintLine);canvas.restore();//绘制秒针int second = mCalendar.get(Calendar.SECOND);float secondDegree = second*6;//一秒是6度。canvas.save();canvas.rotate(secondDegree, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 - 220, width / 2, height / 2 + 50, mPaintSecondLine);canvas.restore();}
}

Android自定义view实现动态模拟时钟。相关推荐

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

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

  2. 自定义view之绘制模拟时钟

    之前在自定义view之写一个带删除按钮的Edittext中简单介绍了如何继承Edittext实现点击区域删除全部文字. 在自定义view之可伸缩的圆弧与扇形中介绍了如何制作带有动画效果的圆弧和扇形图. ...

  3. Android 自定义View 会移动的时钟

    实现效果: 实现的原理很简单有时间在写教程 附上项目源码: 项目源码

  4. android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球

    在之前一篇文章中我们讲解了三种ProgressBar的做法,详见-><Android 自定义View--自定义ProgressBar >.这一节中我们模仿360加速球制作一个动态Pr ...

  5. android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  6. android的动态tab,Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的 ...

  7. android波纹效果弹窗,Android自定义View实现波纹效果

    Android自定义View实现波纹效果 时间:2017-05-27     来源:移动互联网学院 1.引言:随着Android智能手机的普及,Android应用得到了大力支持,而Android应用的 ...

  8. android 自定义 对号,Android自定义View实现打钩动画功能

    先上效果图 动图 静态图 1. 回顾 [Android自定义View:一个精致的打钩小动画]上一篇文章,我们已经实现了基本上实现了控件的效果了,但是...但是...过了三四天后,仔细看回自己写的代码, ...

  9. Android自定义View分享——仿网易云音乐留声机效果

    写在前面 这是笔者自学习自定义View以来,分享的第五篇效果,之前分享过一篇动态时钟效果的自定义View,如果有兴趣的可以看看: Android自定义View分享--一个时钟 之前的博客笔者一般都会说 ...

最新文章

  1. 如何卸载干净32位的Office
  2. OpenGL渲染纹理和平面反射
  3. PHP数据类型的转化:(类型) 变量 类型val(变量) settype(变量,类型)
  4. openSUSE 11 上的配置可以Xmanager远程桌面
  5. 设计类的五个原则_内容设计的5个原则
  6. pp助手苹果版_生日助手时间管理软件免费版下载-生日助手倒计时app苹果版下载ios...
  7. css 改变输入框光标颜色
  8. 团队管理(3)---团队管理方法
  9. STM8学习笔记---新建IAR工程文件
  10. android字符串点击事件,Android匹配字符串高亮并设置点击事件
  11. 9 内存模型和名称空间
  12. 极限分辨率是艾里斑的直径还是半径_小孔成像(二)——衍射,数值孔径和分辨率...
  13. 核电厂的“神经中枢”——核电厂数字化仪控系统
  14. lingo与excel
  15. 多媒体计算机的组成元素,什么是多媒体计算机的组成
  16. Windows的cmd中如何关闭端口
  17. VBA轻松实现多色渐变填充
  18. idea配置翻译插件(google翻译插件)
  19. windows平台下静态库(.lib)和动态库(.dll)使用
  20. java nanotime 转秒_Java的nanoTime()

热门文章

  1. 2022年西藏最新食品安全管理员模拟考试试题及答案
  2. [HTML]js实现页面跳转,页面A跳到另一个页面B.以及页面传值(中文)
  3. 树莓派3B+ 串口使用大全(实现串口通信功能)
  4. docker oracle11g导入 . dmp文件
  5. Asterisk MeetMe的配置
  6. PPT逻辑美学 34节万能宝典
  7. MySQL 第五章-排序与分页-课后练习
  8. WPF--Prism框架安装初识
  9. 用C++编写的木马程序
  10. xmpp打开mysql_列表xmpp方法