public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, TileMode tile) { throw new RuntimeException("Stub!"); } public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, TileMode tile) { throw new RuntimeException("Stub!"); }
x0,y0是起始 的渐变点坐标,x1 ,y1 是结束渐变点坐标,color0是起始颜色,color1是终止颜色,tile填充模式,colors是对应的颜色数值,position与渐变颜色相对应,取值是0到1 的float类型数据,表示每种颜色在整条渐变线中的百分比位置
示例代码:
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.*; import android.util.AttributeSet; import android.view.View; public class LinearGradientView extends View { private Paint mPaint; public LinearGradientView(Context context, AttributeSet attrs) { super(context, attrs); setLayerType(LAYER_TYPE_SOFTWARE, null); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /** * 双色渐变 */ // mPaint.setShader(new LinearGradient(0,getHeight()/2,getWidth(),getHeight()/2,0xffff0000,0xff00ff00, Shader.TileMode.CLAMP)); // canvas.drawRect(0,0,getWidth(),getHeight(),mPaint); /** * 多色渐变 */ int[] colors = {0xffff0000,0xff00ff00,0xff0000ff,0xffffff00,0xff00ffff}; float[] pos = {0f,0.2f,0.4f,0.6f,1.0f}; LinearGradient multiGradient = new LinearGradient(0,getHeight()/2,getWidth(),getHeight()/2,colors,pos, Shader.TileMode.CLAMP); mPaint.setShader(multiGradient); canvas.drawRect(0,0,getWidth(),getHeight(),mPaint); /** * 多色渐变文字 */ // int[] colors = {0xffff0000, 0xff00ff00, 0xff0000ff, 0xffffff00, 0xff00ffff}; // float[] pos = {0f, 0.2f, 0.4f, 0.6f, 1.0f}; // LinearGradient multiGradient = new LinearGradient(0, 0, getWidth()/2, getHeight()/2, colors, pos, Shader.TileMode.MIRROR); // mPaint.setShader(multiGradient); // mPaint.setTextSize(50); // canvas.drawText("欢迎学习", 0, getHeight()/2, mPaint); } }
package com.loaderman.customviewdemo; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.*; import android.util.AttributeSet; import android.widget.TextView; public class ShimmerTextView extends TextView { private Paint mPaint; private int mDx; private LinearGradient mLinearGradient; public ShimmerTextView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = getPaint(); int length = (int) mPaint.measureText(getText().toString()); createAnim(length); createLinearGradient(length); } private void createAnim(int length) { ValueAnimator animator = ValueAnimator.ofInt(0, 2 * length); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { mDx = (Integer) animation.getAnimatedValue(); postInvalidate(); } }); animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatCount(ValueAnimator.INFINITE); animator.setDuration(2000); animator.start(); } private void createLinearGradient(int length) { mLinearGradient = new LinearGradient(-length, 0, 0, 0, new int[]{ getCurrentTextColor(), 0xff00ff00, getCurrentTextColor() }, new float[]{ 0, 0.5f, 1 }, Shader.TileMode.CLAMP ); } @Override protected void onDraw(Canvas canvas) { Matrix matrix = new Matrix(); matrix.setTranslate(mDx, 0); mLinearGradient.setLocalMatrix(matrix); mPaint.setShader(mLinearGradient); super.onDraw(canvas); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:background="@android:color/white" android:gravity="center" android:orientation="vertical"> <com.loaderman.customviewdemo.LinearGradientView android:layout_width="match_parent" android:layout_height="200dp" /> <com.loaderman.customviewdemo.ShimmerTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="嗯哈 loaderman" /> </LinearLayout>
效果: