您当前的位置: 首页 >  android
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android固定区域内设置文字渐变

沙漠一只雕得儿得儿 发布时间:2020-02-29 16:00:44 ,浏览量:0

文字颜色渐变效果图

下图中那串数字就处于重写的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);

 

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0379s