Android自定义View之七色环颜色采集器:续我未完的大学梦!!


一、前言。

在大学期间,看到机智云开源的这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色,甚是不解!这个谜团一直在心中困惑。

越是好奇,越是扬起袖子就是干!于是乎,自己结合自己的开发经验和网上开源的代码,进一步的剖析原理,把分析过程一一展现给大家。

标题为啥是 续我未完的大学梦 呢?因为大学对这个界面“一见钟情”,相信这个也是大家所好奇的。为什么手机的颜色可以同步设备rbg灯的颜色,那本文主要讲怎么绘制这么一个界面,具体的同步颜色到设备的原理,我不一一分析了,当然了,会透漏一点点。



下面的是我练手项目一个工程的一个设备控制界面,到时候会开源出来滴:



二、绘图步骤:


绘图原理:



绘图步骤:



第一步:先画圆环和内部圆。


  • 具体的自定义画圆的步骤大家都熟悉。画笔、测量。

    • 画笔初始化不必多说,强调下渐变色环画笔的stytle属性;还有渐变色环通过SweepGradient类实现。

    Paint.Style.STROKE : 只绘制图形轮廓(描边), 通常的圆环设置这个属性
    Paint.Style.FILL : 只绘制图形内容 。
    Paint.Style.FILL_AND_STROKE : 既绘制轮廓也绘制内容。

        //circleX 渲染中心点x坐标,circleY渲染中心y点坐标;mCircleColors为渐变颜色内容Shader s = new SweepGradient(circleX, circleY, mCircleColors, null);paintCircleRing.setShader(s);
  • 测量:取整个父布局的view的宽和高,对比取最小一个,保证了半径可以被整个view包裹。

    //圆环的画笔private Paint paintCircleRing;//最里面的圆的画笔,默认是绿色private Paint paintInnerColor;//渐变色环参数:红、紫、蓝、绿、黄、橙、红private final int[] mCircleColors = new int[]{0xFFFF0000, 0xFFFF00FF,0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000};//初始化画笔,构造方法调用。private void init() {// 渐变色环参数paintCircleRing = new Paint(Paint.ANTI_ALIAS_FLAG);paintCircleRing.setAntiAlias(true);paintCircleRing.setStyle(Paint.Style.STROKE);paintCircleRing.setStrokeWidth(30);//内圆参数paintInnerColor = new Paint();paintInnerColor.setColor(Color.GREEN);paintInnerColor.setAntiAlias(true);paintInnerColor.setStrokeWidth(5);}

效果:



三、画圆形图片选择器。


  • 1、 已知圆环的半径outerRadius 和原点的坐标 (circleX , circleY) ,通过博文的第一个原理图可得选择器坐标:
         //选择器x坐标markPointX = (float) (circleX + outerRadius * Math.sin(angle * Math.PI / 180));//选择器y坐标markPointY = (float) (circleY - outerRadius  * Math.cos(angle * Math.PI / 180));

  • 2、 画圆点选择器(下图的左边):

  • frameRadius 半径就是外圆半径减去OC的长度除于2;

 canvas.drawCircle(markPointX, markPointY, frameRadius, paintSelecter);

