概述

Android自定义view绘制颜色的时候,可以通过setShader可以让view绘制多彩渐变的效果。Android sdk中提供了五个Shader子类供开发者使用,分别是:LinearGradient线性渐变 SweetGradient角度渐变 RadialGradient辐射渐变 BitmapShader图片shader和ComposeShader组合着色器。本文将结合例子对线性渐变做一个介绍。

LinearGradient 线性渐变

构造函数参数说明

 public LinearGradient(float x0, float y0, float x1, float y1,@ColorInt int color0, @ColorInt int color1,@NonNull TileMode tile)

该构造函数前四个参数代码颜色渐变的起点(x0,y0)和结束点(x1,y1)参数color0与color1代表startColor和endColor。TitleModel 有三个值(CLAMP、MIRROR、REPEAT)代表渐变模式。
列子代码:

 public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],@Nullable float positions[], @NonNull TileMode tile)

该构造函数前四个参数代码颜色渐变的起点(x0,y0)和结束点(x1,y1)参数colors数组代表渐变过度颜色,positions数组代表各过度色的起点位置(浮点类型)。TitleModel 有三个值(CLAMP、MIRROR、REPEAT)代表渐变模式。

例子代码

package com.xol.widget;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;import com.xol.util.CommonUtil;/*** Created by wwzhang on 2019/3/14*/
public class LinearGradientView extends View {private Paint mPaint;private LinearGradient mLinearGradient;private int mWidthNum = 3;private int mHeightNum = 3;private int[] colorThree;private int[] colorTwo;private int mSpace;private float mWidth = 0;private float mRectRadius = 5;private String mContentText = "非淡泊无以明智,非宁静无以致远";public LinearGradientView(Context context) {super(context);}public LinearGradientView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public LinearGradientView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}{mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setStyle(Paint.Style.FILL);mPaint.setTextSize(CommonUtil.sp2px(16, getContext()));mRectRadius = CommonUtil.dp2px(mRectRadius, getContext());colorThree = new int[]{Color.parseColor("#ff0000"),Color.parseColor("#00ff00"),Color.parseColor("#0000ff")};colorTwo = new int[]{Color.parseColor("#ff0000"),Color.parseColor("#0000ff")};mSpace = (int) CommonUtil.dp2px(2, getContext());mPaint.setColor(Color.parseColor("#AAAAAA"));}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawLinearRound(canvas);}public void drawLinearRound(Canvas canvas) {//绘制两色渐变int rectHeight = (int) CommonUtil.dp2px(20, getContext());int space = 10;//水平clampmLinearGradient = new LinearGradient(0, 0, getMeasuredWidth() / 2,0, colorTwo[0], colorTwo[1], Shader.TileMode.CLAMP);mPaint.setShader(mLinearGradient);canvas.drawRect(0, 0 + space, getMeasuredWidth(), rectHeight + space, mPaint);// 水平mirrormLinearGradient = new LinearGradient(0, 0, getMeasuredWidth() / 2,0, colorTwo[0], colorTwo[1], Shader.TileMode.MIRROR);mPaint.setShader(mLinearGradient);canvas.drawRect(0, rectHeight + space * 2, getMeasuredWidth(),(rectHeight << 1) + space * 2, mPaint);//水平repeatmLinearGradient = new LinearGradient(0, 0, getMeasuredWidth() / 2,0, colorTwo[0], colorTwo[1], Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);canvas.drawRect(0, (rectHeight << 1) + space * 3, getMeasuredWidth(),(rectHeight << 1) + rectHeight + space * 3, mPaint);//对角线mirror渐变mLinearGradient = new LinearGradient(0, 0, 20, 20,colorTwo[0], colorTwo[1], Shader.TileMode.MIRROR);mPaint.setShader(mLinearGradient);canvas.drawRect(0, (rectHeight << 1) + rectHeight + space * 4, getMeasuredWidth(),(rectHeight << 2) + space * 4, mPaint);//计算if (mWidth < 5) {mWidth = (getMeasuredWidth() - (mWidthNum + 1) * mSpace) / mWidthNum;mHeightNum = (int) (getMeasuredHeight() - CommonUtil.dp2px(120, getContext()) / mWidth);}//绘制三色渐变int count = 0;RectF rectF = new RectF();for (int i = 0; i < mHeightNum; i++) {rectF.top = i * mWidth + (i + 1) * mSpace + (int) CommonUtil.dp2px(120, getContext());rectF.bottom = rectF.top + mWidth;for (int j = 0; j < mWidthNum; j++) {rectF.left = j * mWidth + (j + 1) * mSpace;rectF.right = rectF.left + mWidth;count++;if (count > 9) {break;}switch (count) {case 1:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top + (rectF.bottom - rectF.top) / 2, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);break;case 2:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top + (rectF.bottom - rectF.top) / 2, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.MIRROR);mPaint.setShader(mLinearGradient);break;case 3:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top + (rectF.bottom - rectF.top) / 2, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.CLAMP);mPaint.setShader(mLinearGradient);break;case 4:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);break;case 5:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.MIRROR);mPaint.setShader(mLinearGradient);break;case 6:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.left + (rectF.right - rectF.left) / 2, rectF.top, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.CLAMP);mPaint.setShader(mLinearGradient);break;case 7:mLinearGradient = new LinearGradient(rectF.left, rectF.top,rectF.right, rectF.bottom, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);break;case 8:mLinearGradient = new LinearGradient(rectF.left, rectF.bottom,rectF.right, rectF.bottom, colorThree,new float[]{0.0f, 0.66f, 1.0f}, Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);break;case 9:mLinearGradient = new LinearGradient(rectF.left, rectF.bottom,rectF.right, rectF.bottom, colorThree,new float[]{0.5f, 0.75f, 1.0f}, Shader.TileMode.REPEAT);mPaint.setShader(mLinearGradient);break;default:break;}canvas.drawRoundRect(rectF, mRectRadius, mRectRadius, mPaint);}}}
}

