本文实例讲述了Android编程基于自定义控件实现时钟功能的方法。分享给大家供大家参考,具体如下:

在学习安卓群英传自定义控件章节的时候,有一个例子是绘制时钟,在实现了书上的例子后就想看这个时钟能不能动起来。

这里选择延迟一秒发送消息重绘view来实现的动画,对外提供了开启时钟,关闭时钟的方法,当activity执行onResume方法的时候,执行startClock()方法,当移除view或activity执行onStop方法的时候可以执行stopClock()方法。

首先根据view的宽高来确定圆心的位置,并画出一个圆。再通过view高度的一半减去圆的半径,确定刻度的起始位置,选择刻度的长度并绘制出来。然后再刻度下方绘制出数字。最终将画布进行旋转,时钟总共有60个刻度,循环旋转,每次旋转6度即可。

最后是绘制指针,通过计算算出指针对应每个刻度的X,Y坐标并绘制直线。

代码实现

自定义控件的代码(ClockView.java):

package com.example.clock;

import java.util.Calendar;

import java.util.Date;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.util.AttributeSet;

import android.view.View;

public class ClockView extends View {

private Paint circlePaint, dialPaint, numberPaint;

// view 的宽高

private float mWidth, mHeight;

// 圆的半径

private float circleRadius;

// 圆心X,Y坐标

private float circleX, circleY;

private int second, minute;

private double hour;

private Handler handler = new Handler(Looper.getMainLooper()) {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 0) {

invalidate();

}

}

};

public ClockView(Context context, AttributeSet attrs) {

super(context, attrs);

initPaint();

}

