Go go go....看下官方文档先https://developer.android.google.cn/reference/android/graphics/drawable/GradientDrawable?hl=zh-cn
A Drawable with a color gradient for buttons, backgrounds, etc.
It can be defined in an XML file with the <shape>
element. For more information, see the guide to Drawable Resources.
胡乱拨弄一下: 这是一个给按钮,背景等使用的带颜色渐变的一个Drawable.它可以在xml以shape方式定义。想要看更多信息,看Drawable Resources指导教程。
我的理解就是说这个其实是一个资源对象,你可以去动态创建和使用这个资源对象。当然也可以在布局文件里面以shape的方式去定义它。当然你xml定义了,会去创建 <u style="text-decoration: none; border-bottom: 1px dashed grey;">ShapeDrawable 这种对象来渲染你设置的效果。(暂时就是这么理解哈,,错了再悔过....)</u>
Now,我们到可绘制对象资源 | Android Developers 去看下相关介绍吧。大体看下。。。开始有段介绍,如下:
可绘制对象资源
可绘制对象资源是一般概念,是指可在屏幕上绘制的图形,以及可以使用 getDrawable(int) 等 API 检索或者应用到具有 android:drawable 和 android:icon 等属性的其他 XML 资源的图形。共有多种不同类型的可绘制对象:
位图文件
位图图形文件(.png、.jpg 或 .gif)。创建 BitmapDrawable。
九宫格文件
具有可拉伸区域的 PNG 文件,允许根据内容调整图像大小 (.9.png)。创建 NinePatchDrawable。
图层列表
管理其他可绘制对象阵列的可绘制对象。它们按阵列顺序绘制,因此索引最大的元素绘制在顶部。创建 LayerDrawable。
状态列表
此 XML 文件为不同状态引用不同位图图形(例如,按下按钮时使用不同的图像)。创建 StateListDrawable。
级别列表
此 XML 文件用于定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。创建 LevelListDrawable。
转换可绘制对象
此 XML 文件用于定义可在两种可绘制对象资源之间交错淡出的可绘制对象。创建 TransitionDrawable。
插入可绘制对象
此 XML 文件用于定义以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景可绘制对象时,此类可绘制对象很有用。
裁剪可绘制对象
此 XML 文件用于定义对其他可绘制对象进行裁剪(根据其当前级别值)的可绘制对象。创建 ClipDrawable。
缩放可绘制对象
此 XML 文件用于定义更改其他可绘制对象大小(根据其当前级别值)的可绘制对象。创建 ScaleDrawable
形状可绘制对象
此 XML 文件用于定义几何形状(包括颜色和渐变)。创建 ShapeDrawable。
另请参阅动画资源文档,了解如何创建 AnimationDrawable。
注:颜色资源也可用作 XML 中的可绘制对象。例如,在创建状态列表可绘制对象时,可以引用 android:drawable 属性的颜色资源 (android:drawable="@color/green")。
以前我们经常用xml,drawable, mipmap等,很少去说关注这个东西最后怎么去渲染的妮? 看上面介绍,应该有了大体的了解....就像Java万物皆为Object一样.....
当然具体的我们可以利用AS简单跟踪下流程:





最后会返回一个Drawable对象处理....当然具体的很多东西目前还不懂。后面空了就稍微仔细分析下渲染流程....所以,现在我们知道xml布局什么的被android解析后做渲染,分别内部做了很多事情就可以了。。
回过头来我们再看下ShapeDrawable,为什么突然想到要看这个。 因为Shape稍微做了总结后突然想到之前修改过一个第三方库的源码(为了实现一个原本的库没有的渐变效果),而它内部绘制用的就是ShapeDrawable来绘制的这种圆角控件....所以就想顺便记录一下。
这个库我们要宣传一下就是FlycoTabLayout_Lib,Flyco大神的...哇咔咔。我还提交了我修改的issue希望可以扩展该效果。
What功能?

本来的效果不带渐变

我就去下载源码导入模块来使用了。改了下源码,增加了点渐变效果(其实并没有什么的,只是我觉得如增加这样的配置会更方便使用)

//mIndicatorDrawable.setColor(mIndicatorColor);
///< @hl 自定义渐变
if (null == mIndicatorDrawable){
int colors[] = { Color.parseColor("#28b3ff"), Color.parseColor("#3a91fd")}; ///< @hl 分别为开始颜色,中间夜色,结束颜色
mIndicatorDrawable = new GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, colors);
mIndicatorDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mIndicatorDrawable.setGradientCenter(0.02f, 1.0f);
mIndicatorDrawable.setGradientRadius(180);
}
So,基本上就是创建GradientDrawable,然后通过相关方法动态设置渐变类型,渐变起点终点,渐变半径,渐变颜色啥的。和xml配置无太大差别。。。
看官方也是提供了很多xml参考属性和相关的方法

感觉是不是还可以。又多了解了一些或许自己并不了解的东西.....学习总是需要积累的,不对“积累总是需要不断学习的”.... 有深入的再继续...
网友评论