Android中的自绘View的那些事儿(二)之 Shader渲染器和BitmapShader位图渲染器的简介

Shader

Shader直译是着色器,或者也叫颜色渲染器。Android中对应有Shader类,它是一个基类对象,它在图形绘制过程中返回一段颜色值,通过调用Paint.setShader(Shader shader);方法,可以将它的子类装载进Paint中,这样Paint对象在绘制过程中所获取的颜色就是来自Shader对象。

模式

Shader中定义了三种平铺模式,其值在emunShader.TileMode枚举中,分别是:

Shader.TileMode CLAMP    // 边缘拉伸

Shader.TileMode MIRROR   // 以镜像的方式在X和Y方向复制

Shader.TileMode REPEAT    // X和Y方向复制

方法

Shader中有两个重要的方法:

boolean getLoaclMatrix(Matrix localM);     // 返回是否存在非本地的矩阵localM

void setLocalMatrix(Matrix localM);           // 为Shader设置一个本地矩阵

子类

Shader有5个子类:

BitmapShader                    位图渲染器

LinearGradient                  线性渲染器

RadialGradient                  环形渲染器

SweepGradient                  梯度渲染器

ComposeShader                组合渲染器

BitmapShader位图渲染器

BitmapShader是将位图绘制为纹理的渲染器。我们来看看它的构造函数:

BitmapShader(Bitmap bitmap,                         	// 使用的位图对象       
              Shader.TileMode tileX,                    // 位图上X坐标方向的渲染平铺模式
              Shader.TileMode tileY)                    //位图上Y坐标方向的渲染平铺模式

示例:

public class MyView extends View {
 
   public MyView(Context context) {
       this(context, null, 0);
    }
   public MyView(Context context, AttributeSet attrs) {
       this(context, attrs, 0);
    }
   public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
    }
 
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
 
       Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
       BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
 
       Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
       paint.setShader(shader);
       canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2,paint);
    }
}

上面代码中,定义了一个BitmapShader,并指定它的模式是X坐标方向以镜像的方式复制,而Y坐标方向是边缘伸拉。最后在比位图大2倍的矩形中绘制出来

运行效果:

修改onDraw中的代码,使用setLocalMatrix旋转位图:   

   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
 
       Bitmap bitmap =BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
       BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
 
       Matrix matrix = new Matrix();
       matrix.setRotate(-90, bitmap.getWidth() / 2, bitmap.getHeight() / 2);  // 旋转-90度
       shader.setLocalMatrix(matrix);
 
       Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
       paint.setShader(shader);
       canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2,paint);
   }

上面代码中,在原来基础上加入了三行代码。其中主要是定义了一个本地矩阵Matrix,并在参数中指定将其旋转-90度

运行效果:

再次修改onDraw中的代码,本次我们不绘制矩形,改成绘制文字:

   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
 
       Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
       BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
 
       Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
       paint.setTextSize(100);
       paint.setShader(shader);
       canvas.drawText("Hello World", 0, bitmap.getHeight() / 2,paint);
   }

上面代码中,将原来绘制在一个矩形区域替换成绘制在文字"Hello World"中

运行效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值