1. 最近写了个指针时钟的小程序,拿出来和大家分享一下。
  2. 指针时钟控件实现:
  3. 关键点:
  4. 1、Android自定义控件实现
  5. 2、Android自定义控件命名空间
  6. 3、Android自定义控件从布局文件中获取参数,让自己的控件更具有灵活性、可用性
  7. 4、Android图形绘制(点、线、圆和矩形)
  8. 5、Android Handler消息机制
  9. 主要思想:
  10. 自定义一个控件,继承自View类,实现onMeasuredDimension()方法指定控件大小;实现onDraw()方法计算圆心和偏移角度,来绘制圆心、时针和分针。然后需要做的就是在布局文件中指定钟表背景图、长宽距圆心比例和缩放比例即可。
  11. 一、 实现效果
  12. 二、代码实现
  13. public class HandClockView extends View implements Runnable {
  14. private static final String NAMESPACE = "http://www.pro.dev.com/common";
  15. private static final String CLOCK_FACE="colckFace";
  16. private static final String HAND_CENTER_WIDTH_SCALE = "handCenterWidthScale";
  17. private static final String HAND_CENTER_HEIGHT_SCALE = "handCenterHeightScale";
  18. private static final String SCALE = "scale";
  19. private static final String HOUR_HAND_SIZE = "hourHandSize";
  20. private static final String MINUTE_HAND_SIZE = "minuteHandSize";
  21. private Bitmap clockFace;
  22. private int clockFaceId;
  23. private float centerX;
  24. private float centerY;
  25. private float handCenterWidthScale;
  26. private float handCenterHeightScale;
  27. private float scale;
  28. private int hourHandSize;
  29. private int minuteHandSize;
  30. private Handler handler = new Handler();
  1. public HandClockView(Context context) {
  2. super(context);
  3. }
  4. public HandClockView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. init(attrs);
  7. }
  8. public HandClockView(Context context, AttributeSet attrs, int defStyle) {
  9. super(context, attrs, defStyle);
  10. init(attrs);
  11. }
  12. private void init(AttributeSet attrs) {
  13. clockFaceId = attrs.getAttributeResourceValue(NAMESPACE, CLOCK_FACE, 0);
  14. Log.e("zhang.xiao", "clockFaceId=" + clockFaceId);
  15. if (clockFaceId > 0) {
  16. clockFace = BitmapFactory.decodeResource(getResources(), clockFaceId);
  17. }
  18. Log.e("zhang.xiao", "clockFace is null " + String.valueOf(clockFace == null));
  19. handCenterWidthScale = attrs.getAttributeFloatValue(NAMESPACE, HAND_CENTER_WIDTH_SCALE, clockFace.getWidth() / 2);
  20. handCenterHeightScale = attrs.getAttributeFloatValue(NAMESPACE, HAND_CENTER_HEIGHT_SCALE, clockFace.getHeight() / 2);
  21. scale = attrs.getAttributeFloatValue(NAMESPACE, SCALE, 0);
  22. hourHandSize = (int) (scale * attrs.getAttributeIntValue(NAMESPACE, HOUR_HAND_SIZE, 0));
  23. minuteHandSize = (int) (scale * attrs.getAttributeIntValue(NAMESPACE, MINUTE_HAND_SIZE, 0));
  24. }
  25. @Override
  26. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  27. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  28. setMeasuredDimension((int)(clockFace.getWidth() * scale), (int)(clockFace.getHeight() * scale));
  29. }
  30. @Override
  31. public void run() {
  32. invalidate();
  33. handler.postDelayed(this, 60 * 1000);
  34. }
  35. @Override
  36. protected void onDraw(Canvas canvas) {
  37. super.onDraw(canvas);
  38. Paint paint = new Paint();
  39. Rect src = new Rect();
  40. src.left = 0;
  41. src.top = 0;
  42. src.right = clockFace.getWidth();
  43. src.bottom = clockFace.getHeight();
  44. Rect target = new Rect();
  45. target.left = 0;
  46. target.top = 0;
  47. target.right = (int) (src.right * scale);
  48. target.bottom = (int) (src.bottom * scale);
  49. canvas.drawBitmap(clockFace, src, target, paint);
  50. centerX = clockFace.getWidth() * handCenterWidthScale * scale;
  51. centerY = clockFace.getHeight() * handCenterHeightScale * scale;
  52. canvas.drawCircle(centerX, centerY, 5, paint);
  53. paint.setStrokeWidth(3);
  54. Calendar cal = Calendar.getInstance();
  55. int minute = cal.get(Calendar.MINUTE);
  56. int hour = cal.get(Calendar.HOUR);
  57. int second = cal.get(Calendar.SECOND);
  58. Log.e("zhang.xiao", "hour=" + hour);
  59. Log.e("zhang.xiao", "minute=" + minute);
  60. double minuteRadian = Math.toRadians((360 - ((minute * 6) - 90)) % 360);
  61. double hourRadian = Math.toRadians(((360 - ((hour * 30) - 90)) % 360) - (30 * minute / 60));
  62. canvas.drawLine(centerX, centerY, (int) (centerX + minuteHandSize * Math.cos(minuteRadian)),
  63. (int) (centerY - Math.sin(minuteRadian) * minuteHandSize), paint);
  64. paint.setStrokeWidth(4);
  65. canvas.drawLine(centerX, centerY, (int) (centerX + hourHandSize * Math.cos(hourRadian)),
  66. (int) (centerY - Math.sin(hourRadian) * hourHandSize), paint);
  67. handler.postDelayed(this, (60 - second) * 1000);
  68. }
  69. @Override
  70. protected void onDetachedFromWindow() {
  71. super.onDetachedFromWindow();
  72. Log.e("zhang.xiao", "onDetachedFromWindow");
  73. }
  74. }
  75. 三、
  76. 布局文件中使用<?xml version="1.0" encoding="utf-8"?>
  77. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  78. xmlns:dev="http://www.pro.dev.com/common"
  79. android:orientation="vertical"
  80. android:layout_width="fill_parent"
  81. android:layout_height="fill_parent"
  82. >
  83. <com.test.HandClockView
  84. android:layout_width="wrap_content"
  85. android:layout_height="wrap_content"
  86. dev:colckFace="@drawable/clock3"
  87. dev:handCenterWidthScale="0.5"
  88. dev:handCenterHeightScale="0.5"
  89. dev:scale="0.3"
  90. dev:hourHandSize="100"
  91. dev:minuteHandSize="178"
  92. >
  93. </com.test.HandClockView>
  94. </LinearLayout>

