画笔Paint的基本使用
mPaint = new Paint();//初始化
mPaint.setColor(Color.RED);//设置颜色
mPaint.setARGB(255, 255, 255, 255);
mPaint.setAlpha(200);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);//STROKE:设置描边效果,FILL:填充
mPaint.setStrokeWidth(4);//描边宽度
mPaint.setStrokeCap(Paint.Cap.ROUND);//ROUND:圆角效果,BUTT:竖线,SQUARE:多出来一节
mPaint.setStrokeJoin(Paint.Join.MITER);//拐角风格,MITER:尖角,ROUND:圆角,BEVEL:平角
mPaint.setShader(new SweepGradient(200, 200, Color.BLUE, Color.RED));//环形渲染器
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));//图形混合模式
mPaint.setColorFilter(new LightingColorFilter(0x00ffff,0x000000));//颜色过滤
mPaint.setFilterBitmap(true);//设置双线性过滤,true:平滑,false:马赛克效果
mPaint.setMaskFilter(new BlurMaskFilter(10,BlurMaskFilter.Blur.NORMAL));//设置画笔遮罩滤镜,传入度数和样式
mPaint.setTextScaleX(2);//设置文本放大倍数
mPaint.setTextSize(22);//设置文本大小
mPaint.setTextAlign(Paint.Align.LEFT);//设置文本对齐方式
mPaint.setUnderlineText(true);//设置下划线
String str = "高级UI";
Rect rect = new Rect();
mPaint.getTextBounds(str,0,str.length(),rect);//测量文本大小,并将文本大小信息存入在rect里面
float measureText = mPaint.measureText(str);//获取文本的宽
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();//获取字体度量对象
setShader(Shader shader)
setShader(Shader shader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类。Shader在三维软件中我们称之为着色器,其作用是来给图像着色。它有五个子类,像PathEffect一样,它的每个子类都实现了一种Shader。下面来看看文档中的解释:
子类:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient
这5个渲染器通过效果比较容易理解,这里先贴出全部代码,然后再分别展示出来其效果:
ShaderDemo:
/**
* @desc 渲染器演示类:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient
*/
public class ShaderDemo extends View {
private Paint mPaint;
private Bitmap mBitmap;
public ShaderDemo(Context context) {
this(context, null);
}
public ShaderDemo(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ShaderDemo(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();//初始化
mPaint.setColor(Color.RED);//设置颜色
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat);
}
@Override
protected void onDraw(Canvas canvas) {
//LinearGradient 线性渲染
linearGradient(canvas);
//RadialGradient 环形渲染
//radialGradient(canvas);
//SweepGradient 扫描渲染
//sweepGradient(canvas);
//BitmapShader 位图渲染
//bitmapShader(canvas);
//ComposeShader 组合渲染
//composeShader(canvas);
}
/**
* 组合渲染
*
* @param canvas
*/
private void composeShader(Canvas canvas) {
BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
LinearGradient linearGradient = new LinearGradient(0, 0, 500, 500, new int[]{Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
/*ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode)
ComposeShader (Shader shaderA, Shader shaderB, PorterDuff.Mode mode)*/
ComposeShader composeShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.DARKEN);
mPaint.setShader(composeShader);
canvas.drawRect(0, 0, 500, 500, mPaint);
}
/**
* 位图渲染
*
* @param canvas
*/
private void bitmapShader(Canvas canvas) {
//正方形
BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
BitmapShader bitmapShader1 = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
BitmapShader bitmapShader2 = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
mPaint.setShader(bitmapShader1);
canvas.drawRect(0, 0, 500, 500, mPaint);
}
/**
* 扫描渲染
*
* @param canvas
*/
private void sweepGradient(Canvas canvas) {
//圆形
SweepGradient sweepGradient = new SweepGradient(100, 100, Color.BLUE, Color.GREEN);
mPaint.setShader(sweepGradient);
canvas.drawCircle(100, 100, 100, mPaint);
//正方形
SweepGradient sweepGradient2 = new SweepGradient(300, 100, Color.BLUE, Color.GREEN);
mPaint.setShader(sweepGradient2);
canvas.drawRect(200, 0, 400, 200, mPaint);
}
/**
* 环形渲染
*
* @param canvas
*/
private void radialGradient(Canvas canvas) {
//圆形
RadialGradient radialGradient = new RadialGradient(100, 100, 100, new int[]{Color.BLUE, Color.GREEN, Color.RED}, null, Shader.TileMode.CLAMP);
mPaint.setShader(radialGradient);
canvas.drawCircle(100, 100, 100, mPaint);
//正方形
RadialGradient radialGradien2 = new RadialGradient(300, 100, 100, new int[]{Color.BLUE, Color.GREEN, Color.RED}, null, Shader.TileMode.CLAMP);
mPaint.setShader(radialGradien2);
canvas.drawRect(200, 0, 400, 200, mPaint);
}
/**
* 线性渲染
*
* @param canvas
*/
private void linearGradient(Canvas canvas) {
//圆形
LinearGradient linearGradient = new LinearGradient(0, 0, 200, 200, new int[]{Color.BLUE, Color.GREEN}, null, Shader.TileMode.CLAMP);
mPaint.setShader(linearGradient);
canvas.drawCircle(100, 100, 100, mPaint);
//正方形
LinearGradient linearGradient1 = new LinearGradient(200, 0, 400, 200, new int[]{Color.BLUE, Color.GREEN}, null, Shader.TileMode.CLAMP);
mPaint.setShader(linearGradient1);
canvas.drawRect(200, 0, 400, 200, mPaint);
//正方形2
LinearGradient linearGradient2 = new LinearGradient(400, 0, 600, 200, new int[]{Color.BLUE, Color.GREEN}, new float[]{0.5f, 1}, Shader.TileMode.CLAMP);
mPaint.setShader(linearGradient2);
canvas.drawRect(400, 0, 600, 200, mPaint);
//大正方形3-镜像模式
LinearGradient linearGradient3 = new LinearGradient(0, 200, 200, 400, new int[]{Color.BLUE, Color.GREEN, Color.RED}, new float[]{0.3f, 0.6f, 0.9f}, Shader.TileMode.MIRROR);
mPaint.setShader(linearGradient3);
canvas.drawRect(0, 200, 400, 600, mPaint);
}
}
LinearGradient 线性渲染效果:
RadialGradient 环形渲染效果:
SweepGradient 扫描渲染:
BitmapShader 位图渲染:
此处用到的bitmap原图如下
MIRROR模式,
CLAMP模式,
REPEAT模式:
ComposeShader 组合渲染: