老铁们,大家好,相信还有很多朋友对于bitmapshader和如何利用Shader实现钻石渲染效果的相关问题不太懂,没关系,今天就由我来为大家分享分享bitmapshader以及如何利用Shader实现钻石渲染效果的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
本文目录
android setshader怎样清除掉Android如何用图片来填充Path封闭路径Android 控件 RoundedBitmapDrawable如何利用Shader实现钻石渲染效果android setshader怎样清除掉setShader(Shadershader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类。Shader在三维软件中我们称之为着色器,其作用是来给图像着色。它有五个子类,像PathEffect一样,它的每个子类都实现了一种Shader。下面来看看文档中的解释:
子类:BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient
二、BitmapShader
2.1构造方法
只有有一个含参的构造方法:
BitmapShader(Bitmapbitmap,Shader.TileModetileX,Shader.TileModetileY)
顾名思义,它是给bitmap做处理的类,传入的参数也有bitmap对象。从字面理解,传入的第一个参数是bitmap对象,应该会对bitmap做一定的处理,后面两个常量都是mode(模式),应该是设定处理效果的。理解了这个,我们就可以正式介绍下传入的三个参数了。
第一个参数:要处理的bitmap对象
第二个参数:在X轴处理的效果,Shader.TileMode里有三种模式:CLAMP、MIRROR和REPETA
第三个参数:在Y轴处理的效果,Shader.TileMode里有三种模式:CLAMP、MIRROR和REPETA
下面我们就来用代码进行各种模式的演示,演示之前自然要准备一个演示图片了:
说明:为了讲解需要,我给这个图片边界PS了几个像素的红色。
2.2Shader.TileMode.CLAMP
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
Bitmapbitmap=BitmapFactory.decodeResource(mContext.getResources(),R.drawable.kale);
//设置shader
mPaint.setShader(newBitmapShader(bitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP));
//用设置好的画笔绘制一个矩形
canvas.drawRect(180,200,600,600,mPaint);
}
效果:
从效果看,我们看不明白这是什么东西,只看到了大片的红色区域,左上角漏出了一个原图的小脚。我们索性把绘制区域放大,看看效果会有什么变化。
canvas.drawRect(0,0,800,800,mPaint);
效果:
这下我们的图片终于完全显示了出来,仔细分析发现图片边界的红边是在的,但是为啥右边、下边都没有呢?因为我们设定的Shader.TileMode.CLAMP会将边缘的一个像素进行拉伸、扩展。所以整个的红色区域其实就是红色边框扩展后的结果。
2.3Shader.TileMode.MIRROR
上面的例子我们知道CLAMP模式会拉伸边缘的一个像素来填充,可以说是边缘拉伸模式,那么这个MIRROR模式会有什么作用呢?顾名思义是镜像,那么就来测试一下。测试的代码就是从上面的改动的,仅仅把X轴的模式换成了MIRROR而已。
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
Bitmapbitmap=BitmapFactory.decodeResource(mContext.getResources(),R.drawable.kale);
//设置shader
mPaint.setShader(newBitmapShader(bitmap,Shader.TileMode.MIRROR,Shader.TileMode.CLAMP));
//用设置好的画笔绘制一个矩形
canvas.drawRect(0,0,800,800,mPaint);
}
结果:
可见,在绘制的矩形区域内,X轴方向上出现了镜面翻转,就像翻牌子一样一个个翻开,和复印一样。而Y轴我们还是用的CLAMP,继续是拉伸边缘的红色像素,直到布满画布。
Android如何用图片来填充Path封闭路径你好,PaintmField=newPaint();
mField.setAntiAlias(true);
PathmFieldPath=newPath();
mFieldPath.moveTo(X1,Y1);
mFieldPath.lineTo(X2,Y2);
mFieldPath.lineTo(X3,Y3);
mFieldPath.lineTo(X4,Y4);
mFieldPath.close();
mField.setARGB(200,255,215,0);//设置封闭路径的填充色为金
canvas.drawPath(mFieldPath,mField);
这样绘制出来的图形为一个金矩形,不够美观,因此想到使用图片来填充
直接加上如下代码:
ShadermShader=newBitmapShader(fieldBitmap,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
mField.setShader(mShader);
其中,filedBitmap为指定的图片,可以通过mFieldBitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.feild);方式获得
Android 控件 RoundedBitmapDrawableRoundedBitmapDrawable是supportV4下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用。
点击此处可以看到官方的介绍。
setCircular(booleancircular):把图片的形状设为圆形;
setCornerRadius(floatcornerRadius):设置图片的圆角半径。
这里贴一下源码,更能清晰的知道它的实现:
至于具体的实现,阅读源码发现官方使用了BitmapShader来实现的圆角。
效果
首先来看下原图和处理后效果,以及做一些扩展,如添加一个边框
通过RoundedBitmapDrawableFactory传递要转换bitmap我就可以很简单的生成一个如下图的圆角图片
可以看到我们仅仅只是改了一个属性就实现了如下图正圆形的转换,但你可能已经发现图像有一些变形,因为内部在接收到circular==true后先是对图像进行了转换为正方形的操作,这个操作是一个伸缩放操作,而不是裁剪,所以图像发生了变形,所以在使用setCircular时最好能保证你的原图时一个正方形的,如果不是的话,下面我们也会给出相应解决方案
我们自己进行对bitmap的裁剪来转换成正方形,就解决了上面提到的拉伸问题,再绘制边框就实现了一个如下带边框的正圆形图片
RoundedBitmapDrawable也可以直接设置转换过程的
这些操作,来更好的工作
到这个里我们就可以把项目中的圆角图片的控件更换一下,平时记得多留意一下系统提供的一些API,可能会帮我们节省不少时间。
引用:
★★★Android一些容易被忽略的类-RoundedBitmapDrawable
★★Android必知必会-使用supportV4的RoundedBitmapDrawable实现圆角
如何利用Shader实现钻石渲染效果publicclassShaderextendsObject该类作为基类主要是返回绘制时颜色的横向跨度。其子类可以作用与Piant。通过piant.setShader(Shadershader);来实现一些渲染效果。之作用与图形不作用与bitmap。构造方法为默认的构造方法。枚举:emunShader.TileMode
定义了平铺的3种模式:staticfinalShader.TileModeCLAMP:边缘拉伸.
staticfinalShader.TileModeMIRROR:在水平方向和垂直方向交替景象,两个相邻图像间没有缝隙.
StaticfinalShader.TillModeREPETA:在水平方向和垂直方向重复摆放,两个相邻图像间有缝隙缝隙.方法:
booleangetLoaclMatrix(MatrixlocalM);如果shader有一个非本地的矩阵将返回true.
localM:如果不为null将被设置为shader的本地矩阵.
2.voidsetLocalMatrix(MatrixlocalM);
设置shader的本地矩阵,如果localM为空将重置shader的本地矩阵。
Shader的直接子类:
BitmapShader:位图图像渲染
LinearGradient:线性渲染
RadialGradient:环形渲染
SweepGradient:扫描渐变渲染/梯度渲染
ComposeShader:组合渲染,可以和其他几个子类组合起来使用
是不是很像Animation及其子类的关系(AlphaAnimation,RotateAnimation,ScaleAnimation,TranslateAnimation,AnimationSet)
既有具体的渲染效果,也有渲染效果的组合
下面说下Shader的使用步骤:
构建Shader对象
2.通过Paint的setShader方法设置渲染对象
3.设置渲染对象
4.绘制时使用这个Paint对象
关于bitmapshader的内容到此结束,希望对大家有所帮助。