前言

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

秒表。笔者突然对其有了兴趣,也想去实现以下自己的模拟时钟。折腾了一阵子总算是弄出来了

现在将实现方式共享出来,大家一些交流。

不多说,先上效果图:

准备工作

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

时钟盘:

时针:

分针:

秒针:

源码部分

配置文件,比较简单:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

tools:context=".MainActivity"

android:background="@color/bg">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

/>

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

package com.kiritor.mymodelclock;

import android.util.AttributeSet;

import com.kiritor.mymodelclock.R;

import android.content.Context;

import android.graphics.*;

import android.graphics.drawable.BitmapDrawable;

import android.os.Handler;

import android.view.View;

import java.util.Calendar;

import java.util.TimeZone;

/**

* Created by Kiritor on 13-5-30.

*/

public class MyQAnalogClock extends View {

//时钟盘,分针、秒针、时针对象

Bitmap mBmpDial;

Bitmap mBmpHour;

Bitmap mBmpMinute;

Bitmap mBmpSecond;

BitmapDrawable bmdHour;

BitmapDrawable bmdMinute;

BitmapDrawable bmdSecond;

BitmapDrawable bmdDial;

Paint mPaint;

Handler tickHandler;

int mWidth;

int mHeigh;

int mTempWidth = bmdSecond.getIntrinsicWidth();

int mTempHeigh;

int centerX;

int centerY;

int availableWidth = 100;

int availableHeight = 100;

private String sTimeZoneString;

public MyQAnalogClock(Context context,AttributeSet attr)

{

this(context,"GMT+8:00");

}

public MyQAnalogClock(Context context, String sTime_Zone) {

super(context);

sTimeZoneString = sTime_Zone;

mBmpHour = BitmapFactory.decodeResource(getResources(),

R.drawable.shizhen);

bmdHour = new BitmapDrawable(mBmpHour);

mBmpMinute = BitmapFactory.decodeResource(getResources(),

R.drawable.fenzhen);

bmdMinute = new BitmapDrawable(mBmpMinute);

mBmpSecond = BitmapFactory.decodeResource(getResources(),

R.drawable.miaozhen);

bmdSecond = new BitmapDrawable(mBmpSecond);

mBmpDial = BitmapFactory.decodeResource(getResources(),

R.drawable.android_clock_dial);

bmdDial = new BitmapDrawable(mBmpDial);

mWidth = mBmpDial.getWidth();

mHeigh = mBmpDial.getHeight();

centerX = availableWidth / 2;

centerY = availableHeight / 2;

mPaint = new Paint();

mPaint.setColor(Color.BLUE);

run();

}

public void run() {

tickHandler = new Handler();

tickHandler.post(tickRunnable);

}

private Runnable tickRunnable = new Runnable() {

public void run() {

postInvalidate();

tickHandler.postDelayed(tickRunnable, 1000);

}

};

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Calendar cal = Calendar.getInstance(TimeZone

.getTimeZone(sTimeZoneString));

int hour = cal.get(Calendar.HOUR);

int minute = cal.get(Calendar.MINUTE);

int second = cal.get(Calendar.SECOND);

float hourRotate = hour * 30.0f + minute / 60.0f * 30.0f;

float minuteRotate = minute * 6.0f;

float secondRotate = second * 6.0f;

boolean scaled = false;

if (availableWidth < mWidth || availableHeight < mHeigh) {

scaled = true;

float scale = Math.min((float) availableWidth / (float) mWidth,

(float) availableHeight / (float) mHeigh);

canvas.save();

canvas.scale(scale, scale, centerX, centerY);

}

bmdDial.setBounds(centerX - (mWidth / 2), centerY - (mHeigh / 2),

centerX + (mWidth / 2), centerY + (mHeigh / 2));

bmdDial.draw(canvas);

mTempWidth = bmdHour.getIntrinsicWidth();

mTempHeigh = bmdHour.getIntrinsicHeight();

canvas.save();

canvas.rotate(hourRotate, centerX, centerY);

bmdHour.setBounds(centerX - (mTempWidth / 2), centerY

- (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY

+ (mTempHeigh / 2));

bmdHour.draw(canvas);

canvas.restore();

mTempWidth = bmdMinute.getIntrinsicWidth();

mTempHeigh = bmdMinute.getIntrinsicHeight();

canvas.save();

canvas.rotate(minuteRotate, centerX, centerY);

bmdMinute.setBounds(centerX - (mTempWidth / 2), centerY

- (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY

+ (mTempHeigh / 2));

bmdMinute.draw(canvas);

canvas.restore();

mTempWidth = bmdSecond.getIntrinsicWidth();

mTempHeigh = bmdSecond.getIntrinsicHeight();

canvas.rotate(secondRotate, centerX, centerY);

bmdSecond.setBounds(centerX - (mTempWidth / 2), centerY

- (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY

+ (mTempHeigh / 2));

bmdSecond.draw(canvas);

if (scaled) {

canvas.restore();

}

}

}

主Activity:

package com.kiritor.mymodelclock;

import android.app.Activity;

import android.os.Bundle;

/**

* Created by Kiritor on 13-5-30.

*/

public class MainActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

好了一个简单的模拟时钟就完成了,不过通过观察运行效果可以看出的是,笔者对

时针、分针、秒针图片的设计不是太美观,看的不是太清楚,体验略差。不过这不是重点

读者可以自己去设计一下那4张图片,从而做出不同的效果!

这里本实例使用Android Studio做的,完整项目源码就不上传了!Over!

java模拟时钟源代码_Android实现模拟时钟(简单+漂亮)--时针、分针、秒针相关推荐

  1. java时针_Java 设计一个clock类 要求实现时针,分针,秒针

    展开全部 /* * @(#)Clock.java 1.16 06/02/22 * * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Rese ...

  2. Java计算12小时之内,时针分针秒针重合的次数

    package demo;public class Test3 {public static void main(String[] args) {for (int s = 0; s < 60;) ...

  3. java钟表时针分针夹角计算器

    package Cal;import java.util.Scanner;public class Clock_angle {private float hour;private float minu ...

  4. Android实现模拟时钟(简单+漂亮)--时针、分针、秒针

    前言 前不久在网上看见Android实现的模拟时钟,感觉十分有意思,这里是地址: http://www.eoeandroid.com/forum.php?mod=viewthread&tid= ...

  5. Android多功能时钟源代码,Android多功能时钟开发案例(实战篇)

    上一篇为大家介绍的是Android多功能时钟开发基础内容,大家可以回顾一下,Android多功能时钟开发案例(基础篇) 接下来进入实战,快点来学习吧. 一.时钟 在布局文件中我们看到,界面上只有一个T ...

  6. java 请求超时处理_android 网络请求超时简单处理(基于rxjava)

    implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' public class ExceptionHandle { private ...

  7. c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc

    C语言图形时钟课程设计实验报告.doc 目录 1.系统功能要求 . 2. 数据结构设计及 说明 . 3.程序结构(画流程图) . 4.各模块的功能 . 5.试验结果(包括输入数据和输出结果) . 6. ...

  8. c语言时钟报告,C语言图形时钟课程设计实验报告

    C语言图形时钟课程设计实验报告 目录1.系统功能要求.2. 数据结构设计及说明.3.程序结构(画流程图) .4.各模块的功能.5.试验结果(包括输入数据和输出结果) .6.体会.7.参考文献.8.附录 ...

  9. android 自定义时钟,Android自定义控件之圆形时钟(续)

    在上篇文章中,我向大家介绍了如何通过自定义View一步步画出一个漂亮的圆形时钟.如果你还没看的话,我不建议你接着往下看,因为这篇文章是接着上篇的文章,如果直接看的话可能会不知所云,所以还是建议你先看一 ...

最新文章

  1. 计算机应用能力考试xp,全国专业技术人员计算机应用能力考试XP
  2. 打印页table头部重叠_手把手教你如何清理打印机喷头
  3. 年度回顾:2018年的AI/ML惊喜及预测19年的走势(一)...
  4. Android JNI开发生成.h头文件问题(转)
  5. java 8 lambda 排序_Java8 用Lambda表达式给List集合排序的实现
  6. java io流 教程_Java基础教程:IO流与文件基础
  7. spring jmx_JMX和Spring –第1部分
  8. 2009年上半年网络工程师考试下午试卷参考答案(二)
  9. 一. python的collections模块
  10. DotNet Framework 小技巧
  11. oracle link binaries,Oracle 单实例 Relink Binary Options 说明
  12. 一个放在口袋里的项目,将社交裂变做到了极致
  13. dimm和udimm_服务器内存UDIMM与RDIMM有什么区别
  14. 软件体系结构——批处理风格
  15. 乔治城大学 计算机排名,乔治城大学计算机科学硕士排名第40(2020年TFE Times排名)...
  16. git reset 怎么还原_git reset后如何恢复
  17. Pygame学习笔记 6 —— 3D游戏
  18. 【Vue3】电商网站吸顶功能
  19. 关闭笔记本自带的键盘
  20. after all 用法, although but 用法

热门文章

  1. SimHash算法原理与应用(Java版)
  2. 【校招VIP】活动发布模块 简历:本期亮点描写和面试提问点
  3. 十二.性能测试-AWR报告简要分析
  4. ADRV9009 与 zcu102搭建ADI的no os项目
  5. 数据可视化——Davinci
  6. java web 项目导入因为jdk版本出现红色大感叹号
  7. 月利息6至8厘年利息是多少
  8. 基于mpu6050的角速度测量(主控stm32f103 Sram 23LC1024,c#上位机)
  9. 终于把Redis中7千万个Key删完了
  10. HTML 网页表白,520