Android 放图片背景的时钟
自定义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 放图片背景的时钟相关推荐
- Android大图片背景性能优化篇
内存优化-Android大图片 最近在做一个游戏项目,项目中使用大量的1080P作为背景图片,整个APP内存很快就超过峰值,导致项目中出现多处内存溢出.掉帧现象. Meizu Mx4pro(260M左 ...
- android png图片背景黑色,Android中显示PNG图标背景变黑色
最近项目中遇到一个问题:就是从网络获取应用PNG图标后,显示到GridView中,发现图标透明的地方都变成了黑色?为什么呢? 个人习惯有问题先梳理一遍代码: 一.从网络异步下载图标并显示代码 clas ...
- Android 提取图片背景方法(纯色)
实现目标:提取随意一张图片的7种颜色(图片拥有7种以上的颜色),可作为背景色使用. 布局(自己增添toolbar): <?xml version="1.0" encoding ...
- Android ImageView图片显示点击背景切换
为什么80%的码农都做不了架构师?>>> 一.介绍 ImageView用来显示任意图像图片,可以自己定义显示尺寸,显示颜色等等. 二.XML属性 android:adjustV ...
- android沉浸式状态栏 图片背景,Android App 沉浸式状态栏解决方案
伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material ...
- android textview获取背景颜色,Android TextView背景颜色与背景图片设置
Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...
- android edittext背景颜色,Android 设置 EditText 背景颜色、背景图片
Android 设置 EditText 背景颜色mView.findViewById(R.id.editText).setBackgroundResource(R.color.caution); An ...
- Android Activity 设置背景图片
设置Activity图片背景 Android(Activity)设置背景图片方法: xml布局中用andriod:background = "@drawable/bgimage"或 ...
- android arcgis使用自定义图片背景底图(tif图片制作)
简介 arcgis在安卓中专业级位置服务中发挥了很大的作用,当然主要目的不是为了像百度地图那样显示地图,它包含了很多很多百度地图等不具备的功能.一般使用它都是用的范围很大的shp文件做底图,但是也有只 ...
最新文章
- javascript中文网学习
- 如何判断ListView中的CheckItem项是否选中?并将所以选项从ListView控件中删除?
- Unity3D为何能跨平台?聊聊CIL(MSIL)
- 电脑没有ps怎么改照片dpi_PS入门的小技巧来啦!小白们还在等什么呢?快进来啊!...
- OpenGL之矩阵堆栈绘制立体图元
- 记录层序遍历中每层右侧第一个数字 Binary Tree Right Side View
- [译] 机器学习可以建模简单的数学函数吗?
- 很少人知道,但是非常实用的 Python 库
- web 折线图大数据量拉取展示方案_分布式、服务化的企业级 ERP 系统架构设计方案...
- 银河麒麟配置java环境_中标麒麟系统上安装Java、Eclipse指南.doc
- 机房收费系统重构版:那个系统我们一起遇到的问题
- 一款DYI动态桌面壁纸程序
- PowerDesigner 16.5下载安装包
- 【neo4j】知识图谱实战---构建红楼梦知识图谱
- WORD文档不能打开的一些原因
- 了解到的生二孩最好的理由
- python爬取boss直招_简易python爬虫爬取boss直聘职位,并写入excel
- golang版本管理gvm
- 利用onnxsim对onnx模型进行简化
- 阿龙的学习笔记---哈希表与C++11中unordered_map学习笔记
热门文章
- Linux 下摄像头视频采集与显示
- android 分组宫格菜单,android 九宫格(16宫格)控件
- aes sm1 对比_RFID安全问题的解读
- 【FLASH存储器系列十一】Nand Flash芯片使用指导之一
- maijia.youzan_来自YouZan的Vue.js 2.0移动用户界面
- 传述最详细的干货,让简历面试不再成为你找工作的绊脚石
- vivo x7安卓7.1降5.1降级包,以及救砖包
- CiscoCUCM电话注册
- 在win10中开启64位ie浏览器的方法(IE11)
- MP3音频歌词添加背景