做项目的时候很多时候产品都要求图片是圆形的,那么怎么才能把一张矩形图片加工成圆形呢,这时候就要用到我们常说的渲染:
先聊一下安卓中常用的集中渲染:
渲染 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);
}
}