转自:https://www.jianshu.com/p/02b02c1696b2

Paint的Gradient的用法

嗯哼嗯哼嗯哼嗯哼 关注

2017.07.04 15:45* 字数 173 阅读 46评论 0喜欢 0

Paint的Gradient的用法

shader的基本介绍
  1. shader是一个在绘制的过程中能够水平的平分颜色的一个基类,通过Shader的子类的实现来给Paint设置Shader,设置过之后,绘制任何对象时都会带着这个Shader的颜色。
BitmapShader
  1. 这是一个非常有用的类,下面我会介绍一些这个类的基本的用法,中间会包括一些Shader的基本用法,都在这个介绍类的里面了,下面可 is hi,我们首先看看这个类的构造函数,然后直接使用,看看会有什么奇妙的东西发生。这个Shader作为纹理被用来绘制Bitmap看看构造方法.
  • REPEAT

    1. mRect = new RectF(0,0,200,200);
    2. mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
    3. BitmapShader shader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    4. mPaint.setShader(shader);
    5. canvas.drawRect(0,0,getWidth(),getHeight() ,mPaint);
 
paint_3_shader_1.png
  1. 根据图片,我们看到绘制出来的不是单独的的一张照片,而是单张照片的重复,这就涉及到在上面的代码中,我们没有提到的Shader.TileMode这个内部类。这个类内部有三个值,分别是CLAMPREPEATMIRROR
  2. 其中CLAMP代表的是重复绘制这个Shader的边缘的像素,当超出这个Shader的原始界限的时候,REPEAT就是重复,MIRROR就是镜像。这个三个值的不用多说,看看代码的效果就明白了。

