smart漂亮时钟——Android

几天因工作忙,边写边做其它事情。发的贴子也越来越少。不过,我还在努力学习Android的基础知识与大家一起学习和进步。
下面我查了一下资料,编写了时钟源代码。先让我们看一下图先。smart漂亮时钟——Android
smart漂亮时钟——Android

逻辑代码类

package com.smart.impl;



import java.util.Calendar;



import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Rect;

import android.os.Handler;

import android.util.AttributeSet;

import android.view.View;



public class HandClock  extends View implements Runnable

{

	private int clockImageResourceId;

	private Bitmap bitmap;

	private float scale;

	private float handCenterWidthScale;

	private float handCenterHeightScale;

	private int minuteHandSize;

	private int hourHandSize;

	private Handler handler = new Handler();



	@Override

	public void run()

	{

		// 重新绘制View

		invalidate();

		// 重新设置定时器,在60秒后调用run方法

		handler.postDelayed(this, 60 * 1000);

	}



	@Override

	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

	{

		super.onMeasure(widthMeasureSpec, heightMeasureSpec);

		// 根据图像的实际大小等比例设置View的大小

		setMeasuredDimension((int) (bitmap.getWidth() * scale), (int) (bitmap

				.getHeight() * scale));

	}



	@Override

	protected void onDraw(Canvas canvas)

	{

		super.onDraw(canvas);

		Paint paint = new Paint();

		Rect src = new Rect();

		Rect target = new Rect();

		src.left = 0;

		src.top = 0;

		src.right = bitmap.getWidth();

		src.bottom = bitmap.getHeight();



		target.left = 0;

		target.top = 0;

		target.bottom = (int) (src.bottom * scale);

		target.right = (int) (src.right * scale);

		// 画表盘图像

		canvas.drawBitmap(bitmap, src, target, paint);

		// 计算表盘中心点的横纵坐标

		float centerX = bitmap.getWidth() * scale * handCenterWidthScale;

		float centerY = bitmap.getHeight() * scale * handCenterHeightScale;

		// 表表盘中心点画一个半径为5的实心圆圈

		canvas.drawCircle(centerX, centerY, 5, paint);

		// 设置分针为3个象素粗

		paint.setStrokeWidth(3);

		Calendar calendar = Calendar.getInstance();

		int currentMinute = calendar.get(Calendar.MINUTE);

		int currentHour = calendar.get(Calendar.HOUR);

		// 计算分针和时间的角度

		double minuteRadian = Math

				.toRadians((360 - ((currentMinute * 6) - 90)) % 360);

		double hourRadian = Math.toRadians((360 - ((currentHour * 30) - 90))

				% 360 - (30 * currentMinute / 60));

		// 在表盘上画分针

		canvas.drawLine(centerX, centerY, (int) (centerX + minuteHandSize

				* Math.cos(minuteRadian)), (int) (centerY - minuteHandSize

				* Math.sin(minuteRadian)), paint);

		// 设置实针为4个象素粗

		paint.setStrokeWidth(4);

		// 在表盘上画分针

		canvas.drawLine(centerX, centerY, (int) (centerX + hourHandSize

				* Math.cos(hourRadian)), (int) (centerY - hourHandSize

				* Math.sin(hourRadian)), paint);

	}



	public HandClock(Context context, AttributeSet attrs)

	{

		super(context, attrs);

		// 读取相应的属性值

		clockImageResourceId = attrs.getAttributeResourceValue(null,

				"clockImageSrc", 0);

		if (clockImageResourceId > 0)

			bitmap = BitmapFactory.decodeResource(getResources(),

					clockImageResourceId);

		scale = attrs.getAttributeFloatValue(null, "scale", 1);

		handCenterWidthScale = attrs.getAttributeFloatValue(null,

				"handCenterWidthScale", bitmap.getWidth() / 2);

		handCenterHeightScale = attrs.getAttributeFloatValue(null,

				"handCenterHeightScale", bitmap.getHeight() / 2);

		//  在读取分针和时针长度后,将其值按图像的缩放比例进行缩放

		minuteHandSize = (int) (attrs.getAttributeIntValue(null,

				"minuteHandSize", 0) * scale);

		hourHandSize = (int) (attrs.getAttributeIntValue(null, "hourHandSize",

				0) * scale);

		int currentSecond = Calendar.getInstance().get(Calendar.SECOND);

		//  将定时器设在0分时执行run方法

		handler.postDelayed(this, (60 - currentSecond) * 1000);

	}



	@Override

	protected void onDetachedFromWindow()

	{

		super.onDetachedFromWindow();

		//  删除回调类

		handler.removeCallbacks(this);

	}



}

大家如果要原代码请到

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=58324&extra=   下载

你可能感兴趣的:(android)