全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android仿小米时钟效果

我在一个[博客] android*小米时钟(使用Camera和Matrix实现3D效果)上面看到了小米时钟实现.特别感兴趣.就认真的看了一遍.并自己敲了一遍.下面说下我自己的理解和我的一些改进的地方效果真的特别棒就发布了自己的时钟应用。

先上图(电脑没有gif截图软件.大家凑合看.哪个软件好也可以给我推荐下)

话不多说,首先自定义控件XimiClockView继承view  并做一些初始化的操作
看到的漂亮时钟图片我自己画的效果图(以后妈妈再也不用担心我迟到了)

public XimiClockView(Context context) {
 super(context);
 init(context, null);
 }

 public XimiClockView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context, attrs);
 }

 public XimiClockView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init(context, attrs);
 }

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public XimiClockView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
 super(context, attrs, defStyleAttr, defStyleRes);
 init(context, attrs);
 }

 /**
 * 进行一些初始化的操作
 *
 * @param context
 * @param attrs
 */
 private void init(Context context, AttributeSet attrs) {
 if (attrs == null) return;
 TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyClockView);
 backGroundColor = array.getColor(R.styleable.MyClockView_clockBackColor, Color.parseColor("#2078A8"));
 drakColor = array.getColor(R.styleable.MyClockView_clockDarkColor, Color.parseColor("#96C2D8"));
 lightColor = array.getColor(R.styleable.MyClockView_clockLightColor, Color.parseColor("#ffffff"));
 array.recycle();//注意这里别忘了调用recycle()方法,[原因](http://www.cnblogs.com/kissazi2/p/4049982.html)
 //设置背景色
 setBackgroundColor(backGroundColor);
 //文本画笔
 textPaint = new Paint();
 textPaint.setColor(drakColor);
 textPaint.setTextSize(25);
 textRect = new Rect();
 }

然后在onSizeChange方法中调用获取时钟半径,和一些其他的计算

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 //获取时钟的半径
 mRadius = Math.min(w - getPaddingLeft() - getPaddingRight(), h - getPaddingTop() - getPaddingBottom()) / 2;
 //为了防止时钟旋转的时候超出了界限,默认加一个padding值
 defaultPadding = 0.12f * mRadius;
 //圆弧的宽度
 mCircleWidth = 0.012f * mRadius;
 //圆环的宽度
 mCircleRingWidth = 0.12f*mRadius;
 paddingLeft = w / 2 - mRadius + getPaddingLeft() + defaultPadding;
 paddingTop = h / 2 - mRadius + getPaddingTop() + defaultPadding;
 paddingRight = w / 2 - mRadius + getPaddingRight() + defaultPadding;
 paddingBottom = h / 2 - mRadius + getPaddingBottom() + defaultPadding;
 mSweepGradient = new SweepGradient(w / 2,h / 2 ,new int[]{drakColor,lightColor},new float[]{0.75f,1f});
 }

画Text

@Override
 protected void onDraw(Canvas canvas) {
 mCanvas = canvas;
 drawTimeText();
 }

 /**
 * 画12 /3 /6 /9时间
 */
 private void drawTimeText() {
 String str = "12";
 textPaint.getTextBounds(str, 0, str.length(), textRect);
 int lengthTextWidth = textRect.width();
 int textHeight = textRect.height();
 int width=getWidth();
 int height=getHeight();
 mCanvas.save();//保存画布的状态
 mCanvas.drawText(str, width / 2-lengthTextWidth/2,paddingTop+textHeight,textPaint);
 str="3";
 textPaint.getTextBounds(str, 0, str.length(), textRect);
 int smallTextWidth = textRect.width();
 mCanvas.drawText("3",width-paddingRight-lengthTextWidth/2-smallTextWidth/2,height/2+textHeight/2,textPaint);
 mCanvas.drawText("6",width / 2-smallTextWidth/2,height-paddingBottom,textPaint);
 mCanvas.drawText("9",paddingLeft,height/2+textHeight/2,textPaint);
 mCanvas.restore();//取出画布的状态
 }

崩溃写完了,我发表时候提示我没有登录,然后发表异常,然后我一刷新没了,,,又重新写一遍,

