关于 android的 渲染器 Shader

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

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

自己写个class 继承 Vew

1.bitmap渲染器效果

关于 android的 渲染器 Shader

2.线性渲染器效果

关于 android的 渲染器 Shader

3.环形渲染器效果

关于 android的 渲染器 Shader关于 android的 渲染器 Shader

4.混合渲染器效果

关于 android的 渲染器 Shader

5.梯度渲染器效果

关于 android的 渲染器 Shader关于 android的 渲染器 Shader

好了,下来直接放代码吧。注释都很清晰的说, 想要调整各种效果自己调整 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的样式

 

关于 android的 渲染器 Shader


 

你可能感兴趣的:(android)