IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 一个TextView显示2中颜色(动态变色) -> 正文阅读

[移动开发]一个TextView显示2中颜色(动态变色)

之前写了一次静态的颜色,这次加上动画效果。

先上效果:

?

自定义view:GradientColorDynamicTextView?


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

import androidx.annotation.Nullable;

/**
 * 动态的 改变颜色
 */
public class GradientColorDynamicTextView extends androidx.appcompat.widget.AppCompatTextView {

    // 当前朝向
    private Direction mDirection = Direction.LEFT_TO_RIGHT;
    // 绘制的朝向枚举
    public enum Direction {
        LEFT_TO_RIGHT, RIGHT_TO_LEFT
    }

    //2根画笔
    Paint mOriginalPaint;//原始颜色
    Paint mChangePaint;//改变后的颜色

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

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

    public GradientColorDynamicTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mOriginalPaint = new Paint();
        mOriginalPaint.setAntiAlias(true);
        mOriginalPaint.setTextSize(getTextSize());

        mChangePaint = new Paint();
        mChangePaint.setAntiAlias(true);
        mChangePaint.setTextSize(getTextSize());
    }

    //默认不绘制
    float mCurrentProgress = 0f;

    @Override
    protected void onDraw(Canvas canvas) {
        //默认是从左到右
        //获取文字的宽带
        String text = getText().toString();
        Rect bound = new Rect();
        mOriginalPaint.getTextBounds(text,0,text.length(),bound);

        //文字的开始位置的x坐标
        int originStartX = (getWidth()-bound.width())/2;

        //左边的宽度,根据progress给左边变色
        int leftWidth=0;
        if(mDirection.equals(Direction.LEFT_TO_RIGHT)){
            mOriginalPaint.setColor(Color.RED);
            mChangePaint.setColor(Color.GRAY);
            //获取左边的宽度
            leftWidth = (int) (getWidth() * mCurrentProgress);
        }else {
            mOriginalPaint.setColor(Color.GRAY);
            mChangePaint.setColor(Color.RED);
            //获取左边的宽度
            leftWidth = (int) (getWidth() * (1-mCurrentProgress));
        }
        //左边
        canvas.save();
        Rect rectLeft = new Rect(0,0,leftWidth,getHeight());
        canvas.clipRect(rectLeft);
        //计算绘制origin的y坐标(baseline) 可复用
        Paint.FontMetrics fontMetrics = mOriginalPaint.getFontMetrics();
        float baseline = (getHeight()-fontMetrics.top-fontMetrics.bottom) / 2;
        //canvas.save后,draw的时候,只会在clip出的区域绘制
        canvas.drawText(text, originStartX, baseline, mOriginalPaint);
        canvas.restore();

        //右边,clip的右边区域
        canvas.save();
        Rect rectRight = new Rect(leftWidth,0,getWidth(),getHeight());
        canvas.clipRect(rectRight);
        //canvas.save后,draw的时候,只会在clip出的区域绘制
        canvas.drawText(text, originStartX, baseline, mChangePaint);
        canvas.restore();
    }

    public void setCurrentProgress(float progress){
        mCurrentProgress = progress;
        invalidate();
    }

    /**
     * 设置方向
     * @param direction
     */
    public void setDirection(Direction direction){
        mDirection = direction;
    }

}

布局文件 gradient_tv_color :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
    <com.test.viewtest.GradientColorDynamicTextView
        android:layout_marginTop="20dp"
        android:id="@+id/gcdt"
        android:padding="04dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="陕西省西安市雁塔区" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="从左到右"
        android:onClick="changeLeftToRight"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="从右到左"
        android:onClick="changeRightToLeft"/>

</LinearLayout>

?Activity的使用:GradientColorTextViewActivity


public class GradientColorTextViewActivity extends AppCompatActivity {

    private GradientColorDynamicTextView gcdt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gradient_tv_color);
         gcdt = findViewById(R.id.gcdt);
    }

    public void changeLeftToRight(View view) {
        gcdt.setDirection(GradientColorDynamicTextView.Direction.LEFT_TO_RIGHT);
        @SuppressLint("ObjectAnimatorBinding")
        ObjectAnimator objectAnimator  =  ObjectAnimator.ofFloat(gcdt,"progress",0,1f);
        objectAnimator.setDuration(2000).start();
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float progress = (float) animation.getAnimatedValue();
                gcdt.setCurrentProgress(progress);
            }
        });
    }

    public void changeRightToLeft(View view) {
        gcdt.setDirection(GradientColorDynamicTextView.Direction.RIGHT_TO_LEFT);
        @SuppressLint("ObjectAnimatorBinding")
        ObjectAnimator objectAnimator  =  ObjectAnimator.ofFloat(gcdt,"progress",0,1f);
        objectAnimator.setDuration(2000).start();
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float progress = (float) animation.getAnimatedValue();
                gcdt.setCurrentProgress(progress);
            }
        });
    }
}

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:23:57  更:2021-10-09 16:25:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:58:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码