四、颜色求角度。


  • 毋庸置疑,当先从颜色十六进制拿出R、G、B颜色和色环的颜色对比得到结论。

  private float fromColor2Degree(int color) {float degree = 0;int diff = 360 / (mCircleColors.length - 1);int r = Color.red(color);int g = Color.green(color);int b = Color.blue(color);int[] mColor = {b, g, r};// 把最大的,置0xFF,最小的,置0int min = findMin(b, g, r);int max = findMax(b, g, r);int temp = (0xff << (max * 8)) + (0xff << (8 * 3));if (max == min) {//证明RGB相等;return 90;// 九十度}int mid = 3 - max - min;int start = 0;int end = 0;for (int i = 0; i < mCircleColors.length - 2; i++) {if (mCircleColors[i] - temp == 0)start = i;if (mCircleColors[i] - temp == (0xff << (mid * 8)))end = i;}float percent = (float) mColor[mid] / (float) 0xff;int degreeDiff = (int) (percent * diff);if (start < end) {degree = start * diff;degree += degreeDiff;} else {degree = start * diff;degree -= degreeDiff;}degree += 90;if (degree > 360)degree -= 360;return degree;}

五、角度求颜色。


   //获取圆环上颜色private int interpCircleColor(int colors[], float degree) {degree -= 90;if (degree < 0)degree += 360;float p = degree * (colors.length - 1) / 360;int i = (int) p;p -= i;int c0 = colors[i];int c1 = colors[i + 1];int a = ave(Color.alpha(c0), Color.alpha(c1), p  );int r = ave(Color.red(c0), Color.red(c1), p);int g = ave(Color.green(c0), Color.green(c1), p);int b = ave(Color.blue(c0), Color.blue(c1), p);return Color.argb(a, r, g, b);}

六、点击事件。


  • 这部分不难理解,只要把触摸点的坐标和小圆点的坐标做对比处理,只要是在其周围60dp周围,就认为是触摸到了小圆点选择器。

 private boolean isMarkPointRange(float x, float y) {float range = dp2px(getContext(), 60);return x > (markPointX - range) && x < (markPointX + range) && y > (markPointY - range) && y < (markPointY + range);}

七、view的点击事件传递。


  • 当用户按下手指的位置在圆点周围时候就拦截,否则不拖动小圆点。
    -

    • getParent().requestDisallowInterceptTouchEvent(true);

@Overridepublic boolean onTouchEvent(MotionEvent event) {float markRange = dp2px(getContext(), 60);float x = event.getX();float y = event.getY();boolean up = false;switch (event.getAction()) {case MotionEvent.ACTION_DOWN://当用户按下手指的位置在圆点周围时候就拦截if (x < markPointX + markRange && x > markPointX - markRange&& y > markPointY - markRange && y < markPointY + markRange) {getParent().requestDisallowInterceptTouchEvent(true);}moved(x, y, up);break;case MotionEvent.ACTION_MOVE:moved(x, y, up);break;case MotionEvent.ACTION_UP:up = true;moved(x, y, up);break;//当用户取消的手势,就不滑动了case MotionEvent.ACTION_CANCEL:getParent().requestDisallowInterceptTouchEvent(false);up = true;moved(x, y, up);break;}return true;}

八、小圆点的拖动。


 private void moved(float x, float y, boolean up) {//判断触摸点是否在圆环内if (!isMarkPointRange(x, y)) {return;}float distance = (float) Math.sqrt(Math.pow((x - circleX), 2)+ Math.pow((y - circleY), 2));if (distance < outerRadius + 100 && distance > innerRadius - 100 && !up) {markPointX = (float) (circleX + outerRadius * Math.cos(Math.atan2(x - circleX, circleY - y) - (Math.PI / 2)));markPointY = (float) (circleY + outerRadius * Math.sin(Math.atan2(x - circleX, circleY - y) - (Math.PI / 2)));float degrees = (float) ((float) ((Math.toDegrees(Math.atan2(x - circleX, circleY - y)) + 360.0)) % 360.0);// 注意:为负数要加360°if (degrees < 0) {degrees += 2 * Math.PI;}//改变内部圆的颜色int CircleColor = interpCircleColor(mCircleColors, degrees);paintInnerColor.setColor(CircleColor);//角度四舍五入this.angle = Math.round(degrees);invalidate();} else {if (mSeekBarColorPickerChangeListener != null) {mSeekBarColorPickerChangeListener.onProgressChange(this, paintInnerColor.getColor());}invalidate();}}

详情请移步:http://www.demodashi.com/demo/11892.html


Android自定义View之七色环颜色采集器: 续我未完的大学梦 !相关推荐

  1. 基于Android的rgb七彩环颜色采集器

    代码地址如下: http://www.demodashi.com/demo/11892.html 一.前言. 在大学期间,看到这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色 ...

  2. android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)

    ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...

  3. 【微信小程序控制硬件 第14篇】分享一下我在微信公众号和小程序上实现的几个颜色采集器,轻松集成到您项目实现调光。

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  4. android 屏幕坐标色彩,Android自定义View实现颜色选取器

    Android 自定义View 颜色选取器,可以实现水平.竖直选择颜色类似 SeekBar 的方式通过滑动选择颜色. 效果图 xml 属性 1.indicatorColor 指示点颜色 2.indic ...

  5. Android 自定义View实现环形带刻度颜色渐变的进度条

    上次写了一篇Android 自定义View实现环形带刻度的进度条,这篇文章就简单了,只是在原来的基础上加一个颜色渐变. 按照惯例,我们先来看看效果图 一.概述 1.相比于上篇文章,这里我们的颜色渐变主 ...

  6. 精通Android自定义View(十九)自定义圆形炫彩加载转圈效果

    1 效果 2 源码 public class JiondongView extends View {private Paint mBackgroundPaint;private float mScal ...

  7. Android 自定义View

    [Android 自定义View] Android 自定义View 自定义View基础 自定义TextView 继承View重写onDraw方法 View的构造方法 自定义属性 创建attrsxml文 ...

  8. Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)

    Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图) 前言 自定义View的关键点 绘制多边形 结尾 前言 刚开始学习自定义view,简单完成了一个属性分布器,可以实现三条到八条 ...

  9. Android自定义View(七)_Canvas之图片文字

    在上一篇文章Canvas之画布操作中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容.如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经 ...

最新文章

  1. Myeclipse启动报错: Invalid 'log4jConfigLocation' parameter
  2. vivo解bl锁_黔隆科技刷机教程酷派B770S忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  3. cisco 2600的密码破解
  4. 虚拟内存越大越好吗_二次构造柱泵的功率越大越好吗—自然不是
  5. 201671010439-词频统计软件项目报告
  6. oracle杅擂踱阀葩,Oracle常用傻瓜问题1000问
  7. self = [super init]的解释
  8. ubuntu配置pip3以及scrapy
  9. Redis(1)——NoSQL数据库简介
  10. 邱锡鹏nndl学习记录
  11. 怎么制作真人qq秀_QQ 首款捏脸产品「卡噗」上线,这是微信也能玩的 3D 厘米秀...
  12. Struts框架实战精讲 struts1(5)- 动态ActionForm
  13. 张小龙的话与微信的玄机
  14. kappa一致性检验教程_一致性检验(kappa一致性分析)
  15. 阿里云、百度云、腾讯云、AWS、微软Azure、华为云、金山云等云服务商产品的差异是啥?
  16. 2022Android春招面试,实战分析
  17. 如何在计算机桌面上添加小工具,怎么在电脑的桌面小工具里添加便签
  18. BQ25798双电源输入4节电池升降压充电与最大功率跟踪于光伏板应用
  19. PS磨皮滤镜Portraiture2.3简体中文绿色版32b/64b
  20. 【算力网络】算力网络的发展趋势

热门文章

  1. linux 查看工程用什么工具,工程师工具包-Linux常用命令及常用操作-持续更新中...
  2. 破重▪领先——H3C 2013渠道峰会盛大开幕
  3. 小米染指平板电脑凶多吉少
  4. “小米平板2”浮出水面,高品质低价路线能否赢得市场
  5. 日落20181024001 - Unity组件应用之Animator
  6. amd锐龙笔记本cpu怎么样_不知不觉已经15款 AMD Ryzen锐龙笔记本处理器盘点
  7. 关于花呗的一点点想法
  8. 苹果怎么测是原装屏_一个iPhone X手机屏背后的原装和国产浅析
  9. 同源政策(same-origin policy)
  10. 妹子,你这是要风干它吗?