Android 图片渲染之Shader渲染器

来源:互联网 发布:4心淘宝账号多少钱一个 编辑:程序博客网 时间:2024/04/30 13:52

Shader有几个直接子类:


BitmapShader    : 主要用来渲染图像

LinearGradient  : 用来进行线性渲染

RadialGradient  : 用来进行环形渲染

SweepGradient   : 扫描渐变---围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。

ComposeShader   : 组合渲染,可以和其他几个子类组合起来使用。


本文参考:http://blog.csdn.net/ldj299/article/details/6166071

 

1、 BitmapShader

渲染器着色一个位图作为一个纹理。位图可以重复或设置模式。

public   BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)

调用这个方法来产生一个画有一个位图的渲染器(Shader)。

bitmap   在渲染器内使用的位图

tileX      The tiling mode for x to draw the bitmap in.   在位图上X方向花砖模式

tileY     The tiling mode for y to draw the bitmap in.    在位图上Y方向花砖模式

 

TileMode:(一共有三种)

CLAMP  :如果渲染器超出原始边界范围,会复制范围内边缘染色。

REPEAT :横向和纵向的重复渲染器图片,平铺。

MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT重复方式不一样,他是以镜像方式平铺。



2 、LinearGradient 

 

 

[java] view plaincopy
  1. public        LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)  

 

 X0:   渐变起初点坐标x位置

y0:    渐变起初点坐标y位置

x1:    渐变终点坐标x位置

y1:    渐变终点坐标y位置

colors:  渐变颜色数组

positions:这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布

tile:平铺方式

 

[java] view plaincopy
  1. public    LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)  

 

X0:       渐变起初点坐标x位置

y0:        渐变起初点坐标y位置

x1:        渐变终点坐标x位置

y1:        渐变终点坐标y位置

color0:  渐变开始颜色

color1:  渐变结束颜色

tile:    平铺方式

 

LinearGradient是线性渐变,用法如下:


Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变,代码如下:

Paint p=new Paint();
LinearGradient lg=new LinearGradien(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); 

Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变,代码如下:

p.setShader(lg);
canvas.drawCicle(0,0,200,p); //参数3为画圆的半径,类型为float型。


先看效果图:

     代码如下:

[java] view plaincopy
  1. package com.ldj.helloshader;  
  2. import android.content.Context;  
  3. import android.graphics.*;  
  4. import android.graphics.Shader.TileMode;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.graphics.drawable.ShapeDrawable;  
  7. import android.graphics.drawable.shapes.OvalShape;  
  8. import android.view.*;  
  9. public class ShaderView extends SurfaceView implements SurfaceHolder.Callback,Runnable{  
  10.     //声明渐变的颜色数组  
  11.     private int[] color =   
  12.         new int[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};  
  13.     private boolean loop = false;  
  14.     private SurfaceHolder surfaceHolder;  
  15.       
  16.     private Bitmap bitPic = null;  
  17.       
  18.     int bitPicWidth = 0;  
  19.     int bitPicHeight = 0;  
  20.       
  21.     //声明一个图片渲染  
  22.     BitmapShader bitmapShader = null;  
  23.     //声明一个线性渐变  
  24.     LinearGradient linearGradient = null;  
  25.     //声明一个环形渐变  
  26.     RadialGradient radialGradient = null;  
  27.     //声明一个扫描渐变  
  28.     //-围绕一个中心点扫描渐变就像电影里那种雷达扫描  
  29.     SweepGradient sweepGradient = null;  
  30.     //声明一个组合渲染  
  31.     ComposeShader composeShader = null;  
  32.     //定义画笔  
  33.     Paint paint = null;  
  34.     //利用这个类也可以实现绘制图像的功能  
  35.     ShapeDrawable shapeDrawable = null;  
  36.       
  37.     public ShaderView(Context context) {  
  38.         super(context);  
  39.         surfaceHolder = this.getHolder();  
  40.         //增加回调  
  41.         surfaceHolder.addCallback(this);  
  42.         loop = true;  
  43.         paint = new Paint();  
  44.         //获取图像资源  
  45.         bitPic =   
  46.             ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))  
  47.             .getBitmap();  
  48.         //将图片的长和高的值赋给变量  
  49.         bitPicWidth = bitPic.getWidth();  
  50.         bitPicHeight = bitPic.getHeight();  
  51.         /* 
  52.          * ~~~BitmapShader(Bitmap,TileMode,TileMode)~~~ 
  53.          */  
  54.         bitmapShader = new BitmapShader(bitPic, TileMode.REPEAT, TileMode.MIRROR);  
  55.         /* 
  56.          * ~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~ 
  57.          */  
  58.         linearGradient = new LinearGradient(0,0,100,100,color,null,TileMode.REPEAT);  
  59.         /* 
  60.          * ~~~RadialGradient~~~ 
  61.          */  
  62.         radialGradient = new RadialGradient(160,240,66,color,null,TileMode.MIRROR);  
  63.         /* 
  64.          * ~~~SweepGradient~~~ 
  65.          */  
  66.         sweepGradient = new SweepGradient(100,350,color,null);  
  67.         //~~~ComposeShader(shaderA,shaderB,Mode)~~~  
  68.         //组合线性和环形两种渐变,当然其他的也可以的  
  69.         composeShader   
  70.             = new ComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);  
  71.     }  
  72.     @Override  
  73.     public void run() {  
  74.         while(loop) {  
  75.             draw();  
  76.             try {  
  77.                 Thread.sleep(100);  
  78.             } catch (InterruptedException e) {  
  79.                 e.printStackTrace();  
  80.             }  
  81.         }  
  82.     }  
  83.     @Override  
  84.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
  85.     }  
  86.     @Override  
  87.     public void surfaceCreated(SurfaceHolder arg0) {  
  88.         new Thread(this).start();  
  89.     }  
  90.     @Override  
  91.     public void surfaceDestroyed(SurfaceHolder arg0) {  
  92.         loop = false;  
  93.     }  
  94.       
  95.     private void draw() {  
  96.         Canvas canvas = surfaceHolder.lockCanvas();  
  97.         /* 
  98.          * ~~~BitmapShader 
  99.          */  
  100.         //构造形状为椭圆的shapeDrawable对象  
  101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
  102.         //设置显示的图片  
  103.         shapeDrawable.getPaint().setShader(bitmapShader);  
  104.         //设置显示的长和高  
  105.         shapeDrawable.setBounds(00, bitPicWidth, bitPicHeight);  
  106.         //绘制图像  
  107.         shapeDrawable.draw(canvas);  
  108.         //~~~LinearGradient~~~  
  109.         //设置画笔的渲染类型  
  110.         paint.setShader(linearGradient);  
  111.         canvas.drawRect(0, bitPicHeight, 320150, paint);  
  112.         //~~~RadialGradient~~~  
  113.         paint.setShader(radialGradient);  
  114.         canvas.drawCircle(16024066, paint);  
  115.         //~~~SweepGradient  
  116.         paint.setShader(sweepGradient);  
  117.         canvas.drawCircle(10035066, paint);  
  118.         //~~~ComposeShader~~~  
  119.         paint.setShader(composeShader);  
  120.         canvas.drawRect(bitPicWidth, 320320480, paint);  
  121.         surfaceHolder.unlockCanvasAndPost(canvas);  
  122.     }  
  123. }  

总结:

配色弄的不是很好看,大家可别见怪,大体来说渲染图像或图形三步:

首先是声明渲染或渐变类。

然后将画笔setShader为声明的类。

最后绘制的时候用此画笔即可。



0 0
原创粉丝点击