转自 http://blog.csdn.net/abcdef314159

http://blog.csdn.net/aigestudio/article/details/41799811

Shader渲染Android提供了5个子类,有BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient。Shader中有一个TileMode,共有3种模式,

CLAMP:当图片小于绘制尺寸时要进行边界拉伸来填充

REPEAT:当图片小于绘制尺寸时重复平铺

MIRROR:当图片小于绘制尺寸时镜像平铺

我们先来看一下BitmapShader,

  1. public class ShaderView extends View {
  2. private Bitmap mBitmap;
  3. private Shader mBitmapShader = null;
  4. private Paint mPaint;
  5. public ShaderView(Context context, AttributeSet attrs) {
  6. super(context, attrs);
  7. init();
  8. }
  9. private void init() {
  10. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  11. mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
  12. mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT,
  13. Shader.TileMode.MIRROR);
  14. }
  15. @Override
  16. protected void onDraw(Canvas canvas) {
  17. super.onDraw(canvas);
  18. mPaint.setShader(mBitmapShader);
  19. canvas.drawRect(0, 0, mBitmap.getWidth() * 4, mBitmap.getHeight() * 4,
  20. mPaint);
  21. }
  22. }

运行结果为


我们看到左右平铺,上下镜像,在来改一下,只需要把上面的mBitmapShader改一下就可

  1. mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
  2. Shader.TileMode.MIRROR);

看到上下镜像,左右拉伸,再来看一下LinearGradient

  1. public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[],
  2. TileMode tile)

float x0 :渐变的x坐标起点
float y0 :渐变的y坐标起点
float x1 :渐变的x坐标终点
float y1 :渐变的y坐标终点
int colors[]:渐变的颜色数组
float positions[]:颜色的相对位置
TileMode tile:上面的3种模式

  1. public class ShaderView extends View {
  2. private Shader mLinearGradient = null;
  3. private Paint mPaint;
  4. public ShaderView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. init();
  7. }
  8. private void init() {
  9. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  10. mLinearGradient = new LinearGradient(0, 0, 100, 100, new int[] {
  11. Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE },
  12. new float[] { 0, .1F, .8F, .9F }, Shader.TileMode.REPEAT);
  13. }
  14. @Override
  15. protected void onDraw(Canvas canvas) {
  16. super.onDraw(canvas);
  17. mPaint.setShader(mLinearGradient);
  18. canvas.drawRect(0, 0, 900, 1000, mPaint);
  19. }
  20. }


我们看到上面的小数数组是渐变的相对位置,如果positions为空,这均匀分布,修改一下

  1. mLinearGradient = new LinearGradient(0, 0, 100, 100, new int[] {
  2. Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE }, null,
  3. Shader.TileMode.REPEAT);

再来修改一下模式,因为最后一个是白色容易和手机屏幕混淆,所以添加了一个绿色

  1. mLinearGradient = new LinearGradient(0, 0, 100, 100,
  2. new int[] { Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE,
  3. Color.GREEN }, null, Shader.TileMode.CLAMP);


我们看到最后一个颜色是拉伸,再修改一下

  1. mLinearGradient = new LinearGradient(0, 0, 100, 100,
  2. new int[] { Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE,
  3. Color.GREEN }, null, Shader.TileMode.MIRROR);

镜像模式,所以感觉有点对称。在看一下LinearGradient的另一个构造方法,

  1. LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,
  2. TileMode tile)

其中color0是颜色的起始点,color1是颜色的终止点,我们就演示一个看看

  1. mLinearGradient = new LinearGradient(0, 0, 100, 100, Color.RED,
  2. Color.YELLOW, Shader.TileMode.MIRROR);


再来看一下RadialGradient

  1. RadialGradient(float x, float y, float radius,
  2. int colors[], float positions[], TileMode tile)

它实现的是环形渐变,
x:渐变的中心x坐标

y:渐变的中心y坐标

radius:渐变的半径

colors:梯度渐变的颜色数组

positions:和LinearGradient类似,用来指定颜色数组的相对位置

  1. public class ShaderView extends View {
  2. private Shader mRadialGradient = null;
  3. private Paint mPaint;
  4. public ShaderView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. init();
  7. }
  8. private void init() {
  9. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  10. mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
  11. Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
  12. Shader.TileMode.REPEAT);
  13. }
  14. @Override
  15. protected void onDraw(Canvas canvas) {
  16. super.onDraw(canvas);
  17. mPaint.setShader(mRadialGradient);
  18. canvas.drawRect(0, 0, 900, 1000, mPaint);
  19. }
  20. }


运行结果如上,再来修改一下

  1. mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
  2. Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
  3. Shader.TileMode.CLAMP);


再来修改一下

  1. mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
  2. Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
  3. Shader.TileMode.MIRROR);

还有个构造方法,这里就不在演示

  1. RadialGradient(float x, float y, float radius,
  2. int color0, int color1, TileMode tile)

下面看一下SweepGradient

  1. SweepGradient(float cx, float cy,
  2. int colors[], float positions[])

cx,cy:扫描中心的x,y坐标

