博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android中shader的使用
阅读量:4055 次
发布时间:2019-05-25

本文共 6942 字,大约阅读时间需要 23 分钟。

 

五种方式:

BitmapShader bitmapShader;//位图渲染    LinearGradient linearGradient;//线性渲染    SweepGradient sweepGradient;//渐变渲染    RadialGradient radialGradient;//环形渲染    ComposeShader composeShader;//组合渲染

其中组合渲染和组合动画类似,但是组合渲染只能将两个渲染结合起来。

1、位图渲染

类似于给图片设置背景,这里有三种方式:图片比内容小,第一种就拉伸最后一个像素,第二种就重复图片,第三种是做镜像对称。可以分别设置X/Y方向上的填充模式

demo:X方向上使用重复。Y轴使用镜像

private void useBitmapShader(Canvas canvas) {        //使用BitmapShader        //        Shader.TileMode.CLAMP;//拉伸最后一个像素去铺满//        Shader.TileMode.REPEAT;//重复以铺满//        Shader.TileMode.MIRROR;//镜像翻转铺满        bitmapShader = new BitmapShader(BitmapFactory.decodeResource(getResources(), R.drawable.aipay),                Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);        paint.setShader(bitmapShader);        canvas.drawRect(new Rect(getPaddingLeft(), getPaddingTop(), getMeasuredWidth()                - getPaddingLeft() * 2                , getMeasuredHeight()), paint);        ;        //使用shapeDrawable也可以实现同样的效果        ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());        shapeDrawable.getPaint().setShader(bitmapShader);        shapeDrawable.setBounds(0, 0, ScreenSizeUtil.getScreenSize_Width(getContext()), getMeasuredHeight());//        shapeDrawable.draw(canvas);    }

效果图:

2.线性渐变

private void userLinerGradient(Canvas canvas) {        int color[] = {Color.parseColor("#000000"), Color.parseColor("#ff0000"), Color.parseColor("#ffffff")};        float percent[] = {0.3f, 0.4f, 0.3f};        //四个参数分别表示 起始的xy 结束的xy  如果开始是0,0 结束是 width,height,将是左上到右下斜向的        linearGradient = new LinearGradient(0.0f, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), color, null, Shader.TileMode.REPEAT);        paint.setShader(linearGradient);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);        ;        // canvas.drawText("测试文字的测试文字测试文字测试文字的测试文字测试文字", 0, getPaddingTop() + 150, paint);    }

效果:

3.环形渐变

private void userRadiusGradient(Canvas canvas) {        int color[] = {Color.parseColor("#000000"), Color.parseColor("#ff0000"), Color.parseColor("#ffffff")};        float percent[] = {0.1f, 0.5f, 0.4f};        radialGradient = new RadialGradient(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2, color, null, Shader.TileMode.CLAMP);        paint.setShader(radialGradient);         canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2, paint);       // canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);    }

效果:

4.梯度渐变

demo:

private void useSweepGradient(Canvas canvas) {        int color[] = {Color.parseColor("#000000"), Color.parseColor("#ff0000"), Color.parseColor("#ffffff")};        float percent[] = {0.1f, 0.8f, 0.1f};        //梯度的中心        sweepGradient = new SweepGradient(getMeasuredWidth()/2, getMeasuredHeight()/2, color, null);        paint.setShader(sweepGradient);        //canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, Dp2Px.dip2px(getContext(), 150), paint);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);    }

效果图:

5.组合渲染

private void userComposeGradient(Canvas canvas) {        int color[] = {Color.parseColor("#000000"), Color.parseColor("#ff0000"), Color.parseColor("#ffffff")};        float percent[] = {0.1f, 0.8f, 0.1f};        linearGradient = new LinearGradient(0.0f, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), color, null, Shader.TileMode.REPEAT);        bitmapShader = new BitmapShader(BitmapFactory.decodeResource(getResources(), R.drawable.aipay),                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.MULTIPLY);        paint.setShader(composeShader);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);    }

效果图:

 

6.使用线性渐变实现个文字跑马灯效果:一行文字上有个光点从左到右移动

使用线性渲染来出来,动态改变渲染的中心点

int index = 0;    private void testLed(Canvas canvas) {        int color[] = {Color.parseColor("#000000"), Color.parseColor("#ff0000"), Color.parseColor("#000000")};        float percent[] = {0.3f, 0.4f, 0.3f};        //四个参数分别表示 起始的xy 结束的xy  如果开始是0,0 结束是 width,height,将是左上到右下斜向的        linearGradient = new LinearGradient(getMeasuredWidth() / 10 * index, getMeasuredHeight(), getMeasuredWidth() / (10 * index + 1), getMeasuredHeight(), color, null, Shader.TileMode.MIRROR);        paint.setShader(linearGradient);        //canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);        ;        canvas.drawText("测试文字", 0, 50, paint);        if (index < 10) {            index = index + 1;        } else {            index = 0;        }        //主要是这个方法,否则就需要使用动画        postInvalidateDelayed(50);    }

7.实现雷达:一个大圆圈,里面有一个扇形在转动

圆圈+使用线性渐变绘制的扇形

private void drawLeiDaTwo(Canvas canvas) {        Paint paint_circle = new Paint();        int color[] = {Color.parseColor("#0000006f"), Color.parseColor("#ff00006f"), Color.parseColor("#0000006f")};        paint_circle.setStyle(Paint.Style.FILL);        paint_circle.setColor(getResources().getColor(android.R.color.holo_blue_light));        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2, paint_circle);        Paint paint_line = new Paint();        paint_line.setStyle(Paint.Style.STROKE);        paint_line.setColor(getResources().getColor(android.R.color.white));        //模拟雷达中间的几个圆圈        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 9, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 8, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 7, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 6, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 5, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 3, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2 / 2, paint_line);        canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredWidth() / 2, paint_line);        SweepGradient sweepGradient1 = new SweepGradient(getMeasuredWidth() / 2, getMeasuredHeight() / 2, color, null);        sweepGradient1 = new SweepGradient(0, getMeasuredHeight(), color, null);        paint.setShader(sweepGradient1);        RectF rectF = new RectF(0, (getMeasuredHeight() - getMeasuredWidth()) / 2, getMeasuredWidth(), getMeasuredHeight() - (getMeasuredHeight() - getMeasuredWidth()) / 2);       //动态绘制扇形        canvas.drawArc(rectF,                nowStart, 90, true, paint        );        if (nowStart < 270) {            nowStart = nowStart + 90;        } else {            nowStart = 0;        }        postInvalidateDelayed(80);    }

效果图

 

转载地址:http://ixeci.baihongyu.com/

你可能感兴趣的文章
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>