上代码:

  • CLAMP

    1. mRect = new RectF(0,0,200,200);
    2. mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
    3. BitmapShader shader = new BitmapShader(mBitmap,Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    4. mPaint.setShader(shader);
    5. canvas.drawRect(0,0,getWidth(),getHeight() ,mPaint);
 
paint_3_shader_2.png
  • MIRROR

    1. mRect = new RectF(0,0,200,200);
    2. mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
    3. BitmapShader shader = new BitmapShader(mBitmap,Shader.TileMode. MIRROR, Shader.TileMode. MIRROR);
    4. mPaint.setShader(shader);
    5. canvas.drawRect(0,0,getWidth(),getHeight() ,mPaint);
 
paint_3_shader_3.png
  1. 解释一下构造方法:
  2. BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
  3. bitmap:就是你给这个BitmapShader设置的图片
  4. tileX:就是当这个Shader超出这个图像的原始的边界的时候,给这个Shader设置的X轴方向的拉伸规则
  5. tileY:同理上面的tileX
Matrix
  1. 下面再来一个比较有点意思的类,Matrix,矩阵。Matrix是一个为了转换坐标持有一个3*3的矩阵的一个类。因为这里是在Shader的知识里面,我们就介绍一点基本知识就行,Matrix的构造方法没什么要看的,大家一看就明白,分别是Matrix(),Matrix(Matrix src)然后看看他的setScale(float sx, float sy)方法,sxsy分别表示XY轴的缩放比例。我们在ShadersetLocalMatrix (Matrix localM)里面会用到矩阵的变换,那么

上代码:

  1. BitmapShader shader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
  2. Matrix matrix = new Matrix();
  3. matrix.setScale(1.5f,0.5f);
  4. shader.setLocalMatrix(matrix);
  5. mPaint.setShader(shader);
  6. canvas.drawRect(0,0,getWidth(),getHeight() ,mPaint);
 
paint_3_shader_4.png
  1. 从上面的图可以看出,X轴放大了1.5倍,Y轴缩小了0.5
  2. 下面我们接着看看Matrix的其它方法setTranslate(float dx, float dy),设置 矩阵沿着XY轴分别平移dxdydx为正,图片就右移,反之左移,dy为正图片下移,反之上移

上代码:

  1. BitmapShader shader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
  2. Matrix matrix = new Matrix();
  3. matrix.setTranslate(50,50);
  4. shader.setLocalMatrix(matrix);
  5. mPaint.setShader(shader);
  6. canvas.drawRect(0,0,getWidth(),getHeight() ,mPaint);
 
paint_3_shader_5.png
  1. setRotate(float degrees),设置矩阵围绕着原点旋转degrees度。
  2. setSkew(float kx, float ky),设置矩阵的XY方向的倾斜度。
  3. 这两个方法,我就不运行了,大家自己试一下。
  4. 好了,到这里我就把BitmapShader介绍的差不多了,也介绍了ShadersetLocalMatrix(matrix)方法
  5. 顺便说了一点Matrix类,下面回归主题,看看其它的Shader的子类。
LinearGradient
  1. 线性渐变,比较简单,把构造方法弄明白就行了
  2. LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
  3. x0,y0,x1,y1 : 代表这个颜色变化的起点位置和终点位置
  4. colors: 是颜色的变化的范围
  5. positions :是每个颜色的在总变化的范围所占的所有的值加起来等于1 。类似于权重,可以为null,为null的话就是每个颜色所占的比重相同
  6. tile:是这个图形的拉伸规则,参看BitmapShader

上代码:

  1. LinearGradient gradient = new LinearGradient(0,200,200,200,new int[]{Color.RED,Color.YELLOW,Color.GREEN},null, Shader.TileMode.CLAMP);
  2. mPaint.setShader(gradient);
  3. canvas.drawRect(0,0,getWidth(),getHeight(),mPaint);
 
paint_3_shader_6.png
RadialGradient
  1. 径向渐变,直接看
  2. RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
  3. centerXcenterYradius,是画圆的三个要素,中心坐标加半径。
  4. colors:是颜色的变化范围
  5. stops:这个数组里面的数对应的是颜色的变化范围到什么位置停止,就是这个数组如果
  6. 是{0.1f,0.2f,0.3f},假设colors是{Color.RED,Color.YELLOW,Color.GREEN
  7. 那么红色的变化范围是00.1,黄色的变化0.1f~0.2f,绿色作为最后一个颜色,会自动
  8. 填充到1.0f

上代码:

  1. RadialGradient gradient = new RadialGradient(200,200,100,new int[]{Color.RED,Color.YELLOW,Color.GREEN},new float[]{0.1f,0.2f,0.3f}, Shader.TileMode.REPEAT);
  2. mPaint.setShader(gradient);
  3. canvas.drawRect(0,0,getWidth(),getHeight(),mPaint);
 
paint_3_shader_7.png
SweepGradient
  1. 扫描渐变
  2. SweepGradient(float cx, float cy, int[] colors, float[] positions)
  3. cx:扫描渐变的中心点的X轴的坐标
  4. cy:扫描渐变的中心点的Y轴的坐标
  5. colors:渐变的颜色的范围
  6. position:渐变的颜色数组对应的渐变的位置

上代码:

  1. SweepGradient gradient = new SweepGradient(200,200,new int[]{Color.RED,Color.YELLOW,Color.GREEN,Color.CYAN},null);
  2. mPaint.setShader(gradient);
  3. canvas.drawCircle(200,200,100,mPaint);
 
paint_3_shader_8.png
ComposeShader
  1. 组合渐变,就是通过Xfermode或者PorterDuff.Mode的方式结合两种Shader,这个类
  2. 的重点就在于结合的方式,具体的两个类,请大家参看我的其它文章。
  3. 下面我们直接看一下代码
  4. BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
  5. LinearGradient linearGradient = new LinearGradient(0,200,200,200,new int[]{Color.RED,Color.YELLOW,Color.GREEN},null, Shader.TileMode.CLAMP);
  6. ComposeShader composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.OVERLAY);
  7. mPaint.setShader(composeShader);
  8. canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
 
paint_3_shader_9.png

好了,这篇文章就到此结束了。

小礼物走一走,来简书关注我

Paint的Gradient的用法(转)的更多相关文章

  1. 自定义控件详解(四):Paint 画笔路径效果

    Paint  画笔 ,即用来绘制图形的"笔" 前面我们知道了Paint的一些基本用法: paint.setAntiAlias(true);//抗锯齿功能 paint.setColo ...

  2. 【Android】21.2 2D图形图像处理(Canvas和Paint)

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...

  3. Android遍历API (1) 动画篇——克隆动画AnimationCloning

    从我学Android开始,一直就想做一件事.就是好好把APIDemo看一遍.今天开始会抽时间把Android官方的APIDemo程序全部过一遍.主要是为了两个目的:第一,复习以前学习的API用法.第二 ...

  4. Android 圆形图片加白边加阴影

    /** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...

  5. Android Animation学习(四) ApiDemos解析:多属性动画

    Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...

  6. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  7. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  8. Android 用属性动画自定义view的渐变背景

    自定义view渐变背景,同时监听手势自动生成小圆球. 宿主Activity如下: package com.edaixi.tempbak; import java.util.ArrayList; imp ...

  9. Android Animation学习(二) ApiDemos解析:基本Animatiors使用

    Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...

随机推荐

  1. 第三节 基本数据写入 --------增加&查询

    启动mongodb服务 net start mongodb 链接mongodb  进入bin目录 mongo 127.0.0.1:12345 启动连接 show dbs   显示所有的数据库 use ...

  2. centos6.5 相关命令

    挂载U盘 1.进入mnt目录: #cd /mnt 2.新建一个USB目录: #mkdir usb 3.查看U盘的目录: #fdisk –l 4.挂载: #mount –t vfat /dev/sdb1 ...

  3. toj 4061 矩阵攻击(最大独立集)

    题目: 给定一个01 矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置 (x,y) 都可以按照“日”字攻击其周围八个位置(x−1,y−2),(x−2,y−1),(x+1,y−2),(x+2,y− ...

  4. Codeforces 803F - Coprime Subsequences(数论)

    原题链接:http://codeforces.com/contest/803/problem/F 题意:若gcd(a1, a2, a3,...,an)=1则认为这n个数是互质的.求集合a中,元素互质的 ...

  5. Codeforces 837D--Round Subset (DP)

    原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...

  6. 【Linux】grep显示匹配行的上下几行的用法

    打印匹配行的前后5行 grep -5 ‘something’ file 打印匹配行的前后5行 grep -C 5 ‘something’ file 打印匹配行的后5行 grep -A 5 ‘somet ...

  7. 10.14 socket 网络编程

    简单的例子 socket客户端 import socket client = socket.socket() #声明socket类型,同时生成socket连接对象 client.connect(('l ...

  8. MIS(管理信息系统)

    MIS 管理信息系统(Management Information System,简称MIS) 是一个以人为主导,利用计算机硬件.软件.网络通信设备以及其他办公设备,进行信息的收集.传输.加工.储存. ...

  9. 学习React之前你需要知道的的JavaScript基础知识

    在我的研讨会期间,更多的材料是关于JavaScript而不是React.其中大部分归结为JavaScript ES6以及功能和语法,但也包括三元运算符,语言中的简写版本,此对象,JavaScript内 ...

  10. jsp的课设1

    记这个为了巩固整个网站的开发流程,java开发太昂贵基本上很少有公司用,不知道学校怎么想的用这个.基本流程适用于任何后台的开发. JDK的安装不提了,Tomcat和Mysql都是用的最新版的,由于是w ...