相关代码地址 :
位图渲染 :
BitmapShader
Paint
设置 着色器 Shader
/**
* 调用该构造函数创建一个新的着色器, 用于绘制位图
*
* @param bitmap 将要绘制的位图
* @param tileX 设置绘制位图时的 x 方向的拉伸方式
* @param tileY 设置绘制位图时的 y 方向的拉伸方式
*/
public BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY) {
this(bitmap, tileX.nativeInt, tileY.nativeInt);
}
public class Shader {
...
public enum TileMode {
/**
* replicate the edge color if the shader draws outside of its
* original bounds
*/
CLAMP (0),
/**
* repeat the shader's image horizontally and vertically
*/
REPEAT (1),
/**
* repeat the shader's image horizontally and vertically, alternating
* mirror images so that adjacent images always seam
*/
MIRROR (2);
TileMode(int nativeInt) {
this.nativeInt = nativeInt;
}
final int nativeInt;
}
...
}
Paint
对象 的 setShader
方法为 画笔设置 着色器;Paint
对象的 setAntiAlias
方法, 打开抗锯齿, 这样 位图的边界会更平滑, paint.setAntiAlias(true)
;canvas.drawRect(new Rect(0,0 , 100, 100),mPaint);
; @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint mPaint = new Paint();
Bitmap mBitmap = ((BitmapDrawable)getResources()
.getDrawable(R.mipmap.aodesai)).getBitmap();
//1. 创建位图渲染对象, 并设置拉伸方式, 此处设置Shader.TileMode.CLAMP,
// 如果绘制的位置超出了图像的边界, 那么超出部分 使用最后一个像素的颜色值绘制
BitmapShader bitmapShader = new BitmapShader(mBitmap,
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//2. 设置渲染到 Paint 对象
mPaint.setShader(bitmapShader);
//3. 打开抗锯齿
mPaint.setAntiAlias(true);
//4. 绘制指定的矩形区域
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
}
CLAMP 拉伸 :
Shader.TileMode.CLAMP
, 则在绘制超出图片边界时, 就会绘制 水平 或 垂直方向 上最后一个像素, 填充剩余的位置 ;package com.hanshuliang.shader.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposeShader;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.hanshuliang.shader.R;
public class PaintBitmapShaderClamp extends View {
public PaintBitmapShaderClamp(Context context) {
super(context);
}
public PaintBitmapShaderClamp(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public PaintBitmapShaderClamp(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint mPaint = new Paint();
Bitmap mBitmap = ((BitmapDrawable)getResources()
.getDrawable(R.mipmap.aodesai)).getBitmap();
//1. 创建位图渲染对象, 并设置拉伸方式, 此处设置Shader.TileMode.CLAMP,
// 如果绘制的位置超出了图像的边界, 那么超出部分 使用最后一个像素的颜色值绘制
BitmapShader bitmapShader = new BitmapShader(mBitmap,
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//2. 设置渲染到 Paint 对象
mPaint.setShader(bitmapShader);
//3. 打开抗锯齿
mPaint.setAntiAlias(true);
//4. 绘制指定的矩形区域
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
}
}
REPEAT 拉伸 :
Shader.TileMode.REPEAT
, 则在绘制超出图片边界时, 就会绘制 同样的图片 填充剩余部分 ;package com.hanshuliang.shader.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.hanshuliang.shader.R;
public class PaintBitmapShaderRepeat extends View {
public PaintBitmapShaderRepeat(Context context) {
super(context);
}
public PaintBitmapShaderRepeat(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public PaintBitmapShaderRepeat(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint mPaint = new Paint();
Bitmap mBitmap = ((BitmapDrawable)getResources().
getDrawable(R.mipmap.aodesai)).getBitmap();
//1. 创建位图渲染对象, 并设置拉伸方式, 此处设置Shader.TileMode.CLAMP,
// 如果绘制的位置超出了图像的边界, 使用平铺方式填充
BitmapShader bitmapShader = new BitmapShader(mBitmap,
Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
//2. 设置渲染到 Paint 对象
mPaint.setShader(bitmapShader);
//3. 打开抗锯齿
mPaint.setAntiAlias(true);
//4. 绘制指定的矩形区域
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
}
}
MIRROR 拉伸 :
Shader.TileMode.MIRROR
, 则在绘制超出图片边界时, 就会绘制 图片的 镜像翻转方式 铺满剩余部分;package com.hanshuliang.shader.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.hanshuliang.shader.R;
public class PaintBitmapShaderMirror extends View {
public PaintBitmapShaderMirror(Context context) {
super(context);
}
public PaintBitmapShaderMirror(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public PaintBitmapShaderMirror(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint mPaint = new Paint();
Bitmap mBitmap = ((BitmapDrawable)getResources().
getDrawable(R.mipmap.aodesai)).getBitmap();
//1. 创建位图渲染对象, 并设置拉伸方式, 此处设置Shader.TileMode.CLAMP,
// 如果绘制的位置超出了图像的边界, 那么超出部分 使用镜像平铺方式填充
BitmapShader bitmapShader = new BitmapShader(mBitmap,
Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
//2. 设置渲染到 Paint 对象
mPaint.setShader(bitmapShader);
//3. 打开抗锯齿
mPaint.setAntiAlias(true);
//4. 绘制指定的矩形区域
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
}
}
相关代码地址 :