[关闭]
@wangwangheng 2014-12-08T15:26:49.000000Z 字数 2761 阅读 3376

android 使用LinearGradient进行字体渐变的效果

自定义View


本文转载自android 使用LinearGradient进行字体渐变的效果(cnblogs)

有这么一种效果,一串字符有一束白光从字体上面闪光的效果。如下图显示:

Shimmer

就像上面的显示效果一样一束白光闪过,这种效果主要还是使用了LinearGradient类来进行的LinearGradient也称作线性渲染,LinearGradient的作用是实现某一区域内颜色的线性渐变效果,它有两个构造函数:

  1. public LinearGradient(
  2. float x0, float y0,
  3. float x1, float y1,
  4. int color0, int color1,
  5. Shader.TileMode tile)
  1. public LinearGradient (
  2. float x0, float y0,
  3. float x1, float y1,
  4. int[] colors,
  5. float[] positions,
  6. Shader.TileMode tile);

下面这段代码是直接从git上面的项目拷贝下来的

  1. package com.example.shimmer;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.LinearGradient;
  5. import android.graphics.Matrix;
  6. import android.graphics.Paint;
  7. import android.graphics.Shader;
  8. import android.util.AttributeSet;
  9. import android.widget.TextView;
  10. public class MyTextView extends TextView {
  11. private LinearGradient mLinearGradient;
  12. private Matrix mGradientMatrix;
  13. private Paint mPaint;
  14. private int mViewWidth = 0;
  15. private int mTranslate = 0;
  16. private boolean mAnimating = true;
  17. public MyTextView(Context context, AttributeSet attrs) {
  18. super(context, attrs);
  19. }
  20. @Override
  21. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  22. super.onSizeChanged(w, h, oldw, oldh);
  23. if (mViewWidth == 0) {
  24. mViewWidth = getMeasuredWidth();
  25. if (mViewWidth > 0) {
  26. mPaint = getPaint();
  27. mLinearGradient = new LinearGradient(-mViewWidth, 0, 0, 0,
  28. new int[] { 0x33ffffff, 0xffffffff, 0x33ffffff },
  29. new float[] { 0, 0.5f, 1 }, Shader.TileMode.CLAMP);
  30. mPaint.setShader(mLinearGradient);
  31. mGradientMatrix = new Matrix();
  32. }
  33. }
  34. }
  35. @Override
  36. protected void onDraw(Canvas canvas) {
  37. super.onDraw(canvas);
  38. if (mAnimating && mGradientMatrix != null) {
  39. mTranslate += mViewWidth / 10;
  40. if (mTranslate > 2 * mViewWidth) {
  41. mTranslate = -mViewWidth;
  42. }
  43. mGradientMatrix.setTranslate(mTranslate, 0);
  44. mLinearGradient.setLocalMatrix(mGradientMatrix);
  45. postInvalidateDelayed(50);
  46. }
  47. }
  48. }

这段代码主要是分两步:一个是在onSizeChanged()即大小发生改变的时候,另外一个是onDraw()主要是用来做动画的效果的,首先我们先来看onSizeChanged()里面的代码,在这段代码中主要是定义了LinearGradient:

  1. mLinearGradient = new LinearGradient(
  2. -mViewWidth, 0,
  3. 0, 0,
  4. new int[] { 0x33ffffff, 0xffffffff, 0x33ffffff },
  5. new float[] { 0, 0.5f, 1 },
  6. Shader.TileMode.CLAMP);

这段代码可以这么理解,它定义了一组渐变的数值是{ 0x33ffffff, 0xffffffff, 0x33ffffff},这组数值分别在相对应的0,0.5,1中显示,0位置对应0x33ffffff颜色,0.5位置对应0xffffffff,1位置对应0x33ffffff,这个渐变的初始位置是在手机屏幕的外面x=(-mViewWidth,0)就是屏幕外面.
最后来看一下这个onDraw()方法里面是如何做动画的
mTranslate += mViewWidth / 10;很简单表示每一次运动的递增值

  1. if (mTranslate > 2 * mViewWidth) {
  2. mTranslate = -mViewWidth;
  3. }

这个就是运动结束点,我们把上面画一个如下图

example-picuture

我就把LinearGradient这个比作一个长方形,如上图是初始化的位置在手机屏幕的最左边,要运动到屏幕的最右边就需要2*width的长度。

剩下的方法就是很好理解了,这里不再说明了

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注