自定义view改变文字颜色

自定义属性

   <declare-styleable name="changeTextColor">
        <attr name="originalColor" format="color"/>
        <attr name="changeColor" format="color"/>
    </declare-styleable>

package com.example.watchface;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;


import androidx.annotation.Nullable;

public class changeTextColor extends androidx.appcompat.widget.AppCompatTextView {

    public enum DIRECTION {
        LEFT_TO_RIGHT, RIGHT_TO_LEFT
    }

    private DIRECTION direction;
    private int originalColor;
    private int changeColor;
    private Paint mOriginalPaint;
    private Paint mChangePaint;
    private float leftProgress = 0.2f;
    private float rightProgress = 0.2f;

    public changeTextColor(Context context) {
        this(context, null);
    }

    public changeTextColor(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public changeTextColor(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(context, attrs);
        initPaint();
    }

    private void initPaint() {
        mOriginalPaint = getPaintByColor(originalColor);
        mChangePaint = getPaintByColor(changeColor);
    }

    //根据颜色取画笔
    private Paint getPaintByColor(int color) {
        Paint mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(color);
        mPaint.setTextSize(getTextSize());
        return mPaint;
    }

    //初始化属性
    private void initAttrs(Context context, AttributeSet attrs) {
        //        <attr name="originalColor" format="color"/>
        //        <attr name="changeColor" format="color"/>
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.changeTextColor);
        originalColor = a.getColor(R.styleable.changeTextColor_originalColor, originalColor);
        changeColor = a.getColor(R.styleable.changeTextColor_changeColor, changeColor);
        a.recycle();
    }

    //绘制

    @Override
    protected void onDraw(Canvas canvas) {

        String text = getText().toString();
        //求dx
        //先拿到一个矩形
        Rect bound = new Rect();
        mOriginalPaint.getTextBounds(text, 0, text.length(), bound);
        int dx = getWidth() / 2 - getPaddingLeft() - getPaddingRight() - bound.width() / 2;
        //dy也就是基线
        Paint.FontMetrics fontMetrics = mOriginalPaint.getFontMetrics();
        float dy = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
        float baseline = getHeight() / 2 + dy;
        //画的表面颜色
        canvas.drawText(text, dx, baseline, mOriginalPaint);

        //在这里作业一个方法来计算进度值
        int left = (int) (getWidth() * leftProgress);
        int right = (int) (getWidth() * rightProgress);
        //在这里做裁剪
        //对left和right这两个值,我们需要通过方法去动态设置,
        if (direction == DIRECTION.LEFT_TO_RIGHT) {
            // 1.向左滑动的时候将left设置为0,动态改变左边逐渐增加
            canvas.clipRect(0, 0, right, getHeight());
        } else if (direction == DIRECTION.RIGHT_TO_LEFT) {
            //2.向右滑动的时候将right设置最大,动态改变左边让逐渐减小
            canvas.clipRect(getWidth() - left, 0, getWidth(), getHeight());
        }

        //画的底层颜色
        canvas.drawText(text, dx, baseline, mChangePaint);

    }

    public void setDirection(DIRECTION direction) {
        this.direction = direction;
    }


    public void setLeftProgress(float leftProgress) {
        this.leftProgress = leftProgress;
        invalidate();
    }

    public void setRightProgress(float rightProgress) {
        this.rightProgress = rightProgress;
        invalidate();
    }
}


主Activity

package com.example.watchface;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.ValueAnimator;
import android.os.Bundle;
import android.view.View;
import android.view.animation.LinearInterpolator;

public class MainActivity extends AppCompatActivity {

    private changeTextColor ct;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ct = findViewById(R.id.changeText);

        ct.setDirection(changeTextColor.DIRECTION.LEFT_TO_RIGHT);

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);//动画中改变的值
        valueAnimator.setDuration(2000);//设置动画走多长时间
        valueAnimator.setInterpolator(new LinearInterpolator());//匀速
        valueAnimator.setRepeatCount(100);//不循环
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = animation.getAnimatedFraction();
                ct.setRightProgress(value);
            }
        });

        valueAnimator.start();
    }
}

版权声明:本文为weixin_45408679原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。