接下来画圆弧

 /**
 * 画圆弧
 */
 private void drawCircleArc() {
 mCanvas.save();
 mCirclePaint.setStyle(Paint.Style.STROKE);//设置空心模式
 mCirclePaint.setStrokeWidth(mCircleWidth);//设置圆弧宽度
 mCircleRectF.set(paddingLeft + textRect.width() / 2, paddingTop + textRect.height() / 2, getWidth() - paddingRight - textRect.width() / 2, getHeight() - paddingBottom - textRect.height() / 2);
 for (int x = 0; x < 4; x++) {
 //圆弧分四段来画,一段话80度
  mCanvas.drawArc(mCircleRectF, 5 + 90 * x, 80, false, mCirclePaint);
 }
 mCanvas.restore();
 }

画刻度

/**
 * 画圆环和刻度
 */
 private void drawCircleRing() {
 mCanvas.save();
 //画圆环
 mCircleRingRectF.set(paddingLeft+textRect.height()/2+1.5f*mCircleRingWidth,paddingTop+textRect.height()/2+1.5f*mCircleRingWidth,getWidth()-paddingRight-textRect.height()/2-1.5f*mCircleRingWidth,
  getHeight()-paddingBottom-textRect.height()/2-1.5f*mCircleRingWidth);
 mMatrix.setRotate(mDegreeS-90,getWidth()/2,getHeight()/2);
 mSweepGradient.setLocalMatrix(mMatrix);
 mCircleRingPaint.setStyle(Paint.Style.STROKE);
 mCircleRingPaint.setStrokeWidth(mCircleRingWidth);
 mCircleRingPaint.setShader(mSweepGradient);
 mCanvas.drawArc(mCircleRingRectF,0,360,false,mCircleRingPaint);
 //画刻度
 mScaleLinePaint.setStrokeWidth(0.1f*mCircleRingWidth);//设置线的宽度
 for (int i=0;i<200;i++){
  //画刻度线
  mCanvas.drawLine(getWidth()/2,paddingTop+textRect.height()/2+mCircleRingWidth,getWidth()/2,paddingTop+textRect.height()/2+2*mCircleRingWidth,mScaleLinePaint);
  mCanvas.rotate(1.8f,getWidth()/2,getHeight()/2);//旋转角度
 }
 mCanvas.restore();
 }

画秒针

 /**
 * 画秒针
 * 秒针针是不规则的图形
 * 就用到了Path这个类
 *
 */
 private void drawSoundHand() {
 mCanvas.save();
 path.reset();
 mCanvas.rotate(mDegreeS,getWidth()/2,getHeight()/2);//旋转的角度和旋转的圆心
 path.moveTo(getWidth()/2,paddingTop+textRect.height()/2+0.27f*mRadius);//开始的点
 path.lineTo(getWidth()/2+0.03f*mRadius,paddingTop+textRect.height()/2+0.31f*mRadius);//直线到这个位置
 path.lineTo(getWidth()/2-0.03f*mRadius,paddingTop+textRect.height()/2+0.31f*mRadius);//直线到这个位置
 path.close();
 mCanvas.drawPath(path,mSoundHandPaint);
 mCanvas.restore();
 }

画时针

 /**
 * 画时针
 */
 private void drawHourHand() {
 mCanvas.save();
 mCanvas.rotate(mDegreeH,getWidth()/2,getHeight()/2);
 hourHandPath.reset();
 hourHandPath.moveTo(getWidth()/2-0.02f*mRadius,getHeight()/2);
 hourHandPath.lineTo(getWidth()/2-0.01f*mRadius,getHeight()/2-0.35f*mRadius);
 //贝塞尔曲线
 hourHandPath.quadTo(getWidth()/2,getHeight()/2-0.38f*mRadius,getWidth()/2+0.01f*mRadius,getHeight()/2-0.35f*mRadius);
 hourHandPath.lineTo(getWidth()/2+0.02f*mRadius,getHeight()/2);
 hourHandPath.close();
 mCanvas.drawPath(hourHandPath,mHourHandPaint);
 mCanvas.restore();
 }