colors:渐变的数组颜色
positions:渐变的相对位置

  1. public class ShaderView extends View {
  2. private Shader mSweepGradient = null;
  3. private Paint mPaint;
  4. public ShaderView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. init();
  7. }
  8. private void init() {
  9. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  10. mSweepGradient = new SweepGradient(400, 400, new int[] { Color.YELLOW,
  11. Color.RED, Color.BLUE, Color.GREEN }, new float[] { 0, .2F,
  12. .6F, .9F });
  13. }
  14. @Override
  15. protected void onDraw(Canvas canvas) {
  16. super.onDraw(canvas);
  17. mPaint.setShader(mSweepGradient);
  18. canvas.drawCircle(400, 400, 300, mPaint);
  19. }
  20. }

还有最后一个ComposeShader,这个是组合的Shader

  1. public class ShaderView extends View {
  2. private Shader mSweepGradient = null;
  3. private Shader mBitmapShader = null;
  4. private Shader mComposeShader = null;
  5. private Paint mPaint;
  6. private Bitmap mBitmap;
  7. public ShaderView(Context context, AttributeSet attrs) {
  8. super(context, attrs);
  9. init();
  10. }
  11. private void init() {
  12. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  13. mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
  14. mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT,
  15. Shader.TileMode.MIRROR);
  16. mSweepGradient = new SweepGradient(mBitmap.getWidth() * 2,
  17. mBitmap.getWidth() * 2, new int[] { Color.YELLOW,
  18. Color.RED, Color.BLUE, Color.GREEN }, new float[] { 0, .2F,
  19. .6F, .9F });
  20. mComposeShader = new ComposeShader(mBitmapShader, mSweepGradient,
  21. PorterDuff.Mode.DARKEN);
  22. }
  23. @Override
  24. protected void onDraw(Canvas canvas) {
  25. super.onDraw(canvas);
  26. mPaint.setShader(mComposeShader);
  27. canvas.drawRect(0, 0, mBitmap.getWidth() * 4, mBitmap.getHeight() * 4,
  28. mPaint);
  29. }
  30. }

android shader 用法的更多相关文章

  1. Android Meun 用法

    Android Meun 用法 点击菜单实体键弹出菜单:如下图 main_activity.xml <?xml version="1.0" encoding="ut ...

  2. Android ViewPager 用法

    Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...

  3. Android Intent 用法全面总结

    [代码全屏查看]-Android Intent 用法全面总结 // [1].[代码] 调用拨号程序 跳至 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] / ...

  4. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  5. Android ScrollView用法

    Android ScrollView用法 今天试着使用了一下Android的滚轮,以下是一个小小的测试,读取测试文件,主要是使用scrollTo函数和getScrollY(),程序点击BUTTON按钮 ...

  6. Android Service用法知识点的讲解

    Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...

  7. Android Fragment用法知识点的讲解

    Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...

  8. Android spannableStringBuilder用法整理

    Android spannableStringBuilder用法整理 分类: Android开发2013-11-29 10:58 5009人阅读 评论(0) 收藏 举报 Androidspannabl ...

  9. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

随机推荐

  1. 对于那本--你必须知道的499个C语言问题--总结

    (1)1.3 (2)1.10没看懂 (3)1.11和1.12都讲到了   静态变量和局部变量,那么这两个是啥啊,我不懂: (4)1.13针对那两个字符串定义为啥有问题,不懂 (5)2.8是做什么的 ( ...

  2. db2 常用命令

    db2osconf 检查系统内核参数 db2pd 监控检查数据库工具,可以检查数据库的许多信息(锁.交易.表空间. SQL等) db2expln 查看程序包的执行计划 db2exfmt 格式化expl ...

  3. C语言调用curl库抓取网页图片(转)

    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址.  范例: #include <stdio.h> #include <stdlib.h> #include < ...

  4. IOS低版本遇到了坑不知道你遇到了没

    拿着项目给客户测试,客户那边三个人俩人水果手机是ios8以下版本,结果导致```(恭喜,坑出现!)总不能说老总!"您把版本升级到ios9 吧!

  5. Android 7.0 UICC 分析(四)

    本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...

  6. qt5中QPrinter的使用兼容性问题

    qt5与qt4在QPrinter中使用的不同点如下: 在.pro文件中加入如下语句:

  7. 安卓app中嵌入一个H5页面,当手机系统设置字体变大时,如何使H5页面的字体不会随用户自己调整的系统字体变化而变化?

    webview.getSettings().setTextZoom(100);WebView加上这个设置后,WebView里的字体就不会随系统字体大小设置发生变化了. https://segmentf ...

  8. Java内存与垃圾收集知识总结

    总结一下关于Java内存的知识,今天我不生产知识,我只是知识的搬运工. 1.运行时数据区域 java虚拟机在执行JAVA程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 由所有线程共享的数据 ...

  9. 實際案例: 已知要獲取臨時票証 (JsApi Ticket) 才能調用的接口

    需獲取票証才能調用的接口,簡單列示如下: 一.基礎類 1. wx.checkJsApi (當前客戶端是否支持指定JS) 二.分享類 1.wx.onMenuShareTimeline (分享到朋友圈)2 ...

  10. docke部署mysql

    #1    docker pull mysql #2    docker run -v /data/var/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=k ...