zoukankan      html  css  js  c++  java
  • 关于 android的 渲染器 Shader

    因为公司在 自定义的画图上面比较苛刻(各种要求= =),最后又是改来改去的。反正是 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的样式



  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/riskyer/p/3364641.html
Copyright © 2011-2022 走看看