private void initPaint() {

// 刻盘圆,小时刻度,时针和分针的画笔

circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

circlePaint.setColor(Color.BLACK);

circlePaint.setStyle(Paint.Style.STROKE);

circlePaint.setStrokeWidth(10);

// 分钟刻度的画笔

dialPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

dialPaint.setColor(Color.BLACK);

dialPaint.setStrokeWidth(5);

// 数字的画笔

numberPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

numberPaint.setColor(Color.BLACK);

numberPaint.setStrokeWidth(5);

numberPaint.setTextSize(30);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mWidth = getMeasuredWidth();

mHeight = getMeasuredHeight();

if (mWidth < mHeight) {

// 圆的半径为view的宽度的一半再减9,防止贴边

circleRadius = mWidth / 2 - 9;

circleX = mWidth / 2;

circleY = mHeight / 2;

} else {

circleRadius = mHeight / 2 - 9;

circleX = mWidth / 2;

circleY = mHeight / 2;

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

setTimes();

drawCirclePoint(canvas);

drawCircle(canvas);

drawDial(canvas);

drawPointer(canvas);

}

/**

* 圆心

*

* @param canvas

*/

private void drawCirclePoint(Canvas canvas) {

canvas.drawCircle(circleX, circleY, 5, circlePaint);

}

private void drawCircle(Canvas canvas) {

canvas.drawCircle(circleX, circleY, circleRadius, circlePaint);

}

/**

* 画刻度及时间

*

* @param canvas

*/

private void drawDial(Canvas canvas) {

// 时钟用长一点的刻度,画笔用画圆的画笔

Point hourStartPoint = new Point(circleX, circleY - circleRadius);

Point hourEndPoint = new Point(circleX, circleY - circleRadius + 40);

// 分钟的刻度要稍微短一些,画笔用画圆的画笔

Point startPoint2 = new Point(circleX, circleY - circleRadius);

Point endPoint2 = new Point(circleX, circleY - circleRadius + 10);

// 开始画刻度和数字,总共60个刻度,12个时钟刻度,被5整除画一个时钟刻度,被其余的为分针刻度

String clockNumber;

for (int i = 0; i < 60; i++) {

if (i % 5 == 0) {

if (i == 0) {

clockNumber = "12";

} else {

clockNumber = String.valueOf(i / 5);

}

// 时针刻度

canvas.drawLine(hourStartPoint.getX(), hourStartPoint.getY(),

hourEndPoint.getX(), hourEndPoint.getY(), circlePaint);

// 画数字,需在时针刻度末端加30

canvas.drawText(clockNumber,

circleX - numberPaint.measureText(clockNumber) / 2,

hourEndPoint.getY() + 30, numberPaint);

} else {

// 画分针刻度

canvas.drawLine(startPoint2.getX(), startPoint2.getY(),

endPoint2.getX(), endPoint2.getY(), circlePaint);

}

// 画布旋转6度

canvas.rotate(360 / 60, circleX, circleY);

}

}

/**

* 画指针 X点坐标 cos(弧度)*r Y点坐标 sin(弧度)*r toRadians将角度转成弧度

* 安卓坐标系与数学坐标系不同的地方是X轴是相反的,所以为了调整方向,需要将角度+270度

*

* @param canvas

*/

private void drawPointer(Canvas canvas) {

canvas.translate(circleX, circleY);

float hourX = (float) Math.cos(Math.toRadians(hour * 30 + 270))

* circleRadius * 0.5f;

float hourY = (float) Math.sin(Math.toRadians(hour * 30 + 270))

* circleRadius * 0.5f;

float minuteX = (float) Math.cos(Math.toRadians(minute * 6 + 270))

* circleRadius * 0.8f;

float minuteY = (float) Math.sin(Math.toRadians(minute * 6 + 270))

* circleRadius * 0.8f;

float secondX = (float) Math.cos(Math.toRadians(second * 6 + 270))

* circleRadius * 0.8f;

float secondY = (float) Math.sin(Math.toRadians(second * 6 + 270))

* circleRadius * 0.8f;

canvas.drawLine(0, 0, hourX, hourY, circlePaint);

canvas.drawLine(0, 0, minuteX, minuteY, circlePaint);

canvas.drawLine(0, 0, secondX, secondY, dialPaint);

// 一秒重绘一次

handler.sendEmptyMessageDelayed(0, 1000);

}

public void startClock() {

setTimes();

invalidate();

}

private void setTimes() {

Date date = new Date();

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

second = getTimes(date, Calendar.SECOND);

minute = getTimes(date, Calendar.MINUTE);

hour = getTimes(date, Calendar.HOUR) + minute / 12 * 0.2;

}

private int getTimes(Date date, int calendarField) {

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

return calendar.get(calendarField);

}

public void stopClock() {

handler.removeMessages(0);

}

}

Point.java:

package com.example.clock;

public class Point {

private float x;

private float y;

public Point(float x, float y) {

this.x = x;

this.y = y;

}

public float getX() {

return x;

}

public void setX(float x) {

this.x = x;

}

public float getY() {

return y;

}

public void setY(float y) {

this.y = y;

}

}

Acitivity(ClockActivity.java):

package com.example.clock;

import android.app.Activity;

import android.os.Bundle;

public class ClockActivity extends Activity {

/** Called when the activity is first created. */

private ClockView clockView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

clockView = (ClockView) findViewById(R.id.clock);

}

@Override

protected void onResume() {

super.onResume();

clockView.startClock();

}

@Override

protected void onStop() {

super.onStop();

clockView.stopClock();

}

}

xml布局(main.xml):

android:orientation="vertical"

android:layout_width="match_parent"

android:gravity="center"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:id="@+id/clock"

android:layout_height="match_parent" />

希望本文所述对大家Android程序设计有所帮助。