布局文件引入

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.xol.widget.LinearGradientViewandroid:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>

运行结果:

线性渐变文字效果实现

闪动的文字

实现原理,通过matrix水平移动线性shader开始的位置,达到文字闪动的效果

歌词逐字变色效果

实现原理,通过设置线性shader的变色位置,实现文字的逐渐变色。
示例代码:

package com.xol.widget;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;import com.xol.util.CommonUtil;/*** Created by wwzhang on 2019/3/18*/
public class LinearGradientTextView extends View implements Runnable {private Paint mPaint;private Matrix mMatrix;private String mText;private LinearGradient mLinearGradient;private long mDuration = 50;private int mTransX = 0;private Rect rect = new Rect();private LinearGradient mKrcLinearGradient;private float[] mfKrc = new float[2];private String mSingText;private Paint mSingPaint;public LinearGradientTextView(Context context) {super(context);}public LinearGradientTextView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public LinearGradientTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}{mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mSingPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mMatrix = new Matrix();mText = "疏疏晴雨弄斜阳,凭栏久,墙外杏花香";mSingText = "很爱很爱你所以愿意,不牵绊你";mPaint.setTextSize(CommonUtil.dp2px(16, getContext()));mSingPaint.setTextSize(CommonUtil.dp2px(16, getContext()));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (null == mLinearGradient) {mLinearGradient = new LinearGradient(0, 0, 200, 0,new int[]{Color.parseColor("#440000"),Color.parseColor("#ffffff"),Color.parseColor("#440000")},new float[]{0.0f, 0.5f, 1.0f}, Shader.TileMode.CLAMP);mLinearGradient.setLocalMatrix(mMatrix);mPaint.setShader(mLinearGradient);mfKrc[0] = 0.0f;mfKrc[1] = 0.0f;mKrcLinearGradient = new LinearGradient(0, 0, getMeasuredWidth(), 0, new int[]{Color.parseColor("#ff0000"),Color.parseColor("#ffffff")},mfKrc,Shader.TileMode.CLAMP);mSingPaint.setShader(mKrcLinearGradient);postDelayed(this, mDuration);}mPaint.getTextBounds(mText, 0, mText.length(), rect);canvas.drawText(mText, 0, rect.bottom - rect.top, mPaint);canvas.drawText(mSingText, 0, getMeasuredHeight() / 2, mSingPaint);}@Overridepublic void run() {mTransX += 10;if (mTransX > rect.right - rect.left) {mTransX = -10;}mfKrc[0] += 0.01f;mfKrc[1] = mfKrc[0];if (mfKrc[0] > 1.0f) {mfKrc[0] = 0.0f;mfKrc[1] = 0.0f;}mKrcLinearGradient = new LinearGradient(0, 0, getMeasuredWidth(), 0, new int[]{Color.parseColor("#ff0000"),Color.parseColor("#ffffff")},mfKrc,Shader.TileMode.CLAMP);mSingPaint.setShader(mKrcLinearGradient);mMatrix.setTranslate(mTransX, 0);mLinearGradient.setLocalMatrix(mMatrix);invalidate();postDelayed(this, mDuration);}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.xol.widget.LinearGradientTextViewandroid:background="#888888"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>

