android 字体颜色 渐变色,Android渐变色处理

Android渐变色处理

大纲

1.xml 实现背景渐变 和 边框渐变

2.Drawable 实现背景渐变 和 边框渐变

3.自定义View实现渐变处理

xml实现渐变

背景渐变

使用shape 在xml布局中定义

android:shape="rectangle">

android:height="100dp"

/>

android:startColor="@android:color/holo_blue_light"

android:endColor="@android:color/holo_red_light"

/>

gradient标签下可以添加一些渐变控制,包含的属性如下表:

属性

描述

取值

type

类型

linear(默认值, 线性渐变) radial(辐射渐变,圆形) sweep(放射型)

startColor

开始颜色

endColor

结束颜色

centerColor

渐变中心区域的颜色

centerX, centerY

指定渐变中心

0 - 1 默认都是0.5表示区域的中心位置

angle

渐变角度,在type为linear时生效

45的倍数

gradientRadius

渐变半径,在type为radial生效,控制圆形渐变区域半径

useLevel

是否启用level, 启用后渐变区域将和设置的level相关,关于此字段我们稍后详解

类型

linear:

917b8561cfc6798cedc396efc75fdbb0.png

radial:

9f4753acaafb2ff3c3ae2ad121229b1e.png

sweep:

4ddb710933bc8c812d8f7302056318ea.png

useLevel

直译过来 level可以翻译成水平,抹平之类的,很难理解什么意思,我们直接看GradientDrawable的源码对useLevel字段的使用,我们以type 为linear为例:

private boolean ensureValidRect() {

...

if (gradientColors != null) {

final RectF r = mRect;

final float x0, x1, y0, y1;

if (st.mGradient == LINEAR_GRADIENT) {

final float level = st.mUseLevel ? getLevel() / 10000.0f : 1.0f;

switch (st.mOrientation) {

case TOP_BOTTOM:

x0 = r.left; y0 = r.top;

x1 = x0; y1 = level * r.bottom;

break;

case TR_BL:

x0 = r.right; y0 = r.top;

x1 = level * r.left; y1 = level * r.bottom;

break;

case RIGHT_LEFT:

x0 = r.right; y0 = r.top;

x1 = level * r.left; y1 = y0;

break;

case BR_TL:

x0 = r.right; y0 = r.bottom;

x1 = level * r.left; y1 = level * r.top;

break;

case BOTTOM_TOP:

x0 = r.left; y0 = r.bottom;

x1 = x0; y1 = level * r.top;

break;

case BL_TR:

x0 = r.left; y0 = r.bottom;

x1 = level * r.right; y1 = level * r.top;

break;

case LEFT_RIGHT:

x0 = r.left; y0 = r.top;

x1 = level * r.right; y1 = y0;

break;

default:/* TL_BR */

x0 = r.left; y0 = r.top;

x1 = level * r.right; y1 = level * r.bottom;

break;

}

mFillPaint.setShader(new LinearGradient(x0, y0, x1, y1,

gradientColors, st.mPositions, Shader.TileMode.CLAMP));

}

}

可以发现当用户设置useLevel 为true的时候(默认false), 渐变矩形的区域将缩小到getLevel() / 10000算出来的比例,而默认level为0,即如果单独只设置useLevel为true将看不到渐变效果,需要配合setLevel来决定渐变区域。我们来分别看下设置useLevel为true后,level 为 5000 和 8000的时候的样式:

useLevel 为 false:

5e0654a8e12c2f29c4a9cb573895f97f.png

level为5000 && useLevel为true:

30b58079273876005cfc4653c376d896.png

level为8000 && useLevel为true:

e9353a8579c030d226ad9ca104254d59.png

边框渐变

直接使用shape并不能实现边框的渐变,我们可以使用折中方案,将2个图层合成一个图,然后两个图之间的空隙可以当做渐变边框。这种方案有个弊端,即背景区域是不透明的纯色、我们可以在xml中使用layer-list标签来做出效果。注意一下应该是系统版本低版本上的图层size并不能生效,我们这里使用top bottom left right 来留出边框的位置。

>

android:height="100dp"

/>

android:startColor="@android:color/holo_blue_light"

android:endColor="@android:color/holo_red_light"

/>

实际效果:

6c06f0751f9e2364efe05800481ef220.png

此方法有一个问题就是并不能支持中间区域带透明度的问题,如果需要这个效果我们可以通过自定义Drawable 或者自定义View来实现。

使用Drawable实现渐变

API 16以及16以上系统提供了GradientDrawable来实现渐变和边框的Drawable,

参数定义同xml中的参数命名,需要特别指出的是对于angle的控制,GradientDrawable使用setOrientation来控制, 我们来看下系统angle转换成Orientation的源码:

int angle = (int) a.getFloat(R.styleable.GradientDrawableGradient_angle, st.mAngle);

angle %= 360;

if (angle % 45 != 0) {

throw new XmlPullParserException(a.getPositionDescription()

+ " tag requires 'angle' attribute to "

+ "be a multiple of 45");

}

st.mAngle = angle;

switch (angle) {

case 0:

st.mOrientation = Orientation.LEFT_RIGHT;

break;

case 45:

st.mOrientation = Orientation.BL_TR;

break;

case 90:

st.mOrientation = Orientation.BOTTOM_TOP;

break;

case 135:

st.mOrientation = Orientation.BR_TL;

break;

case 180:

st.mOrientation = Orientation.RIGHT_LEFT;

break;

case 225:

st.mOrientation = Orientation.TR_BL;

break;

case 270:

st.mOrientation = Orientation.TOP_BOTTOM;

break;

case 315:

st.mOrientation = Orientation.TL_BR;

break;

}

很清楚的能看到我们为什么说只支持是45的倍数。

GradientDrawable并不支持边框渐变, 我们依然可以使用2个图层的思路来解决边框渐变的控制,LayerDrawable 2个图层实现边框渐变 。

LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{bgDrawable, drawable});

