自定义View 时钟:可以用画布和画笔直接画时钟画刻度,画指针,但是,效果不是很好看,这篇文章主要介绍,两种采用背景图设置的时钟,包括表盘,指针,都是图片。

效果图:

                       

代码:

需要注意的是,指针放的位置,是根据指针图片资源而设置的,一定要注意,指针上得红点是在中心位置的,

放图片资源,有两种方法,

一种是:canvas.drawBitmap()这种方法只需确定图片的  左边和上边两个位置就好

第二种:dial.setBounds () 这种方法需要确定图片上下左右四边位置,画边界线

指针的旋转角度,逻辑都一样,都是先把指针放在零点方向,就是12点位置,然后根据时间算角度

最后是采用Handler 每隔一秒重新绘制时钟。。。。。。

View  1:


/*** Created by Megan on 16/3/29.*/
public class ClockView extends View {//时钟图片private Bitmap mClock;//时private Bitmap mHourHand;//分private Bitmap mMinuteHand;//秒private Bitmap mSecondHand;private Calendar mCalendar;public static final int NEED_INVALIDATE = 0X23;//每隔一秒,在handler中调用一次重新绘制方法private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case NEED_INVALIDATE:mCalendar = Calendar.getInstance();invalidate();//告诉UI主线程重新绘制handler.sendEmptyMessageDelayed(NEED_INVALIDATE, 1000);break;default:break;}}};public ClockView(Context context) {super(context);}public ClockView(Context context, AttributeSet attrs) {super(context, attrs);mCalendar = Calendar.getInstance();Resources r = this.getContext().getResources();/*** 资源图片读取*/mClock = BitmapFactory.decodeResource(r, R.drawable.clock_dial);mHourHand = BitmapFactory.decodeResource(r, R.drawable.clock_hour);mMinuteHand = BitmapFactory.decodeResource(r, R.drawable.clock_minute);mSecondHand = BitmapFactory.decodeResource(r, R.drawable.clock_second);handler.sendEmptyMessage(NEED_INVALIDATE);//向handler发送一个消息,让它开启重绘}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int minute = mCalendar.get(Calendar.MINUTE);//得到当前分钟数int hour = mCalendar.get(Calendar.HOUR);//得到当前小时数int sec = mCalendar.get(Calendar.SECOND);//得到当前秒数Paint paint = new Paint();// TODO 时钟背景图canvas.drawBitmap(mClock, getWidth() / 2 - mClock.getWidth() / 2, getHeight() / 2 - mClock.getWidth() / 2, paint);canvas.save();//保存当前画布canvas.restore();// TODO 时针float hourDegree = (hour * 60 + minute) / 12f / 60 * 360;//得到时钟旋转的角度canvas.save();canvas.rotate(hourDegree, getWidth() / 2, getHeight() / 2);canvas.drawBitmap(mHourHand, getWidth() / 2-mHourHand.getWidth()/2, getHeight() / 2-mHourHand.getHeight()/2, paint);canvas.restore();// TODO 分针float minuteDegree = minute / 60f * 360;//得到分针旋转的角度canvas.save();canvas.rotate(minuteDegree, getWidth() / 2, getHeight() / 2);canvas.drawBitmap(mMinuteHand, getWidth()/2-mMinuteHand.getWidth()/2, getHeight()/2-mMinuteHand.getHeight()/2, paint);canvas.restore();// TODO 秒针float secDegree = sec / 60f * 360;//得到秒针旋转的角度canvas.save();canvas.rotate(secDegree, getWidth() / 2, getHeight() / 2);canvas.drawBitmap(mSecondHand, getWidth() / 2-mSecondHand.getWidth()/2, getHeight() / 2-mSecondHand.getHeight()/2, paint);canvas.restore();}
}

View 2:


/*** Created by Megan on 16/3/31.*/
public class TimeView extends View {private static String TAG = "AbAnalogClock";private Drawable mHourHand;private Drawable mMinuteHand;private Drawable mSecondHand;private Drawable mDial;private Calendar mCalendar;public static final int NEED_INVALIDATE = 0X23;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case NEED_INVALIDATE:mCalendar = Calendar.getInstance();invalidate();//告诉UI主线程重新绘制handler.sendEmptyMessageDelayed(NEED_INVALIDATE, 1000);break;default:break;}}};public TimeView(Context context, AttributeSet attrs) {super(context);mDial = this.getContext().getResources().getDrawable(R.drawable.clock_dial);mHourHand = this.getContext().getResources().getDrawable(R.drawable.clock_hour);mMinuteHand = this.getContext().getResources().getDrawable(R.drawable.clock_minute);mSecondHand = this.getContext().getResources().getDrawable(R.drawable.clock_second);mCalendar = Calendar.getInstance();handler.sendEmptyMessage(NEED_INVALIDATE);//向handler发送一个消息,让它开启重绘}protected void onDraw(Canvas canvas) {super.onDraw(canvas);int minute = mCalendar.get(Calendar.MINUTE);//得到当前分钟数int hour = mCalendar.get(Calendar.HOUR);//得到当前小时数int sec = mCalendar.get(Calendar.SECOND);//得到当前秒数int availableWidth = this.getRight() - this.getLeft();int availableHeight = this.getBottom() - this.getTop();int x = availableWidth / 2;int y = availableHeight / 2;Drawable dial = this.mDial;int w = dial.getIntrinsicWidth();int h = dial.getIntrinsicHeight();// TODO 时钟背景图if (availableWidth < w || availableHeight < h) {float hourHand = Math.min((float) availableWidth / (float) w, (float) availableHeight / (float) h);canvas.save();canvas.scale(hourHand, hourHand, (float) x, (float) y);}dial.setBounds(x - w / 2, y - h / 2, x + w / 2, y + h / 2);dial.draw(canvas);// TODO 时针canvas.save();canvas.rotate((hour * 60.0F + minute) /12 /60 * 360.0F, (float) x, (float) y);Drawable hourHand1 = this.mHourHand;w = hourHand1.getIntrinsicWidth();h = hourHand1.getIntrinsicHeight();hourHand1.setBounds(x - w / 2, y - h / 2, x + w / 2, y + h / 2);hourHand1.draw(canvas);canvas.restore();// TODO 分针canvas.save();canvas.rotate(minute / 60.0F * 360.0F, (float) x, (float) y);Drawable minuteHand = this.mMinuteHand;w = minuteHand.getIntrinsicWidth();h = minuteHand.getIntrinsicHeight();minuteHand.setBounds(x - w / 2, y - h / 2, x + w / 2, y + h / 2);minuteHand.draw(canvas);canvas.restore();// TODO 秒针canvas.save();canvas.rotate(sec / 60.0F * 360.0F, (float) x, (float) y);Drawable secondHand = this.mSecondHand;w = secondHand.getIntrinsicWidth();h = secondHand.getIntrinsicHeight();secondHand.setBounds(x - w / 2, y - h / 2, x + w / 2, y + h / 2);secondHand.draw(canvas);canvas.restore();}}

源码: http://download.csdn.net/detail/qq55214/9479400

Android 放图片背景的时钟相关推荐