代码运行效果


希望对您有所帮助!

Android LinearGradient的使用相关推荐

  1. android lineargradient 方向,Android LinearGradient和奇怪的相对定位

    我有以下代码和LinearGradient,它与其他所有示例看起来非常相似. public class CustomColourBar extends View { public CustomColo ...

  2. Android LinearGradient线性渐变

    1 linearGradient简介 linearGradient线性渐变,会用到Paint的setShader,Shader 被称为着色器,在opengl中这个概念经常被用到,android中的sh ...

  3. android LinearGradient和RadialGradient

    LinearGradient和RadialGradient LinearGradient LinearGradient是用来实现线性渐变效果 1.此类是Shader的子类 LinearGradient ...

  4. Paint画笔Shader之LinearGradient的用法

    参数讲解 /** Create a shader that draws a linear gradient along a line. 创建一个shader绘制一条线@param x0 The x-c ...

  5. Android 颜色渲染(五) LinearGradient线性渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色处理(五) LinearGradient线性渲染 相信很多人都看过歌词同步的效果, 一是竖直方向的滚动,另一方面是水平方面的歌 ...

  6. Android开发 之 LinearGradient与闪动文字效果

    LinearGradient与闪动文字效果 转自:http://blog.csdn.net/harvic880925/article/details/52350154 这篇就给大家讲setShader ...

  7. Android绘图之LinearGradient线性渐变(9)

    Android 绘图学习 android绘图之Paint(1) android绘图之Canvas基础(2) Android绘图之Path(3) Android绘图之drawText绘制文本相关(4) ...

  8. 【Android UI】Paint Gradient 渐变渲染 ① ( LinearGradient 线性渐变渲染 | 设置渲染方向 | 设置渲染颜色 | 设置渲染模式 | MIRROR )

    文章目录 一.LinearGradient 线性渐变渲染 1.设置 2 个颜色的渐变 3.设置多个颜色的渐变 二.LinearGradient 线性渐变渲染重要参数分析 1.正常渲染 2.设置多个渐变 ...

  9. Android 颜色渲染 LinearGradient线性渲染

    转载地址 LinearGradient我们可以将之译为线型渐变.线型渲染等,译成什么不重要,重要的是它的显示效果是什么样子,今天我们就一起来看看. 先来看看LinearGradient的构造方法: [ ...

最新文章

  1. 软件测试可分为哪几种
  2. const的使用CC++
  3. mysql 查询if语句执行顺序_MySQL 语句的执行顺序
  4. php怎么读,php 怎么读写文件?
  5. python安装django模块_在您的(Django)项目中使用setup.py
  6. Python os.path() 模块os.path.exists()
  7. 电脑文件备份到哪里最安全?
  8. 可能是最简单暴力的卸载工具Geek Uninstaller
  9. mysql 修改 frm_高性能MySQL:只修改.frm 文件
  10. AMD EPYC架构
  11. 嵌入式了解 以及学习路线
  12. 嵌入式设备交叉编译perf性能分析工具
  13. Java后台+微信公众号红包发放实现
  14. AGV调度:路径规划
  15. 编码:UTF-8编码、UTF-16编码规则
  16. 何为有效市场假说及其形态、意义、启示
  17. 一个快速批量查询快递物流数据的小工具,可同时多种快递物流信息跟踪查件
  18. java输入名字和语句_java键盘输入语句怎么写
  19. OpenFOAM——过渡管中的湍流
  20. Lora远程读取200smart VW寄存器数据

热门文章

  1. 关于tiktok参数msToken,X-Bogus,_signature生成
  2. 转转闲鱼后台源码搭建教程
  3. windows个人电脑上用vmware作为宿主机制作qcow2镜像
  4. chrome python插件_5款Chrome插件,第1款绝对良心!
  5. Operator——Redis之重启虚拟机后无法重建集群
  6. 2021年电工(初级)考试内容及电工(初级)考试技巧
  7. 阿里取消“P”序列职级显示引发热议
  8. 公众号引流的最快方法是什么?当下有个红利期!
  9. 安装ROS-Academy-for-Beginners教学包
  10. 【MEF:GAN:注意力机制】