zoukankan      html  css  js  c++  java
  • Android获得线性渐变某点的颜色

    安卓官方确实提供了好多非常强大的工具给我们了,例如我们最近经常在shape中加入gradient(渐变),像我的项目中用的是线性渐变,

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
    3.     <corners android:radius="5dip" />  
    4.     <gradient android:startColor="#262626" android:endColor="#ffbc1c" android:angle="0" />  
    5. </shape>  

    并且这个图片作为SeekBar的背景,用来选择颜色,滑到哪就选择哪里的颜色,如图所示:

    为此我想到了两种可能的实现方法:
    1、获取SeekBar的背景的图片的bitmap,获取对应点来获得颜色
    2、直接通过线性渐变的算法获得某个位置上的颜色
    方法1 简单方便,对于其他的控件也可以使用,但是消耗的内存比较大
    方法2 内存消耗非常少,但是需要了解线性渐变的算法,并且只能对线性渐变的图片有效,其他渐变方式都需要重新写,但是线性渐变往往用得比较多,所以打算使用第二个方法。

    线性渐变是最简单的渐变,思想就是对应颜色A的R G B不断的往颜色B的R G B靠近,并且认识到的是:在java中,(很多其他语言也是)用一个int来存放颜色的RGB值,但是这个只是存储方式而已,实际上每个RGB是互不相关的,渐变时需要分别取出,分别变化。写了一个简易的两个颜色渐变的颜色选择器,代码如下:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * Created by chenxiaoxuan1 on 16/3/25. 
    3.  */  
    4. public class LinearGradientUtil {  
    5.     private int mStartColor;  
    6.     private int mEndColor;  
    7.   
    8.     public LinearGradientUtil(int startColor, int endColor) {  
    9.         this.mStartColor = startColor;  
    10.         this.mEndColor = endColor;  
    11.     }  
    12.   
    13.     public void setStartColor(int startColor) {  
    14.         this.mStartColor = startColor;  
    15.     }  
    16.   
    17.     public void setEndColor(int endColor) {  
    18.         this.mEndColor = endColor;  
    19.     }  
    20.   
    21.     public int getColor(float radio) {  
    22.         int redStart = Color.red(mStartColor);  
    23.         int blueStart = Color.blue(mStartColor);  
    24.         int greenStart = Color.green(mStartColor);  
    25.         int redEnd = Color.red(mEndColor);  
    26.         int blueEnd = Color.blue(mEndColor);  
    27.         int greenEnd = Color.green(mEndColor);  
    28.   
    29.         int red = (int) (redStart + ((redEnd - redStart) * radio + 0.5));  
    30.         int greed = (int) (greenStart + ((greenEnd - greenStart) * radio + 0.5));  
    31.         int blue = (int) (blueStart + ((blueEnd - blueStart) * radio + 0.5));  
    32.         return Color.argb(255,red, greed, blue);  
    33.     }  
    34. }  

    实现后并且用单元测试测试过,然后就正式的使用了,使用结果还是很满意的~

    后来,有一个需求是做一个简单的条形颜色选择器,也是用SeekBar实现的,也是线性渐变,只是颜色多了一些而已。如图:

    原理是一样的,晚点有空再补代码。

  • 相关阅读:
    PTA 乙级 1032 挖掘机技术哪家强 (20分) C++
    Jmeter接口测试之MD5函数使用
    charles基础理论一
    Jmeter接口测试之函数和cookies
    appium+robotframework之权限设置
    appium+robotframework之context问题解决
    jmeter接口测试之断言持续时间
    Appium+robotframework 自动化之软键盘的调起(文本框无法输入值)
    Jmeter接口测试之测试计划和线程组的关系
    Jmeter接口测试之用户定义变量
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5569971.html
Copyright © 2011-2022 走看看