smart漂亮时钟——Android

几天因工作忙,边写边做其它事情。发的贴子也越来越少。不过,我还在努力学习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=   下载

posted on 2011-02-15 16:18  llb988  阅读(855)  评论(0编辑  收藏  举报

导航