Android开发之高级渲染

前言:关于图像的渲染,一些刚接触paint的人无所下手,或者很少使用这个功能,so,今天我总结了以下几个常用的渲染效果:1、BimapShader位图的图像渲染器,2、LinearGradient线性渲染。3、RadialGradient环形渲染。4、SweepGradient梯度渲染(扫描渲染),5、ComposeShader组合渲染,当然这些都属于paint的高级使用!

------------------ 一:BitmapShader位图的图像渲染--------------------

1、BitmapShader位图的简单使用。

TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方

TileMode.MIRROR 通过镜像翻转铺满剩下的地方。

TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)

ok,来看一下我们具体的使用:

public class MyGradientView extends View {

    private Bitmap mBitmap;
    private Paint mPaint;
    private int mBitmapHeight;
    private BitmapShader mBitmapShader;
    private int mBitmapWidth;

    public MyGradientView(Context context) {
        super(context);
        mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.u)).getBitmap();
        mPaint = new Paint();
        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
//        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
//        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        mPaint.setAntiAlias(true);
        mPaint.setShader(mBitmapShader);
        canvas.drawRect(new Rect(0, 0, 2000, 2000), mPaint);

    }
}
三个效果依旧是:

TileMode.REPEAT:


TileMode.MIRROR:


TileMode.CLAMP:


2、BitmapShader位图搭配像素矩阵实现圆形头像效果。

我们再来看下原图如下所示:


分析:如果切成圆形图的话我们肯定希望是上面描述的那样,半径最大是图片宽度的一半,圆心的位置根据高度和宽度的比值和图片x的坐标来确定。

所以通过设置像素矩阵,来调整大小,解决宽高不一致的问题:

 float scale = Math.max(mBitmapWidth, mBitmapHeight) * 1.0f / Math.min(mBitmapWidth, mBitmapHeight);
        Matrix matrix = new Matrix();
        matrix.setScale(scale, scale);
        mBitmapShader.setLocalMatrix(matrix); 

然后canvas通过scale来绘制圆形:

        canvas.drawCircle(Math.min(mBitmapWidth, mBitmapHeight) / 1.3f,
                scale * Math.max(mBitmapWidth, mBitmapHeight) / 2f,
                Math.max(mBitmapWidth, mBitmapHeight) / 2f, mPaint);
来看下效果图:

3、BitmapShader位图搭配shapeDrawable也可以实现圆形头像。

     ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
        shapeDrawable.getPaint().setShader(mBitmapShader);
        shapeDrawable.setBounds(0, 0, mBitmapWidth, mBitmapWidth);
        shapeDrawable.draw(canvas);
当然效果就没有上面太好了。



----------- 二:LinearGradient线性渲染----------

代码:

public class LinearGradientView extends View {

    private Paint paint;
    private int[] colors = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};

    public LinearGradientView(Context context) {
        super(context);
        paint = new Paint();
    }

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

        /**线性渐变
         * x0, y0, 起始点
         *  x1, y1, 结束点
         * int[]  colors, 中间依次要出现的几个颜色
         * float[] positions,数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右)
         *    tile
         */
	LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, Shader.TileMode.CLAMP);
        paint.setShader(linearGradient);
        canvas.drawRect(0, 0, 400, 400, paint);

    }
}
效果图:


----------- 三:RadialGradient环形渲染----------
代码:

		radialGradient = new RadialGradient(300, 300, 100, colors, null, Shader.TileMode.REPEAT);
		paint.setShader(radialGradient);
		canvas.drawCircle(300, 300, 300, paint);
效果图:


----------- 四:SweepGradient梯度渲染(扫描渲染)----------

代码:

		sweepGradient = new SweepGradient(300, 300, colors, null);
		paint.setShader(sweepGradient);
		canvas.drawCircle(300, 300, 300, paint);
效果图:


----------- 五:ComposeShader组合渲染----------

这个组合渲染,也就是把线性渲染或梯度渲染或环形渲染和BitmapShader位图组合在一起:

public class LinearGradientView extends View {

    private Paint paint;
    private Bitmap bitmap;
    private BitmapShader bitmapShader;
    private ComposeShader composeShader;
    private int[] colors = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};

    public LinearGradientView(Context context) {
        super(context);
        paint = new Paint();
        bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.uuu)).getBitmap();
    }

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

        bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        paint.setShader(bitmapShader);
        
        LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, Shader.TileMode.REPEAT);

        composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
        paint.setShader(composeShader);
        canvas.drawRect(0, 0, 800, 1200, paint);
    }
}
ok效果图:


------------------以上就是今天讲的一些渲染效果,大家可以自行练习一下----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值