Android BitmapShader
在Android开发中,我们经常需要对图片进行各种处理,如缩放、裁剪、旋转等。其中一种常见的处理方式是使用BitmapShader来实现各种特效。BitmapShader是一个用于绘制图形的Shader类,它可以通过将一个Bitmap对象作为纹理来绘制图形。本文将介绍BitmapShader的基本用法,并通过代码示例演示其实现。
BitmapShader的概述
BitmapShader是Shader类的子类,它用于在绘制图形时使用一个Bitmap对象作为纹理。通过创建一个BitmapShader对象,并将其设置给Paint对象,在绘制图形时就可以使用该纹理来填充图形的内容。
创建BitmapShader对象
要创建一个BitmapShader对象,我们需要使用BitmapShader的构造函数,并传入两个参数:一个Bitmap对象和两个TileMode参数。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Shader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
在上述代码中,我们首先通过BitmapFactory的decodeResource方法加载一张图片,并将其转换为一个Bitmap对象。然后通过BitmapShader的构造函数创建一个BitmapShader对象,并将其设置给Paint对象。
在上述代码中,我们使用了两个TileMode参数:TileMode.CLAMP和TileMode.CLAMP。TileMode用于定义在绘制图形时,如果图形区域大于纹理区域时的填充方式。TileMode.CLAMP表示使用纹理的边缘像素进行填充,TileMode.REPEAT表示重复使用纹理,TileMode.MIRROR表示通过镜像方式填充。根据实际需要,我们可以选择不同的TileMode来达到不同的填充效果。
使用BitmapShader绘制图形
在创建了BitmapShader对象后,我们需要将其设置给Paint对象,并在Canvas上使用该Paint对象绘制图形。
Paint paint = new Paint();
paint.setShader(shader);
canvas.drawCircle(centerX, centerY, radius, paint);
在上述代码中,我们首先创建了一个Paint对象,并调用其setShader方法,将BitmapShader对象设置给Paint对象。然后,我们可以在Canvas上使用该Paint对象来绘制图形,如绘制圆形、矩形等。通过设置BitmapShader,我们可以实现各种特效,如圆角图片、圆形图片等。
示例:圆形图片
下面是一个使用BitmapShader实现圆形图片的示例代码:
public class CircleImageView extends AppCompatImageView {
private BitmapShader shader;
private Paint paint;
private float radius;
public CircleImageView(Context context) {
super(context);
init();
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (shader == null) {
Bitmap bitmap = drawableToBitmap(drawable);
shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
radius = Math.min(bitmap.getWidth(), bitmap.getHeight()) / 2;
}
int width = getWidth();
int height = getHeight();
float centerX = width / 2;
float centerY = height / 2;
paint.setShader(shader);
canvas.drawCircle(centerX, centerY, radius, paint);
}
private Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
在上述代码中,我们创建了一个CircleImageView类,继承自AppCompatImageView,并重写了onDraw方法。在onDraw方法中,我们首先判断ImageView是否有Drawable,如果没有,则直接返回。接下来,我们使用drawableToBitmap方法将Drawable对象转换为Bitmap对象,并使用BitmapShader实现圆形效果。最后,我们在Canvas上使用Paint对象绘制圆形图片。