游乐游手机版
首页/系统平台/文章详情

Android Paint API Shader图像渲染用法详解

时间:2026-08-12 06:41
1 构造方法详解 1)BitmapShader(图像渲染) BitmapShader(Bitmap bitmap, Shader TileMode tileX, Shader TileMode tileY) 使用一张位图作为纹理,对指定区域进行填充渲染。参数依次为: bitmap:用于填充的位图资源

1.构造方法详解

1)BitmapShader(图像渲染)

BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

使用一张位图作为纹理,对指定区域进行填充渲染。参数依次为:

  • bitmap:用于填充的位图资源;
  • tileX:位图在 X 轴方向上的平铺或衔接方式;
  • tileY:位图在 Y 轴方向上的平铺或衔接方式;

其中,Shader.TileMode 主要有以下三种模式:

  • CLAMP:当渲染区域超出原始位图边界时,会复制边缘颜色来填充超出的部分
  • REPEAT:以平铺的形式重复渲染位图内容
  • MIRROR:在横向与纵向上以镜像翻转的方式重复绘制位图。

2)ComposeShader(混合渲染)

ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

用于将两种 Shader 渲染效果进行组合叠加。看到 PorterDuff,大家应该就能联想到图像混合模式了,比如 BitmapShader 与 LinearGradient 的组合渲染效果。参数依次为:

  • shaderA:第一种渲染效果
  • shaderB:第二种渲染效果
  • mode:两种渲染效果的混合模式

3)LinearGradient(线性渲染)

LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);

用于实现指定区域内的线性渐变颜色效果,参数依次如下:

  • x0:渐变起点的 x 坐标
  • y0:渐变起点的 y 坐标
  • x1:渐变终点的 x 坐标
  • y1:渐变终点的 y 坐标
  • colors:渐变颜色数组
  • positions:颜色数组中各颜色对应的相对位置
  • tile:平铺方式

4)RadialGradient(环形渲染)

public RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile);

用于实现某一区域内的径向渐变,也就是环形渐变效果。参数依次为:

  • x:环形渐变圆心的 x 坐标
  • y:环形渐变圆心的 y 坐标
  • radius:环形渐变的半径
  • colors:环形渐变的颜色数组
  • positions:指定颜色数组的相对位置
  • tile:平铺方式

5)SweepGradient(梯度渲染)

public SweepGradient (float cx, float cy, int[] colors, float[] positions)

扫描渐变渲染,即围绕某个中心点旋转一周后形成的渐变效果。参数依次为:

  • cx:扫描中心点的 x 坐标
  • cy:扫描中心点的 y 坐标
  • colors:梯度渐变颜色数组
  • positions:指定颜色数组的相对位置

从文字说明中,我们已经可以大致了解这些 Android Shader 的作用与区别。不过仅看概念还不够,下面还是通过一段实际代码示例来验证它们的具体效果,毕竟有码有图才更直观。

2.使用代码示例:

运行效果图:

实现代码:

BitmapShaderView.ja va:

/**
 * Created by Jay on 2015/11/4 0030.
 */
public class BitmapShaderView extends View {
private Bitmap mBitmap = null;
    private ShapeDrawable sDrawable = null;
    private Paint mPaint = null;
    private int bitW = 0, bitH = 0;     //Bitmap宽高
private Shader mBitmapShader = null;   //Bitmap渲染
    private Shader mLinearGradient = null; //线性渐变渲染
    private Shader mComposeShader = null; //混合渲染
    private Shader mRadialGradient = null; //环形渐变渲染
    private Shader mSweepGradient = null; //梯度渲染
public BitmapShaderView(Context context) {
        this(context, null);
    }
public BitmapShaderView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
public BitmapShaderView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
private void init() {
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_cat);
        bitW = mBitmap.getWidth();
        bitH = mBitmap.getHeight();
        mPaint = new Paint();
//创建BitmapShader
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
//创建LinearGradient并设置渐变的颜色数组
        mLinearGradient = new LinearGradient(0, 0, 100, 100,
                new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE},
                null, Shader.TileMode.REPEAT);
//混合渲染,这里使用了BitmapShader和LinearGradient进行混合,可以试试其他~
        mComposeShader = new ComposeShader(mBitmapShader, mLinearGradient, PorterDuff.Mode.DARKEN);
//环形渐变渲染
        mRadialGradient = new RadialGradient(50, 200, 50,
                new int[]{Color.GREEN, Color.RED, Color.BLUE, Color.WHITE},
                null, Shader.TileMode.REPEAT);