翻页时钟java代码_Android编程基于自定义控件实现时钟功能的方法相关推荐

  1. php左右滑动翻页代码,C#_NGUI实现滑动翻页效果实例代码,废话不多说了,直接给大家上 - phpStudy...

    NGUI实现滑动翻页效果实例代码 废话不多说了,直接给大家上干货了. 具体代码如下所示: using UnityEngine; using System.Collections; public cla ...

  2. Flink系列之:Java代码实现深入浅出的理解Flink算子的使用方法

    Flink系列之:Java代码实现深入浅出的理解Flink算子的使用方法 一.Map算子 二.filter算子 三.flatMap算子 四.keyBy算子 五.Reduce算子 六.union算子 七 ...

  3. 计算机与科学唐家琪,基于网络分析的蛋白质功能预测方法研究

    摘要: 蛋白质是执行生物体内各种重要生物活动的大分子,认识其功能对推动生命科学.农业.医疗等领域的发展意义重大.传统的生物实验测定蛋白质的功能需要消耗大量的人力.物力.财力,并且效率低下,已无法满足数 ...

  4. android控件翻书效果,android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下:import android.content.Context;import androi ...

  5. android 翻书动画效果怎么做,android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import andr ...

  6. 图书浏览界面html代码,javaScript+turn.js实现图书翻页效果实例代码

    为了实现图书翻页的效果我们在网上可以看到很多教程 在这里推荐turn.js 网上的turn.js 有api 不过是英文的  很多人看起来不方便 .关于代码也是奇形怪状在这里我将详细讲解如何使用turn ...

  7. 3D屏保JAVA代码_java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test; import java.awt.Frame; import java.awt.Grap ...

  8. 峰值云变换matlab代码,一种基于密度峰值的云变换方法与流程

    本发明涉及一种基于密度峰值的云变换方法,属于数字图像数据处理技术. 背景技术: 粒计算是基于多层次粒结构研究思维方式.问题求解方法.信息处理模式的理论,早在1997年,Zadeh教授就提出了粒计算是模 ...

  9. 小波变换去雾matlab代码,一种基于小波变换的图像去雾方法

    一种基于小波变换的图像去雾方法 摘要:为获得雾天 关键词:小波变换;Mallat算法;单尺度Retinex;同态滤波 中图分类号:TN957.52文献标识码:A 文章编号:1009-3044(2020 ...

最新文章

  1. contos 安装vim自动补全插件 YCM YouCompleteMe
  2. oracle中ak约束,Oracle自定义聚集函数
  3. 英特尔发布CPU新架构,突破性采用3D堆栈法
  4. 关于delphi中多线程采用定时器的做法
  5. Android SearchView 实现搜索框
  6. python静默打印pdf
  7. 关于射频同轴连接器的功率容量探讨
  8. ”周期天王”20大预言,针针见血,看完整个人通透多了
  9. python打印输出数组中的所有元素
  10. ubuntu12.04.4安装tcl/tk和Tkinter
  11. Idea如何设置类头注释(图片步骤直接到位)
  12. Scratch3.0 二次开发环境部署(一)
  13. 开发工具篇第三讲:Maven从入门到实战
  14. 电源管理芯片的电路结构与分析
  15. EXCEL VBA 备忘录
  16. Linux 查看查找文件
  17. Springboot实现图书馆座位预约管理系统之自习室预约占座系统源码
  18. OC10 -- block / 多态
  19. Markdown 基础操作 | 高级操作 大全+Typora常用快捷键
  20. 旺宏norFlash Security Register OTP空间读写

热门文章

  1. 在微信小程序中实现生成海报图并保存到相册
  2. mac 电脑使用360应用加固,打开闪退(mac系统版本10.13.6和10.12.x)
  3. Julien Nioche谈Apache Nutch 2的特性及产品路线图
  4. 【Scikit-Learn 中文文档】广义线性模型 - 监督学习 - 用户指南 | ApacheCN
  5. 希望可以帮到正在奔波的你—常见安卓面试题
  6. 强大的 10款 Mac 思维导图和流程图软件推荐
  7. 关于VScode设置护眼色的方法
  8. Windows系统下载地址;office下载地址;visio下载地址
  9. 直流电机双闭环(电流环、转速环)调速系统:可以根据给定调节电机转速,同时也可以在负载或电网电压发生变动的时候保持电机转速不变
  10. 【视觉高级篇】19 # 如何用着色器实现像素动画?