画分针

 /**
 * 画分针
 */
 private void drawMinnuteHand() {
 mCanvas.save();
 mCanvas.rotate(mDegreeM,getWidth()/2,getHeight()/2);
 mMinutePath.reset();
 mMinutePath.moveTo(getWidth()/2-0.012f*mRadius,getHeight()/2);
 mMinutePath.lineTo(getWidth()/2-0.006f*mRadius,getHeight()/2-0.40f*mRadius);
 mMinutePath.quadTo(getWidth()/2,getHeight()/2-0.43f*mRadius,getWidth()/2+0.006f*mRadius,getHeight()/2-0.40f*mRadius);
 mMinutePath.lineTo(getWidth()/2+0.012f*mRadius,getHeight()/2);
 mMinutePath.close();
 mCanvas.drawPath(mMinutePath,mMinutePaint);
 //画圈圈盖着时针的尾部
 mCanvas.drawCircle(getWidth()/2,getHeight()/2,0.03f*mRadius,mMinutePaint);
 mCanvas.drawCircle(getWidth()/2,getHeight()/2,0.015f*mRadius,mCircleMinPaint);
 mCanvas.restore();
 }

上我的measure的方法

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 setMeasuredDimension(getMeasure(widthMeasureSpec), getMeasure(heightMeasureSpec));
 }

 private int getMeasure(int measureSpec) {
 int result;
 int mode = MeasureSpec.getMode(measureSpec);
 int size = MeasureSpec.getSize(measureSpec);
 if (mode == MeasureSpec.EXACTLY) {
  result = size;
 } else {
  result = 800;
  if (mode == MeasureSpec.AT_MOST) {
  result = Math.min(result, size);
  }
 }
 return result;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 时钟  # Android获取设备CPU核数、时钟频率以及内存大小的方法  # Android多功能时钟开发案例(实战篇)  # android实现widget时钟示例分享  # Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果  # Android多功能时钟开发案例(基础篇)  # android高仿小米时钟(使用Camera和Matrix实现3D效果)  # Android实现简单时钟View的方法  # Android自定义动态壁纸开发(时钟)  # Android编程基于自定义控件实现时钟功能的方法  # Android自定义View实现时钟功能  # 一遍  # 自己的  # 给我  # 我在  # 看了  # 我一  # 其他的  # 感兴趣  # 自定义  # 没了  # 就用  # 别忘了  # 多说  # 敲了  # 为了防止  # 大家多多  # 迟到了  # 一段话  # 塞尔  # 上图 


相关文章: 网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  个人摄影网站制作流程,摄影爱好者都去什么网站?  制作旅游网站html,怎样注册旅游网站?  盐城做公司网站,江苏电子版退休证办理流程?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在新浪SAE免费搭建个人博客?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  Android自定义listview布局实现上拉加载下拉刷新功能  如何选择网络建站服务器?高效建站必看指南  建站上传速度慢?如何优化加速网站加载效率?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  Swift开发中switch语句值绑定模式  建站之星代理费用多少?最新价格详情介绍  高端建站如何打造兼具美学与转化的品牌官网?  如何破解联通资金短缺导致的基站建设难题?  如何在Golang中使用replace替换模块_指定本地或远程路径  建站之星展会模版如何一键下载生成?  文字头像制作网站推荐软件,醒图能自动配文字吗?  网站制作的步骤包括,正确网址格式怎么写?  建站之星代理商如何保障技术支持与售后服务?  中山网站推广排名,中山信息港登录入口?  html制作网站的步骤有哪些,iapp如何添加网页?  如何配置WinSCP新建站点的密钥验证步骤?  手机网站制作与建设方案,手机网站如何建设?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在宝塔面板创建新站点?  网站企业制作流程,用什么语言做企业网站比较好?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在Tomcat中配置并部署网站项目?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  制作农业网站的软件,比较好的农业网站推荐一下?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  孙琪峥织梦建站教程如何优化数据库安全?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  微信h5制作网站有哪些,免费微信H5页面制作工具?  Python多线程使用规范_线程安全解析【教程】  如何用IIS7快速搭建并优化网站站点?  如何在景安云服务器上绑定域名并配置虚拟主机?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何登录建站主机?访问步骤全解析  家具网站制作软件,家具厂怎么跑业务?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  教学论文网站制作软件有哪些,写论文用什么软件 ?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站之星安装后如何自定义网站颜色与字体?  完全自定义免费建站平台:主题模板在线生成一站式服务  音响网站制作视频教程,隆霸音响官方网站?  如何获取开源自助建站系统免费下载链接? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。