标签说明:

dev:自定义控件命名空间

colckFace:钟表背景图

handCenterWidthScale:圆心和图宽缩放比例

handCenterHeightScale:圆心和图片高度缩放比例

scale:图片缩放比例

hourHandSize:时针长度

minuteHandSize:分钟长度

时钟实现代码二:

前不久在网上看见Android实现的模拟时钟,感觉十分有意思,这里是地址:

极客学院http://www.eoeandroid.com/forum.php?mod=viewthread&tid=58324可惜的是这种方式没有秒表。笔者突然对其有了兴趣,也想去实现以下自己的模拟时钟。折腾了一阵子总算是弄出来了现在将实现方式共享出来,大家一些交流。不多说,先上效果图:

准备工作

首先我们应该准备相关的素材:时钟盘、时针、分针、秒针图片.

时钟盘:

时针:

分针:

秒针:

源码部分

配置文件,比较简单:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity"
  7. android:background="@color/bg">
  8. <com.kiritor.mymodelclock.MyQAnalogClock
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_gravity="center"   />
  12. </LinearLayout>

MyQAnalogClock代码:用于构造时钟view以及其刷新显示:

  1. package com.kiritor.mymodelclock;
  2. import android.util.AttributeSet;
  3. import com.kiritor.mymodelclock.R;
  4. import android.content.Context;
  5. import android.graphics.*;
  6. import android.graphics.drawable.BitmapDrawable;
  7. import android.os.Handler;
  8. import android.view.View;
  9. import java.util.Calendar;
  10. import java.util.TimeZone;
  11. /**
  12. * Created by Kiritor on 13-5-30.
  13. */
  14. public class MyQAnalogClock extends View {
  15. //时钟盘,分针、秒针、时针对象
  16. Bitmap mBmpDial;
  17. Bitmap mBmpHour;
  18. Bitmap mBmpMinute;
  19. Bitmap mBmpSecond;
  20. BitmapDrawable bmdHour;
  21. BitmapDrawable bmdMinute;
  22. BitmapDrawable bmdSecond;
  23. BitmapDrawable bmdDial;
  24. Paint mPaint;
  25. Handler tickHandler;
  26. int mWidth;
  27. int mHeigh;
  28. int mTempWidth = bmdSecond.getIntrinsicWidth();
  29. int mTempHeigh;
  30. int centerX;
  31. int centerY;
  32. int availableWidth = 100;
  33. int availableHeight = 100;
  34. private String sTimeZoneString;
  35. public MyQAnalogClock(Context context,AttributeSet attr)
  36. {
  37. this(context,"GMT+8:00");
  38. }
  39. public MyQAnalogClock(Context context, String sTime_Zone) {
  40. super(context);
  41. sTimeZoneString = sTime_Zone;
  1. mBmpHour = BitmapFactory.decodeResource(getResources(),
  2. R.drawable.shizhen);
  3. bmdHour = new BitmapDrawable(mBmpHour);
  4. mBmpMinute = BitmapFactory.decodeResource(getResources(),

R.drawable.fenzhen);

  1. bmdMinute = new BitmapDrawable(mBmpMinute);
  2. mBmpSecond = BitmapFactory.decodeResource(getResources(),
  3. R.drawable.miaozhen);
  4. bmdSecond = new BitmapDrawable(mBmpSecond);
  5. mBmpDial = BitmapFactory.decodeResource(getResources(),
  6. R.drawable.android_clock_dial);
  7. bmdDial = new BitmapDrawable(mBmpDial);
  8. mWidth = mBmpDial.getWidth();
  9. mHeigh = mBmpDial.getHeight();
  10. centerX = availableWidth / 2;
  11. centerY = availableHeight / 2;
  12. mPaint = new Paint();
  13. mPaint.setColor(Color.BLUE);
  14. run();
  15. }
  16. public void run() {
  17. tickHandler = new Handler();
  18. tickHandler.post(tickRunnable);
  19. }
  20. private Runnable tickRunnable = new Runnable() {
  21. public void run() {
  22. postInvalidate();
  23. tickHandler.postDelayed(tickRunnable, 1000);
  24. }
  25. };
  26. protected void onDraw(Canvas canvas) {
  27. super.onDraw(canvas);
  28. Calendar cal = Calendar.getInstance(TimeZone
  29. .getTimeZone(sTimeZoneString));
  30. int hour = cal.get(Calendar.HOUR);
  31. int minute = cal.get(Calendar.MINUTE);
  32. int second = cal.get(Calendar.SECOND);
  33. float hourRotate = hour * 30.0f + minute / 60.0f * 30.0f;
  34. float minuteRotate = minute * 6.0f;
  35. float secondRotate = second * 6.0f;
  36. boolean scaled = false;
  37. if (availableWidth < mWidth || availableHeight < mHeigh) {
  38. scaled = true;
  39. float scale = Math.min((float) availableWidth / (float) mWidth,
  40. (float) availableHeight / (float) mHeigh);
  41. canvas.save();
  42. canvas.scale(scale, scale, centerX, centerY);
  43. }
  44. bmdDial.setBounds(centerX - (mWidth / 2), centerY - (mHeigh / 2),
  45. centerX + (mWidth / 2), centerY + (mHeigh / 2));
  46. bmdDial.draw(canvas);
  47. mTempWidth = bmdHour.getIntrinsicWidth();
  48. mTempHeigh = bmdHour.getIntrinsicHeight();
  49. canvas.save();
  50. canvas.rotate(hourRotate, centerX, centerY);
  51. bmdHour.setBounds(centerX - (mTempWidth / 2), centerY
  52. - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY
  53. + (mTempHeigh / 2));
  54. bmdHour.draw(canvas);
  55. canvas.restore();
  56. mTempWidth = bmdMinute.getIntrinsicWidth();
  57. mTempHeigh = bmdMinute.getIntrinsicHeight();
  58. canvas.save();
  59. canvas.rotate(minuteRotate, centerX, centerY);
  60. bmdMinute.setBounds(centerX - (mTempWidth / 2), centerY
  61. - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY
  62. + (mTempHeigh / 2));
  63. bmdMinute.draw(canvas);
  64. canvas.restore();
  65. mTempWidth = bmdSecond.getIntrinsicWidth();
  66. mTempHeigh = bmdSecond.getIntrinsicHeight();
  67. canvas.rotate(secondRotate, centerX, centerY);
  68. bmdSecond.setBounds(centerX - (mTempWidth / 2), centerY
  69. - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY
  70. + (mTempHeigh / 2));
  71. bmdSecond.draw(canvas);
  72. if (scaled) {
  73. canvas.restore();
  74. }
  75. }
  76. }

