热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于android的渲染器Shader

因为公司在自定义的画图上面比较苛刻(各种要求),最后又是改来改去的。反正是Shader起到很大作用,特此记录一下下、在achartengine的基础上没有能满足他们andro

因为公司在 自定义的画图上面比较苛刻(各种要求= =),最后又是改来改去的。反正是 Shader起到很大作用,特此记录一下下、在achartengine的基础上没有能满足他们= =

androd 提供了Shader类专门用来渲染图像以及一些几何图形。

自己写个class 继承 Vew

1.bitmap渲染器效果


2.线性渲染器效果


3.环形渲染器效果


4.混合渲染器效果


5.梯度渲染器效果


好了,下来直接放代码吧。注释都很清晰的说, 想要调整各种效果自己调整 X,Y 和type就好

public class MyShaderView  extends View {

// Shader渲染器 下面的都继承于 Shader 供了Shader类专门用来渲染图像以及一些几何图形。

BitmapShader bitmapShader; //bitmap渲染器
ComposeShader composeShader; //混合渲染器

LinearGradient linearGradient; //线性渲染
RadialGradient radialGradient; //圆形那种环形渲染
SweepGradient sweepGradient; //梯度渲染器
int width;
int height;

public MyShaderView(Context context) {
super(context);

//用 bitmap先渲染1个图片吧= =
//先得到图片 drawable - bitmapDrawable
BitmapDrawable bitmap_deawable = (BitmapDrawable) getResources().getDrawable(R.drawable.yingkou);
//再得到 bitmap
Bitmap bitmap = bitmap_deawable.getBitmap();
width = bitmap.getWidth();
height = bitmap.getHeight();
//*******************************开始渲染bitmap图片
// new BitmapShader(bitmap, tileX, tileY)
// tileX The tiling mode for x to draw the bitmap in. 在位图上X方向花砖模式
// tileY The tiling mode for y to draw the bitmap in. 在位图上Y方向花砖模式
// CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。
// REPEAT :横向和纵向的重复渲染器图片,平铺。
// MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR);


//******************************* LinearGradient 线性渲染
// LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode);
// X0: 渐变起初点坐标x位置
// y0: 渐变起初点坐标y位置
// x1: 渐变终点坐标x位置
// y1: 渐变终点坐标y位置
// colors: 渐变颜色数组
// positions:这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布
// tile:渲染模式(平铺方式)
linearGradient = new LinearGradient(50, 50,1000,1000, new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE},
null,Shader.TileMode.REPEAT);


//******************************* radialGradient 环形渲染
// x y 半径 渐变颜色数组 position 平铺方式
//多色
radialGradient = new RadialGradient( 50,200,50,new int[]{Color.WHITE,Color.YELLOW,Color.GREEN,Color.RED,Color.BLUE,},
null,Shader.TileMode.REPEAT);
//单色 + 边框- 这个真心是应了 需求。。必须实心-为的是不露出后面的东西(paint本身画出来的设置空心会漏)
//radialGradient = new RadialGradient( 50,200, 50, new int[]
//{Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,
//Color.WHITE,Color.RED},
//null,Shader.TileMode.REPEAT);


//******************************* composeShader 混合渲染
composeShader = new ComposeShader(bitmapShader,linearGradient,PorterDuff.Mode.DARKEN);
//最后的 混合渲染模式有  PorterDuff.Mode有16种参数可供选择,下面有效果图
//分别为:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、
// SRC_ATOP、DST_ATOP、 XOR、DARKEN、LIGHTEN、MULTIPLY、SCREEN。


//******************************* sweepGradient 梯度渲染器
sweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

//构建ShapeDrawable对象并定义形状为椭圆
// RectShape
// ArcShape
// RectShape
//1.可以这样写
//ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//得到画笔并设置渲染器
// shapeDrawable.getPaint().setShader(bitmapShader);
//设置显示区域
// shapeDrawable.setBounds(20, 20, width-10, height-10);
//绘制shapeDrawable
// shapeDrawable.draw(canvas);

// 2.也可以这样写
Paint paint = new Paint();
canvas.drawColor(Color.WHITE); //背景置为灰色

//绘制Bitmap渲染的椭圆
paint.setShader(bitmapShader);
canvas.drawOval(new RectF(90, 20, 90+ width, 20+ height), paint);

//绘制线性渐变的矩形
paint.setShader(linearGradient);
canvas.drawRect(10, 200, 200, 400, paint);

//绘制环形渐变的圆
paint.setShader(radialGradient);
canvas.drawCircle(50,200,50, paint);

//绘制混合渐变(线性与环形混合)的矩形
paint.setShader(composeShader);
canvas.drawRect(0, 0, 1000, 1000, paint);

//绘制梯形渐变的矩形
paint.setShader(sweepGradient);
canvas.drawRect(50, 50, 300, 300, paint);

}
}

下面这张图是上面提到的混合 渲染器,16个每种type的样式




推荐阅读
author-avatar
清皮皮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有