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对象绘制圆形图片。