主Activity:

  1. package com.kiritor.mymodelclock;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. /**
  5. * Created by Kiritor on 13-5-30.
  6. */
  7. public class MainActivity extends Activity {
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. }
  12. }

好了一个简单的模拟时钟就完成了,不过通过观察运行效果可以看出的是,笔者对           时针、分针、秒针图片的设计不是太美观,看的不是太清楚,体验略差。不过这不是重点,读者可以自己去设计一下那4张图片,从而做出不同的效果!这里本实例使用Android Studio做的,完整项目源码就不上传了!Over!

Android指针时钟的实现代码相关推荐

  1. android 时钟动态图标,Android 8.1 Launcher3实现动态指针时钟功能

    本文主要实现功能,可能有不合理的地方 首先创建一个实现功能的工具里,直接上代码: import android.content.Context; import android.graphics.Bit ...

  2. Android动态秒针插件app,Android 8.1 Launcher3实现动态指针时钟功能

    本文主要实现功能,可能有不合理的地方 首先创建一个实现功能的工具里,直接上代码: import android.content.Context; import android.graphics.Bit ...

  3. java数字时钟代码,Android自定义数字时钟代码,android自定义时钟,package jp.t

    Android自定义数字时钟代码,android自定义时钟,package jp.tpackage jp.tsmsogn.digitalclock;import java.util.Calendar; ...

  4. Android模拟时钟和数字时钟示例

    在Android中, AnalogClock是两只手的时钟,一个代表小时,另一个代表分钟. DigitalClock看起来就像您手中的普通数字手表,以数字格式显示小时,分钟和秒. AnalogCloc ...

  5. linux将时钟放在桌面上的,Linux 下的桌面指针时钟

    Linux 下的桌面指针时钟 一.开发背景 随着科学技术的日益增加,软件行业在有了新的突破.特别是在移动设备上更有着远大的开发空间,目前,移动设备上,包括手机,笔记本,平板,发展的特别快,界面也越来越 ...

  6. Java Swing 小项目:模拟时钟/指针时钟 + 数字日期时钟 的实现

    原文链接:https://xiets.blog.csdn.net/article/details/130685267 版权声明:原创文章禁止转载 Java Swing 图形界面开发(目录) 使用 Ja ...

  7. android绘画时钟,Android实现时钟特效

    本文实例为大家分享了Android实现时钟特效的具体代码,供大家参考,具体内容如下 效果展示: 功能介绍: 如果您想换一张背景图,可以点击左下角按按钮切换背景图片. 如果您不想看见右上方的日期,可以点 ...

  8. LVGL库实现的简单实时时钟表盘示例代码

    LVGL库实现的简单实时时钟表盘示例代码: #include "lvgl.h" #include <time.h>static lv_obj_t * screen; s ...

  9. 网页版Android手机时钟网页特效

    这是用CSS3制作Android手机时钟特效,运行时请使用支持CSS3的浏览器运行,否则可能看到这个时钟特效 非常不错的网页特效代码,值得收藏和使用,本网页特效由ab蓝学网收集整理,不用于商业用途 本 ...

