转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!

简介

灵感源自360手机卫,主要功能就是实现显示评分或等级的效果。并稍微改良了一下,有更好的实用性和扩展性。

因为主要用途就是显示“分数”,“评价”,所以暂且叫它RatingView

RatingView由多个可自定义的RatingBar组成,RatingBar代表要显示的单个条目。


效果图:

360手机卫士截图:

效果图1:包含4个RatingBar。

效果图2:可以自由设置RatingBar个数。

效果图3:可自定义颜色

效果图4:在我自己做的户外探子上的效果。


组成:

RatingView

控件整体为一个RatingView,控件的外围由多个可自定义的RatingBar组成。控件中心区域可以自由添加布局或控件。

RatingBar

RatingBar代表要显示的单个条目。由3部分组成:

  • 最外圈虚线:顺时针旋转。
  • 打分条:逆时针旋转。
  • 文字:旋转结束后渐隐显示。

实现思路:

思路很简单,控件本身可以理解成一个圆,这个圆分为外圈和内圈。

外圈:可以显示打分和文字,并且有一个旋转动画。

内圈:可以添加任意的布局和控件。

难点在于外圈,外圈可以看成一个圆环,圆环内包含多个等分的扇形,而每一个等份可以看做一个扇形圆环。

现在思路清晰了,只要画出等分的扇形圆环这个控件已经完成一半了。

画扇形:

Android中画图使用Canvas类,具体就不介绍了。里面有一个函数可以用来画弧线。

public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
  • oval :指定圆弧的外轮廓矩形区域。
  • startAngle: 圆弧起始角度,单位为度。
  • sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
  • useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
  • paint: 绘制圆弧的画板属性,如颜色,是否填充等。

下面代码就可以画出一个60度的扇形圆环:

/** 定义画笔 **/
Paint paint = new Paint();
paint.setAntiAlias(true); // 抗锯齿
paint.setStyle(Paint.Style.STROKE); // 带轮廓
paint.setStrokeWidth(10); // 轮廓宽度(轮廓宽度就是圆环宽度) /** 定义绘制区域 **/
RectF oval = new RectF(0, 0, 100, 100); // 100 * 100的区域 /** 在onDraw方法中画弧线 **/
canvas.drawArc(oval, 0, 60, false, paint); // 弧度0-60,不包括圆心的圆弧

旋转扇形:

扇形画好后,就该让它旋转起来了。Canvas已经提供了旋转的函数。

public void rotate(float degrees, float px, float py)
  • degrees :旋转的角度
  • px: 旋转点x坐标
  • py: 旋转点y坐标

可以通过Android提供的ValueAnimator,给出动画的旋转角度,然后在onDraw方法中调用旋转函数,这个扇形圆环就转起来了。

锁定画布:

前面说了,外圈还细分为最外圈的虚线,需要顺时针转,内环打分条需要逆时针转,所以这时候就需要锁定画布,让不同的扇形圆环按不同的角度旋转。

锁定画布需要使用canvas.save()canvas.restore()两个函数。

  • save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
  • restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

画文字:

在视图的最外侧有一个贴着扇形圆环的文字,所以这里就需要使用另一个canvas提供的方法来画带弧度的文字。

public void drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint)
  • Path绘制文本的路径
  • hOffset水平偏移
  • vOffset垂直偏移

计算:

剩下的任务就是数学计算了,需要根据Ratingbar的个数将圆环等分,并计算文字大小和位置,计算Ratingbar的每个刻度大小位置,处理动画,设置颜色等,就不一一介绍了。


使用&源码:

代码已经放在Github上了,具体的使用和源码下载大家可以访问下面的链接:

https://github.com/a396901990/RatingView


PS:

目前我独自开发了一款户外工具类的App户外探子,主要为进藏等长途户外路线提供攻略和帮助。

最开始只是个人兴趣,给自己用的,因为我自己骑行过川藏线和新藏线。后来慢慢的东西越加越多,就做上线了。

以后博客应该会写一些做这个app时,用到的知识点、开源项目、遇到的各种问题。

ANDROID——仿360手机卫士的旋转打分控件的更多相关文章

  1. Android 控件进阶修炼-仿360手机卫士波浪球进度控件

    技术:Android+java   概述 像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitma ...

  2. Android仿360手机卫士悬浮窗效果

    请看下图:                         首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下 ...

  3. 仿360手机卫士界面效果android版源码

    仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...

  4. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  5. Android 自定义View修炼-仿360手机卫士波浪球进度的实现

    像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitmap的方式,大概的方法原理是: (1)首先用 ...

  6. Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...

  7. Android手机安全软件的恶意程序检测靠谱吗--LBE安全大师、腾讯手机管家、360手机卫士恶意软件检测方法研究

    转载请注明出处,谢谢. Android系统开放,各大论坛活跃,应用程序分发渠道广泛,这也就为恶意软件的传播提供了良好的环境.好在手机上安装了安全软件,是否能有效的检测出恶意软件呢?下边针对LBE安全大 ...

  8. Android静默安装实现方案,仿360手机助手秒装和智能安装功能

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有非常多朋友都问过我.在Android系统中如何才干实现静默安装 ...

  9. 由360手机卫士谈起——让你的service获取最高权限。

    近日来,我在倒腾360手机卫士的时候,发现,你无论是把他数据清空,还是把它强行停止以后,甚至是把它卸载以后,它的service都没有被Android的系统干掉,依然是岿然不动了.我就感到了纳闷了,后来 ...

随机推荐

  1. Sping Environment为Null的原因和解决方法

    参考:https://github.com/spring-projects/spring-boot/issues/4711 这个issue提出不到20天给我搜出来了,还是相信google的强大 问题: ...

  2. 转MongoDB 使用Skip和limit分页

    关于MongoDB 数据分页和排序 limit,skip用户的一些基础语句,介绍MongoDB 数据分页和排序实例方法. 使用Skip和limit可以如下做数据分页: Code: page1 = db ...

  3. JAVA泛型? T K V E等代表的意思

    ? 表示不确定的java类型. T  表示java类型. K V 分别代表java键值中的Key Value. E 代表Element. Object跟这些东西代表的java类型有啥区别呢? Obje ...

  4. MVVM deep dive

    You can get a different instance each time by passing a different key to the GetInstance method. How ...

  5. Odoo中的Javascript单元测试

    前端页面利用QUnit进行单元测试,本文参考官方文档:https://www.odoo.com/documentation/8.0/reference/javascript.html 访问/web/t ...

  6. ZedBoard 引脚约束参考

    从ISE转换到Vivado时,UCF转XDC的几种方法: (1)软件自动转换 参考网址:Youtube 用ISE->EDK->PlanAhead打开所需转换的工程文件*.xise,并打开b ...

  7. 关于百度分享——bdCustomStyle一点bug

    最近碰到一个项目,因为用上百度分享,出现了奇怪的bug. 具体是,当访问JSP页面时,js脚本会执行一次,而java脚本执行了两次. 最后排查发现是百度分享js脚本的问题,把"bdCusto ...

  8. 日历js插件

    因为做了一个培训管理模块,要有一个开始与结束培训时间.时间日期如果个用户手动输入的话,即使你要求了时间格式,但是用户可能还是会输错时间格式.所以想想,还是找了一个js日历插件.下面来介绍下我自己用的一 ...

  9. Android课程---帧布局 FrameLayout

    帧布局的特点是: 1.多个组件,层叠显示 2.所占位置和大小由组件决定 示例代码: <?xml version="1.0" encoding="utf-8" ...

  10. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset(可持久化Trie)

    D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input standa ...