安卓中如何把一张图片加工成圆形

做项目的时候很多时候产品都要求图片是圆形的,那么怎么才能把一张矩形图片加工成圆形呢,这时候就要用到我们常说的渲染:

先聊一下安卓中常用的集中渲染:

渲染 Shader:
    BimapShader位图的图像渲染器
    LinearGradient线性渲染
    RadialGradient环形渲染
        水波纹效果,充电水波纹扩散效果、调色板
    SweepGradient梯度渲染(扫描渲染)
        微信等雷达扫描效果。手机卫士垃圾扫描
    ComposeShader组合渲染
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;

public class MyImageView extends View {

    private Bitmap bitmap;
    private Paint paint;
    private BitmapShader bitmapShader;   // 位图的图像渲染器
    private int width;
    private int height;

    public MyImageView(Context context) {
        super(context);
        bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.avatar3)).getBitmap();
        paint = new Paint();
        width = bitmap.getWidth();
        height = bitmap.getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);

//      canvas.drawBitmap(bitmap, 0, 0, paint);  // 

        /**
         * TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
         * TileMode.MIRROR 通过镜像翻转铺满剩下的地方。
         * TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)
         */
        bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.MIRROR);
//      bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
//      bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT);
        paint.setShader(bitmapShader);
        paint.setAntiAlias(true);

        //设置像素矩阵,来调整大小,为了解决宽高不一致的问题。
        float scale = Math.max(width, height)*1.0f/Math.min(width, height);
        Matrix matrix = new Matrix();
        matrix.setScale(scale, scale);//缩放比例
        bitmapShader.setLocalMatrix(matrix);

//      canvas.drawRect(new Rect(0, 0, 800, 800), paint);
//      canvas.drawCircle(height/2, height/2, height/2, paint);
        canvas.drawCircle(Math.min(width, height)/2f, scale*Math.max(width, height)/2f, Math.max(width, height)/2f, paint);

//      canvas.drawOval(new RectF(0, 0, width, height), paint);
//      canvas.drawOval(new RectF(0, 0, width, width), paint);

        //通过shapeDrawable也可以实现
//      ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//      shapeDrawable.getPaint().setShader(bitmapShader);
//      shapeDrawable.setBounds(0, 0, width, width);
//      shapeDrawable.draw(canvas);
    }

}

猜你喜欢

转载自blog.csdn.net/pengyu1801/article/details/78578025