bitmapshader如何利用Shader实现钻石渲染效果

频道:银行理财 日期: 浏览:0

老铁们,大家好,相信还有很多朋友对于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的内容到此结束,希望对大家有所帮助。

山艺复试名单2021

民事诉讼253条司法解释

nvidia开发人工智能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。