关于android的渲染器Shader

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

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

自己写个class 继承 Vew

1.bitmap渲染器效果

2.线性渲染器效果

3.环形渲染器效果

4.混合渲染器效果

5.梯度渲染器效果

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

 

[java][/java] view plaincopy

  1. public class MyShaderView  extends View {
  2. // Shader渲染器    下面的都继承于  Shader  供了Shader类专门用来渲染图像以及一些几何图形。
  3. BitmapShader    bitmapShader;    //bitmap渲染器
  4. ComposeShader   composeShader;   //混合渲染器
  5. LinearGradient  linearGradient;    //线性渲染
  6. RadialGradient  radialGradient;  //圆形那种环形渲染
  7. SweepGradient   sweepGradient;   //梯度渲染器
  8. int    width;
  9. int    height;
  10. public MyShaderView(Context context) {
  11.     super(context);
  12.    //用 bitmap先渲染1个图片吧= =
  13.    //先得到图片 drawable  –   bitmapDrawable
  14.     BitmapDrawable bitmap_deawable = (BitmapDrawable) getResources().getDrawable(R.drawable.yingkou);
  15.    //再得到 bitmap
  16.     Bitmap bitmap = bitmap_deawable.getBitmap();
  17.     width = bitmap.getWidth();
  18.     height = bitmap.getHeight();
  19.     //*******************************开始渲染bitmap图片
  20.     //  new BitmapShader(bitmap, tileX, tileY)
  21.     //  tileX     The tiling mode for x to draw the bitmap in.   在位图上X方向花砖模式
  22.     //   tileY     The tiling mode for y to draw the bitmap in.   在位图上Y方向花砖模式
  23.     //   CLAMP  :如果渲染器超出原始边界范围,会复制范围内边缘染色。
  24.     //   REPEAT :横向和纵向的重复渲染器图片,平铺。
  25.     //   MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
  26.         bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR);
  27.     //*******************************  LinearGradient 线性渲染
  28.     // LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode);
  29.     // X0:    渐变起初点坐标x位置
  30.     // y0:    渐变起初点坐标y位置
  31.     // x1:    渐变终点坐标x位置
  32.     // y1:    渐变终点坐标y位置
  33.     // colors:  渐变颜色数组
  34.     // positions:这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布
  35.     // tile:渲染模式(平铺方式)
  36.     linearGradient = new LinearGradient(50, 50,1000,1000, new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE},
  37.                                 null,Shader.TileMode.REPEAT);
  38.    //*******************************  radialGradient  环形渲染
  39.     //   x   y    半径         渐变颜色数组       position     平铺方式
  40.     //多色
  41.     radialGradient = new RadialGradient( 50,200,50,new int[]{Color.WHITE,Color.YELLOW,Color.GREEN,Color.RED,Color.BLUE,},
  42.                                  null,Shader.TileMode.REPEAT);
  43.     //单色 + 边框-    这个真心是应了 需求。。必须实心-为的是不露出后面的东西(paint本身画出来的设置空心会漏)
  44.     //radialGradient = new RadialGradient( 50,200, 50,  new int[]
  45.     //{Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,
  46.     //Color.WHITE,Color.RED},
  47.     //null,Shader.TileMode.REPEAT);
  48.         //*******************************  composeShader  混合渲染
  49.     composeShader = new ComposeShader(bitmapShader,linearGradient,PorterDuff.Mode.DARKEN);
  50.     //最后的 混合渲染模式有   PorterDuff.Mode有16种参数可供选择,下面有效果图
  51.     //分别为:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、
  52.     // SRC_ATOP、DST_ATOP、    XOR、DARKEN、LIGHTEN、MULTIPLY、SCREEN。
  53.     //*******************************  sweepGradient 梯度渲染器
  54.     sweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
  55. }
  56.     @Override
  57.     protected void onDraw(Canvas canvas) {
  58.         super.onDraw(canvas);
  59.       //构建ShapeDrawable对象并定义形状为椭圆
  60.       // RectShape
  61.       // ArcShape
  62.       // RectShape
  63.       //1.可以这样写
  64.       //ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
  65.       //得到画笔并设置渲染器
  66.       // shapeDrawable.getPaint().setShader(bitmapShader);
  67.       //设置显示区域
  68.       // shapeDrawable.setBounds(20, 20, width-10, height-10);
  69.       //绘制shapeDrawable
  70.       // shapeDrawable.draw(canvas);
  71.      // 2.也可以这样写
  72.        Paint paint = new Paint();
  73.        canvas.drawColor(Color.WHITE);      //背景置为灰色
  74.      //绘制Bitmap渲染的椭圆
  75.        paint.setShader(bitmapShader);
  76.        canvas.drawOval(new RectF(90, 20, 90+ width,  20+ height), paint);
  77.        //绘制线性渐变的矩形
  78.        paint.setShader(linearGradient);
  79.        canvas.drawRect(10, 200, 200, 400, paint);
  80.      //绘制环形渐变的圆
  81.        paint.setShader(radialGradient);
  82.        canvas.drawCircle(50,200,50, paint);
  83.      //绘制混合渐变(线性与环形混合)的矩形
  84.        paint.setShader(composeShader);
  85.        canvas.drawRect(0, 0, 1000, 1000, paint);
  86.       //绘制梯形渐变的矩形
  87.        paint.setShader(sweepGradient);
  88.        canvas.drawRect(50, 50, 300, 300, paint);
  89.     }
  90. }

 

 

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

 

标签