  1. Android大图片背景性能优化篇

    内存优化-Android大图片 最近在做一个游戏项目,项目中使用大量的1080P作为背景图片,整个APP内存很快就超过峰值,导致项目中出现多处内存溢出.掉帧现象. Meizu Mx4pro(260M左 ...

  2. android png图片背景黑色,Android中显示PNG图标背景变黑色

    最近项目中遇到一个问题:就是从网络获取应用PNG图标后,显示到GridView中,发现图标透明的地方都变成了黑色?为什么呢? 个人习惯有问题先梳理一遍代码: 一.从网络异步下载图标并显示代码 clas ...

  3. Android 提取图片背景方法(纯色)

    实现目标:提取随意一张图片的7种颜色(图片拥有7种以上的颜色),可作为背景色使用. 布局(自己增添toolbar): <?xml version="1.0" encoding ...

  4. Android ImageView图片显示点击背景切换

    为什么80%的码农都做不了架构师?>>>    一.介绍 ImageView用来显示任意图像图片,可以自己定义显示尺寸,显示颜色等等. 二.XML属性 android:adjustV ...

  5. android沉浸式状态栏 图片背景,Android App 沉浸式状态栏解决方案

    伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material ...

  6. android textview获取背景颜色,Android TextView背景颜色与背景图片设置

    Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...

  7. android edittext背景颜色,Android 设置 EditText 背景颜色、背景图片

    Android 设置 EditText 背景颜色mView.findViewById(R.id.editText).setBackgroundResource(R.color.caution); An ...

  8. Android Activity 设置背景图片

    设置Activity图片背景 Android(Activity)设置背景图片方法: xml布局中用andriod:background = "@drawable/bgimage"或 ...

  9. android arcgis使用自定义图片背景底图(tif图片制作)

    简介 arcgis在安卓中专业级位置服务中发挥了很大的作用,当然主要目的不是为了像百度地图那样显示地图,它包含了很多很多百度地图等不具备的功能.一般使用它都是用的范围很大的shp文件做底图,但是也有只 ...

最新文章

  1. javascript中文网学习
  2. 如何判断ListView中的CheckItem项是否选中?并将所以选项从ListView控件中删除?
  3. Unity3D为何能跨平台?聊聊CIL(MSIL)
  4. 电脑没有ps怎么改照片dpi_PS入门的小技巧来啦!小白们还在等什么呢?快进来啊!...
  5. OpenGL之矩阵堆栈绘制立体图元
  6. 记录层序遍历中每层右侧第一个数字 Binary Tree Right Side View
  7. [译] 机器学习可以建模简单的数学函数吗?
  8. 很少人知道,但是非常实用的 Python 库
  9. web 折线图大数据量拉取展示方案_分布式、服务化的企业级 ERP 系统架构设计方案...
  10. 银河麒麟配置java环境_中标麒麟系统上安装Java、Eclipse指南.doc
  11. 机房收费系统重构版:那个系统我们一起遇到的问题
  12. 一款DYI动态桌面壁纸程序
  13. PowerDesigner 16.5下载安装包
  14. 【neo4j】知识图谱实战---构建红楼梦知识图谱
  15. WORD文档不能打开的一些原因
  16. 了解到的生二孩最好的理由
  17. python爬取boss直招_简易python爬虫爬取boss直聘职位,并写入excel
  18. golang版本管理gvm
  19. 利用onnxsim对onnx模型进行简化
  20. 阿龙的学习笔记---哈希表与C++11中unordered_map学习笔记

热门文章

  1. Linux 下摄像头视频采集与显示
  2. android 分组宫格菜单,android 九宫格(16宫格)控件
  3. aes sm1 对比_RFID安全问题的解读
  4. 【FLASH存储器系列十一】Nand Flash芯片使用指导之一
  5. maijia.youzan_来自YouZan的Vue.js 2.0移动用户界面
  6. 传述最详细的干货,让简历面试不再成为你找工作的绊脚石
  7. vivo x7安卓7.1降5.1降级包,以及救砖包
  8. CiscoCUCM电话注册
  9. 在win10中开启64位ie浏览器的方法(IE11)
  10. MP3音频歌词添加背景