//梯度渲染
        mSweepGradient = new SweepGradient(30, 30, new int[]{Color.GREEN, Color.RED,
                Color.BLUE, Color.WHITE}, null);
}
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//将图片裁剪为椭圆形
        sDrawable = new ShapeDrawable(new OvalShape());
        sDrawable.getPaint().setShader(mBitmapShader);
        sDrawable.setBounds(0, 0, bitW, bitH);
        sDrawable.draw(canvas);
//绘制线性渐变的矩形
        mPaint.setShader(mLinearGradient);
        canvas.drawRect(bitW, 0, bitW * 2, bitH, mPaint);
//绘制混合渲染效果
        mPaint.setShader(mComposeShader);
        canvas.drawRect(0, bitH, bitW , bitH * 2, mPaint);
//绘制环形渐变
        mPaint.setShader(mRadialGradient);
        canvas.drawCircle(bitW * 2.8f, bitH / 2, bitH / 2, mPaint);
//绘制梯度渐变
        mPaint.setShader(mSweepGradient);
        canvas.drawRect(bitW, bitH, bitW * 2, bitH * 2, mPaint);
}
}

整段代码大约只有一百多行,整体并不复杂,基本通过不同 Shader 的创建与设置,就能直观看到各种图像渲染和渐变效果。如果你对某些参数或绘制结果还有疑问,建议亲自运行代码并修改参数试试看,理解会更深入。

3.本节代码下载:

BitmapShaderDemo.zip

本节小结:

本节主要为大家介绍了 Paint 中另一个非常实用的 API:Shader(图像渲染)。通过它,我们可以轻松实现位图填充、线性渐变、环形渐变、扫描渐变以及混合渲染等效果,让自定义绘图拥有更多表现形式。如果你对示例代码还有不理解的地方,不妨直接复制代码并尝试修改参数,多练几次自然就明白了。好了,本节内容就到这里,谢谢阅读~

来源:https://www.runoob.com/w3cnote/android-tutorial-shader.html
上一篇Canvas API 8.3.16详解与入门实战教程第一部分 下一篇Paint API颜色过滤器ColorFilter详解与使用教程相关文章
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
VMware安装Ubuntu完整教程:创建虚拟机与启动验证
系统平台 · 2026-09-01

VMware安装Ubuntu完整教程:创建虚拟机与启动验证

本教程详细演示如何在VMware中创建Ubuntu虚拟机,涵盖ISO挂载、硬件配置、安装向导及启动验证。通过清晰的步骤与验证命令,帮助新手快速搭建可用的Linux学习环境。

Win10专业版U盘安装教程:制作启动盘与完整安装步骤
系统平台 · 2026-09-01

Win10专业版U盘安装教程:制作启动盘与完整安装步骤

本文提供Win10专业版U盘安装完整流程:准备8GB以上U盘与官方镜像,制作启动盘并核对盘符;通过F12 F11 Esc等快捷键或BIOS设置U盘为第一启动项;安装时选择专业版并谨慎分区;完成后在“设置—系统—关于”验证版本与激活状态。操作前务必备份数据。

Windows10系统字体太小怎么调大
系统平台 · 2026-08-27

Windows10系统字体太小怎么调大

Windows10系统字体太小怎么调大?只需两步:首先打开设置中的显示选项,将缩放比例调整为125%或150%;随后运行ClearType文本调谐器优化字体清晰度。此方法适用于高分屏及普通屏幕,无需修改注册表即可解决界面拥挤问题。

Win10磁盘占用100%基础排查:从监控到清理的完整步骤
系统平台 · 2026-08-27

Win10磁盘占用100%基础排查:从监控到清理的完整步骤

Windows 10系统出现磁盘占用100%会导致电脑卡顿、程序响应缓慢。本文提供基础排查方案:首先通过任务管理器确认是否为磁盘高负载,随后进入系统存储页面分析C盘占用类别,最后针对性清理临时文件。遵循此流程可有效缓解磁盘压力,避免盲目重装系统。

Windows10系统怎么显示此电脑和控制面板
系统平台 · 2026-08-27

Windows10系统怎么显示此电脑和控制面板

Windows10默认可能不显示桌面图标,导致找不到“此电脑”和“控制面板”。只需进入个性化设置,在“桌面图标设置”中勾选对应选项即可恢复。本文提供详细图文步骤,帮助快速找回系统入口。