1.2.1Paint画笔高级应用(Paint基本使用和5种Shader)

画笔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 组合渲染:

 

 

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值