layerDrawable.setLayerInset(1, borderWidth, borderWidth, borderWidth, borderWidth);

我们需要通过setLayerInset方法来控制图层图层直接的偏移来留出边框的位置。

自定义View实现渐变

配置画笔渐变,这里我们说Linear类型的渐变

private void updateGradientPaint(Paint paint, RectF r, GradientStat stat) {

float x0, x1, y0, y1;

int angle = stat.angle % 360;

if (angle % 45 != 0) {

throw new RuntimeException("");

}

if (angle == 0) {

x0 = r.left;

y0 = r.top;

x1 = r.right;

y1 = y0;

} else if (angle == 45) {

x0 = r.left;

y0 = r.bottom;

x1 = r.right;

y1 = r.top;

} else if (angle == 90) {

x0 = r.left;

y0 = r.bottom;

x1 = x0;

y1 = r.top;

} else if (angle == 135) {

x0 = r.right;

y0 = r.bottom;

x1 = r.left;

y1 = r.top;

} else if (angle == 180) {

x0 = r.right;

y0 = r.top;

x1 = r.left;

y1 = y0;

} else if (angle == 225) {

x0 = r.right;

y0 = r.top;

x1 = r.left;

y1 = r.bottom;

} else if (angle == 270) {

x0 = r.left;

y0 = r.top;

x1 = x0;

y1 = r.bottom;

} else {

x0 = r.left;

y0 = r.top;

x1 = r.right;

y1 = r.bottom;

}

paint.setShader(new LinearGradient(x0, y0, x1, y1,

stat.colors, null, Shader.TileMode.CLAMP));

}

渐变边框,边框矩形区域要取边框间距的中间位置来绘制, 例如:

// width 表示表框宽度

float offset = width / 2f;

RectF bolderRect = new RectF();

bolderRect.set(offset, offset, getMeasuredWidth() - offset,

getMeasuredHeight() - offset);

欢迎关注我的微信公众号

璐豪笔记

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值