自定义属性
<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版权协议,转载请附上原文出处链接和本声明。