最新文章

  1. oracle ora 00279,ORA-01245、ORA-01547错误的解决
  2. BZOJ2131免费的馅饼 DP+树状数组
  3. 【Spring学习】spring提供的三种定时任务
  4. docker wsl2启动不了_Docker学习笔记
  5. linux c之gcc -g file.c -o file提示warning: no newline at end of file
  6. 详细介绍nagios基本配置
  7. ios14系统 GIF图展示异常问题
  8. LeetCode 415. 字符串相加 (逢十进一模版字符处理)
  9. 使用 jQuery Mobile 和 CSS3 实现响应式设计
  10. android studio左边选择渠道,AndroidStudio简单使用(二):左侧Structure
  11. 如何用四个简单的步骤加速 LibreOffice
  12. decimal.tostring()格式
  13. python如何打开txt文件、并算词频_Python 合并多个TXT文件并统计词频的实现
  14. linux 显卡驱动
  15. 一阶系统开环传递函数表达式_自动控制总结:第二章、控制系统的数学模型
  16. Redis入门到精通(2021版本)视频教程
  17. 典型相关分析(cca)原理_全网最细的图文详解——手把手教你不会代码一样做RDA/CCA分析!...
  18. 如何将PDF转换成Word文档?教你3种方法
  19. 淘宝购物车计算总价格
  20. 各种浏览器在线翻译,无需插件

热门文章

  1. 文献类型参考文献的文献标识码
  2. 如何基于西安80坐标查询定位
  3. BI可视化分析之Pentaho
  4. java模拟手机浏览web_在PC上测试移动端网站和模拟手机浏览器的5大方法
  5. java多线程 占用内存_java线程池常驻线程占内存吗
  6. 高中数理化杂志高中数理化杂志社高中数理化编辑部2022年第21期目录
  7. 计算机基础应用在线免费答题,计算机应用基础简答题附答案.doc
  8. mac 树莓派_您真的可以用45树莓派替换台式PC或Mac吗
  9. 【项目实战二】基于模板匹配和形态学操作的信用卡卡号识别(OpenCV+Python)
  10. 一些浏览器播放视频的时候进度条有动,画面是空白的