文字颜色渐变效果图
下图中那串数字就处于重写的TextView中,由于渐变效果设置的不明显,这里设置为红色,实际看的效果看会比较明显,
看到最后一行文字,在listview滚动时,那行文字的效果一直是渐变效果。下面我们有两种实现方式:
实现方式一:自定义渐变色的textview,但是需要自己动态判断哪些item设置,哪些item清除渐变色根据listview的onscroll回调会有第一个和最后一个item的位置,据此来判断当前的最后一条textView设置为渐变色,渐变色的自定义textView如下:
package com.gala.video.app.oprlive.epg.news;
import android.content.Context;
import android.graphics.LinearGradient;
import android.graphics.Shader;
import android.util.AttributeSet;
public class LiveAINewsGradientTextView extends TextView {
public static final int HORIZONTAL = 1;
public static final int VERTICAL = 2;
private int direction = VERTICAL;
public LiveAINewsGradientTextView(Context context) {
super(context);
}
public LiveAINewsGradientTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LiveAINewsGradientTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setTextViewGradient(int fromColor, int toColor) {
updateGradient(fromColor, toColor);
invalidate();
}
public void clearTextViewGradient() {
if (mPaint == null) {
return;
}
mPaint.setShader(null);
invalidate();
}
private void updateGradient(int fromColor, int toColor) {
if (mPaint == null) {
return;
}
if (direction == HORIZONTAL) {
float width = mPaint.measureText(getText().toString());
LinearGradient mLinearGradient = new LinearGradient(0, 0, width, 0, fromColor, toColor, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
} else if (direction == VERTICAL) {
LinearGradient mLinearGradient = new LinearGradient(0, 0, 0, getHeight(), fromColor, toColor, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
}
}
}
上面的自定义textView是渐变色的,我们需要判断最后一个item的位置信息来动态的setTextViewGradient和clearTextViewGradient,
例如:在这个回调中获取最后一个item的位置信息:
@Override
public void onScroll(ViewParent parent, int firstAttachedItem, int lastAttachedItem, int totalItemCount) {
...
...
当然,这种方式需要动态判断设置item的位置,会增加不少逻辑代码,比较麻烦,下面介绍第二种方式,在固定区域内设置这个渐变色,也就是只要在这个区域内的text都会产生渐变。
实现方式二:在固定区域,利用canvas画布来设置文字渐变色:例如在我们自己的view内,重写onDraw或者dispatchDraw方法:
private int mHeightFadingEdge;
private Paint mPaintFadingEdge;
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mPaintFadingEdge == null) {
mHeightFadingEdge = ResourceUtil.getDimensionPixelSize(R.dimen.dimen_107dp);
mPaintFadingEdge = new Paint();
mPaintFadingEdge.setStyle(Paint.Style.FILL);
mPaintFadingEdge.setDither(true);
mPaintFadingEdge.setAntiAlias(true);
mPaintFadingEdge.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
LinearGradient shaderFadingEdge = new LinearGradient(0, 0, 0, mHeightFadingEdge,
0x0FFFF0000, 0x00FF0000, Shader.TileMode.CLAMP);
mPaintFadingEdge.setShader(shaderFadingEdge);
}
final int saveCount = canvas.save();
canvas.translate(200, 850);//画布移动到相应的位置上
Log.e("buder", "dispatchDraw");
canvas.drawRect(0, 0 , mProgramListView.getWidth(), mHeightFadingEdge, mPaintFadingEdge);//具体位置上画布叠加的区域
canvas.restoreToCount(saveCount);
}
如果有黑乎乎的背景的话,还需要设置下硬件加速:
setLayerType(LAYER_TYPE_HARDWARE, null);