我在一个[博客] 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仿小米时钟效果相关推荐

  1. android高仿小米时钟,Android小米时钟 Android仿小米时钟效果

    想了解Android仿小米时钟效果的相关内容吗,jane_dxj在本文为您仔细讲解Android小米时钟的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android,时钟,下面大家一起来 ...

  2. android 高仿小米note4,只要1999! 小米Note4首次曝光:amoled全面屏+骁龙670!

    小米今年的旗舰手机小米MIX2S,确实是颇有诚意和卖点的.虽然和上一代的小米MIX2相比,小米MIX2S在外观方面没能带来创新,不过仅国内首发骁龙845和3299元的良心价,就足以令小米MIX2S力挫 ...

  3. android 高仿小米note4,小米Note4搭载骁龙710,堪称又一部良品再现

    原标题:小米Note4搭载骁龙710,堪称又一部良品再现 那么大家都知道,小米今年的销量上不是很理想,自从小米Max 3的发布更是引起了消费者的失望,最近关于小米的另一款手机也在不断的曝光,据悉这次即 ...

  4. android 高仿小米note2,小米Note2最大遗憾重演,安卓新机皇屏幕素质翻车,三星偷着乐?...

    原标题:小米Note2最大遗憾重演,安卓新机皇屏幕素质翻车,三星偷着乐? 作为谷歌打造的安卓手机标杆,Pixel 2/Pixel 2 XL自然承担着在体验.创新等方面对标iPhone的重任,事实上,在 ...

  5. android 安全检测 动画,Android仿小米安全中心检测进度条效果

    模仿小米安全中心检测效果 废话少说,咱们先上效果图: 这个效果的使用场景并不多,主要是各种检测的时候,比如垃圾清理,手机安全检测, 当然如果你不嫌弃这个效果丑, 也可以用作进度条.哈哈. 下面说点干货 ...

  6. Android自定义View,带你实现小米指南针和时钟

    吾幼时即嗜画,家贫无从至笔墨纸砚,遂从姑苏城外寒山寺搬得红枫叶两筐.未几,吾发现红枫叶蒸包子很不错,所以现在我包的包子很好吃. 我的测试机是小米,我发现小米的指南针和钟表挺好玩的,Android画画又 ...

  7. Android高仿微信图片多选功能

    1.概述 关于手机图片加载器,在当今像素随随便便破千万的时代,一张图片占据的内存都相当可观,作为高大尚程序猿的我们,有必要掌握图片的压缩,缓存等处理,以到达纵使你有万张照片,纵使你的像素再高,我们也能 ...

  8. Android 高仿唱吧 咔拉ok 商业项目开源代码 K歌合成 伴奏录音合成MP3(音频五)

    Android MediaRecorder录音录像 暂停 继续录音 播放 ARM格式(音频一) https://blog.csdn.net/WHB20081815/article/details/88 ...

  9. Android 高仿微信图片选择器

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/39943731,本文出自: [张鸿洋的博客] 1.概述 关于手机图片加载器,在当 ...

  10. android+高仿视频录制,android高仿微信视频编辑页

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

最新文章

  1. Swift 中的内存管理详解
  2. 开机f8修复电脑步骤_电脑无法启动,屏幕显示白色小横条,怎么办?可收藏以备不时之需...
  3. android 电量控件,Android实现显示电量的控件代码
  4. K-Means原理详解与Java代码实现细节
  5. HDU 6170 2017 多校训练:Two strings(DP)
  6. C#强制关闭Excel进程(通过COM使用Excel时)
  7. hdu 1005(规律)
  8. JAVA程序设计(11)-----面对对象0基础设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样...
  9. Regex Tester 安装教程
  10. ERROR - ORA-12560: TNS:protocol adapter error
  11. ExtJs 入门教程
  12. 尚观python培训视频教程
  13. 【历史上的今天】9 月 4 日:谷歌(Google) 23 周年;“人工智能之父” McCarthy 诞生
  14. 云服务器wim7系统激活,云服务器怎么装win7系统教程
  15. 【网页开发】登录注册页面01
  16. js小学生图区_多种方式实现js图片预览
  17. 汽车信息安全系列-3.TI HSM笔记(更新中)
  18. Win10 -- CUDA10 CUDNN 安装
  19. PC远程控制android思路,PC 远程控制 android手机的方法之一VNC
  20. bpsk的matlab仿真,用MATLAB仿真BPSK调制

热门文章

  1. Asp.NET Excel导入数据返回JSON字符
  2. jquery的siblings属性和定时器
  3. Java 给PDF文件添加水印
  4. phalcon mysql_Phalcon 数据库操作总结
  5. HTML+CSS十分钟实现响应式布局页面,响应式布局实战教程
  6. asp.net配置web.config显示详细错误信息
  7. fragment 报Fragment already added错误有几种情况
  8. [707]Apache NiFi安装及简单使用
  9. 计算机2级选择题及答案,计算机二级Office模拟试题及答案
  10. 诺基亚财报遭吐槽:被微软收购比摩托罗拉还蠢