重学 Android 自定义 View 系列(四):文字变色

Android 歌词滚动效果(歌词逐个与逐渐变色)可换行 前言: 最近公司要求实现一个 讯飞语音阅读文字,文字根据阅读速度逐个变色的功能。先上个图看下效果。 (由于工作非常紧张,所以就把测试的图贴过来了,兄弟们将就看) 直接上代码: ColorTrackView.java(主要就是这个自定义控件) import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.gra.. 阅读详情

目标

通过 ColorTrackTextView 来展示一种文字进度条效果,其中一部分文本以原始颜色显示,另一部分文本以目标颜色显示,随着进度的变化,逐步改变文字颜色的展示。

最终效果如下:
在这里插入图片描述

1. 结构分析


  • 文本显示:该控件将展示文本内容,文本的颜色随着进度的变化而变化。
  • 进度条效果:文本的颜色变化会基于一个进度值(0f 到 1f),从一个颜色(原始颜色)逐渐过渡到另一个颜色(目标颜色)。
  • 支持方向:文本颜色的过渡可以是从左到右,也可以是从右到左。

2. 实现思路


  1. 初始化画笔:我们需要两个画笔,分别绘制未变化的颜色和变化后的颜色。
  2. 计算绘制位置:根据进度计算文本的变化区间和显示位置。
  3. 剪切区域:使用 canvas.clipRect() 来控制不同进度下文本显示的区域。
  4. 动态更新进度:通过设置进度值并调用 invalidate() 来刷新视图,使文本颜色过渡。

3. 关键技术点解析


我们用到了 Canvas 类的几个重要方法,特别是 clipRect()、save() 和 restore()。这些方法对于自定义绘制文本的效果至关重要。

自定义 TextView:通过继承 AppCompatTextView 来创建自定义控件。利用系统原有的属性,可以省去一些步骤

canvas.clipRect()

功能
canvas.clipRect() 方法用于限制 Canvas 上绘制内容的区域,即设置一个矩形区域作为画布的可绘制区域,只有在这个区域内的绘制操作才会被执行,超出该区域的部分会被裁剪掉。

因为我们要达到的目标是一个文字两种颜色,两种颜色需要分别绘制,因为不可能只绘制部分字体,这里使用 canvas.clipRect() 的目的就是把裁剪区域外的字体扔掉。也可以理解为 clipRect 就是一个剪刀。

方法

public void clipRect(int left, int top, int right, int bottom);
public void clipRect(Rect rect);
public void clipRect(float left, float top, float right, float bottom);

接受一个 Rect 对象 或四个坐标,直接定义裁剪矩形的区域。

canvas.save()

canvas.save() 会将当前的画布状态(包括变换矩阵、剪裁区域、画笔、绘制属性等)保存到栈中。这样,之后对画布的操作就不会影响到原本的画布状态,保证每次的绘制操作都是局部的。相当于记录个快照。

方法

public int save();
public int save(int saveFlags);

保存当前画布的状态。带有标志位参数,可以指定保存哪些部分的状态,例如是否保存剪切区域、变换矩阵等。常用的标志位是 Canvas.ALL_SAVE_FLAG(保存所有状态)。

canvas.restore()

canvas.restore() 方法用于恢复上次保存的画布状态。你可以在绘制过程中做一些修改(如变换矩阵、裁剪区域等),然后恢复到之前的状态,继续进行绘制操作。

方法

public void restore();

通过 save() 方法保存了画布的状态之后,可以在需要时通过 restore() 恢复画布的状态,以便不影响后续绘制。

在 onDraw() 方法中,我们使用 save() 和 restore() 来保护每次对 Canvas 状态的修改不相互干扰。例如,每次使用 clipRect() 时,都先保存当前的画布状态,然后修改裁剪区域,完成绘制后,再调用 restore() 恢复原始状态,确保其他绘制操作不受影响。

save() 和 restore() 两个方法的作用可能在理解起来有点困难,虽然 Canvas 本身是一个单一的对象,但通过 save() 和 restore(),可以在 同一个 Canvas 上创建多个“画布状态”。只可意会不可言传,MD,好玄幻。

这两个方法可以理解成是 “记住”和“恢复” 画布状态的工具。

4. 定义自定义属性


定义两种颜色:文本的原始颜色,和改变的颜色。这些属性可以通过 res/values/attrs.xml 文件来定义:

    <declare-styleable name="ColorTrackTextView">
        <attr name="originColor" format="color"/>
        <attr name="changeColor" format="color"/>
    </declare-styleable>

5. 初始化视图元素


初始化画笔和两种颜色。

    private void initPaint(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ColorTrackTextView);

        // 获取用户设置的颜色,若未设置则使用默认颜色
        int initialColor = typedArray.getColor(R.styleable.ColorTrackTextView_originColor, getTextColors().getDefaultColor());
        int changedColor = typedArray.getColor(R.styleable.ColorTrackTextView_changeColor, getTextColors().getDefaultColor());

        // 创建两个画笔,一个用于初始颜色,一个用于变化后的颜色
        mInitialPaint = createPaint(initialColor);
        mChangedPaint = createPaint(changedColor);

        typedArray.recycle();
    }

6. 绘制视图内容(onDraw)


文字变色关键一点就是确定分割线的位置,如下图所示的 middle 坐标。
在这里插入图片描述
middle 最小为0,最大为getWidth(),由此我们可以动态计算middle的坐标(mProgress 为 当前进度值,范围为 0.0 到 1.0):

int middle = (int) (mProgress * width); // 当前进度对应的分割位置

这时我们就可以动态获取分割线左右两个矩形的坐标了,假设 middle值为0.5,此时画笔1,将画出完整的文字变色四个字,通过 canvas.clipRect() 剪切下 分割线左边矩形,此时右边内容将不会显示!此时的画布状态为大矩形的一半,接着我们 调用canvas.restore() 恢复画布状态,又可以操作整个大矩形画布了,然后再用画笔2,再画出完整的文字变色四个字,同理,剪切掉左边矩形,只显示右边矩形内容,最后就是显示一个文本两种颜色了。

核心代码如下:


     if (mDirection == Direction.LEFT_TO_RIGHT) {
            // 从左到右:左边是改变颜色,右边是初始颜色
            drawText(canvas, mChangedPaint, x, baseline, 0, middle); // 绘制变色部分
            drawText(canvas, mInitialPaint, x, baseline, middle, width); // 绘制不变色部分
     } else if (mDirection == Direction.RIGHT_TO_LEFT) {
            // 从右到左:右边是改变颜色,左边是初始颜色
            drawText(canvas, mChangedPaint, x, baseline, width - middle, width); // 绘制变色部分
            drawText(canvas, mInitialPaint, x, baseline, 0, width - middle); // 绘制不变色部分
     }
//..
    private void drawText(Canvas canvas, Paint paint, int x, int y, int left, int right) {
        canvas.save(); // 保存画布状态
        canvas.clipRect(left, 0, right, getHeight()); // 裁剪画布区域
        canvas.drawText(getText().toString(), x, y, paint); // 绘制文本
        canvas.restore(); // 恢复画布状态
    }

这里有一点比较绕的地方,从左到右是从分割线是从左边开始(0.0 到 1.0),从右至左是分割线从右边开始(1.0 到 0.0),红色逐渐占领黑色领土!这一点能理解,就能看懂代码了。

7. 完整代码


public class ColorTrackTextView extends androidx.appcompat.widget.AppCompatTextView {
    // 初始颜色的画笔
    private Paint mInitialPaint;

    // 改变颜色的画笔
    private Paint mChangedPaint;

    // 当前进度值,范围为 0.0 到 1.0
    private float mProgress = 0f;

    // 动画方向,默认为从左到右
    private Direction mDirection = Direction.LEFT_TO_RIGHT;

    public enum Direction {
        LEFT_TO_RIGHT, RIGHT_TO_LEFT
    }

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

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

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

    // 初始化画笔对象
    private void initPaint(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ColorTrackTextView);

        // 获取用户设置的颜色,若未设置则使用默认颜色
        int initialColor = typedArray.getColor(R.styleable.ColorTrackTextView_originColor, getTextColors().getDefaultColor());
        int changedColor = typedArray.getColor(R.styleable.ColorTrackTextView_changeColor, getTextColors().getDefaultColor());

        // 创建两个画笔,一个用于初始颜色,一个用于变化后的颜色
        mInitialPaint = createPaint(initialColor);
        mChangedPaint = createPaint(changedColor);

        typedArray.recycle();
    }

    // 根据颜色创建画笔对象
    private Paint createPaint(int color) {
        Paint paint = new Paint();
        paint.setColor(color);
        paint.setAntiAlias(true); // 开启抗锯齿
        paint.setDither(true); // 开启抖动效果
        paint.setTextSize(getTextSize()); // 设置文本大小
        return paint;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 获取文本内容和画布的宽高
        String text = getText().toString();
        int width = getWidth();
        int height = getHeight();

        // 获取文本的边界和基线位置
        Rect textBounds = new Rect();
        mInitialPaint.getTextBounds(text, 0, text.length(), textBounds);
        int textWidth = textBounds.width();
        int x = width / 2 - textWidth / 2; // 计算文本绘制的起始 X 坐标

        Paint.FontMetrics fontMetrics = mInitialPaint.getFontMetrics();
        int baseline = height / 2 + (int) ((fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom); // 计算基线 Y 坐标

        // 根据当前进度和方向绘制文本
        int middle = (int) (mProgress * width); // 当前进度对应的分割位置

        if (mDirection == Direction.LEFT_TO_RIGHT) {
            // 从左到右:左边是改变颜色,右边是初始颜色
            drawText(canvas, mChangedPaint, x, baseline, 0, middle); // 绘制不变色部分
            drawText(canvas, mInitialPaint, x, baseline, middle, width); // 绘制变色部分
        } else if (mDirection == Direction.RIGHT_TO_LEFT) {
            // 从右到左:右边是改变颜色,左边是初始颜色
            drawText(canvas, mChangedPaint, x, baseline, width - middle, width); // 绘制不变色部分
            drawText(canvas, mInitialPaint, x, baseline, 0, width - middle); // 绘制变色部分
        }
    }

    // 绘制指定区域的文本
    private void drawText(Canvas canvas, Paint paint, int x, int y, int left, int right) {
        canvas.save(); // 保存画布状态
        canvas.clipRect(left, 0, right, getHeight()); // 裁剪画布区域
        canvas.drawText(getText().toString(), x, y, paint); // 绘制文本
        canvas.restore(); // 恢复画布状态
    }

    // 设置文字的变化方向
    public void setDirection(Direction direction) {
        mDirection = direction;
    }

    // 设置当前进度并刷新界面
    public void setProgress(float progress) {
        mProgress = progress;
        invalidate(); // 重绘视图
    }
}

8. 使用


xml:

    <com.xaye.example.ColorTrackTextView
        android:id="@+id/tv_track"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:originColor="@color/black"
        app:changeColor="@color/red"
        android:text="文字变色"
        android:textSize="30dp"
        android:layout_centerHorizontal="true"/>

activity:

    private fun leftToRight(){
        val trackTextView = mBind.tvTrack
        trackTextView.setDirection(ColorTrackTextView.Direction.LEFT_TO_RIGHT)
        val valueAnimator = ValueAnimator.ofFloat(0f, 1f);
        valueAnimator.setDuration(2000)
        valueAnimator.addUpdateListener { animation ->
            val value = animation.animatedValue as Float
            trackTextView.setProgress(value)
        }
        valueAnimator.start()
    }

    private fun rightToLeft(){
        val trackTextView = mBind.tvTrack
        trackTextView.setDirection(ColorTrackTextView.Direction.RIGHT_TO_LEFT)
        val valueAnimator = ValueAnimator.ofFloat(0f, 1f);
        valueAnimator.setDuration(2000)
        valueAnimator.addUpdateListener { animation ->
            val value = animation.animatedValue as Float
            trackTextView.setProgress(value)
        }
        valueAnimator.start()
    }

9. 最后


本篇文章只是讲解文字变色的原理,它的应用场景有很多,一般和滑动组件配合使用(0.0 - 1.0的变化),下篇文章介绍具体的应用场景。

另外给喜欢记笔记的同学安利一款好用的云笔记软件,对比大部分国内的这个算还不错的,免费好用:wolai

麒麟系统下的多媒体革命:VLC在kylinV10上的性能优化与调试技巧 本文详细介绍了在麒麟kylinV10系统上优化VLC多媒体播放性能的实战技巧,特别针对飞腾FT-2000/4硬件平台。从源码编译调优到硬件加速配置,提供全面的性能提升方案,帮助开发者在国产操作系统上构建高效媒体播放环境。 阅读详情

相关推荐

Matlab:常见涡旋光束仿真

代码: clc clear all close all %% 环形涡旋光束 N = 200; lambda = 632e-9; %波长为632nm k = 2*pi/lambda; %波数 w0 = 3; %束腰半径 x = linspace(-10,10,N); y = linspace(-10,10,N); [X,Y] = meshgrid(x,y); [t...

zzz997的博客 3万+

android 中一段文字设置不同颜色

android 中一段文字设置不同颜色

minusn的博客 5490

单细胞marker基因表达密度图-(还有一个包装函数)

我们借助Nebulosa,将上面的过程包装为一个函数,还是那句话,受累麻烦的事我们来解决,您轻松即可,先看看函数参数:需要注意的是,如果你只想框选某一类celltype,理想模式是这群celltype是单独聚类的,没有散落在其他类群,否则将会全部框选,效果不好,建议使用AI/PS添加。需要注意,这里我算是投机取巧了,用了一个和这个作图毫无关系的包ggnetwork,主要的目的是用他的theme_blank()主题,一次性将所有清空,当然也可以自己慢慢写,不过有现成的,为啥不用呢?这质感不就上去了嘛。

qq_42090739的博客 1367

Android-自定义TextView(彩色字体与霓虹灯字体以及TextView的多项字体效果)

很多时候我们也需要制作一些彩色字体的文本,文本的霓虹灯效果,以及链接字体哈,字体背景色,下标之类的,而很多时候我们却用多个textview去达到这个效果,可以说是很浪费时间浪费经精力的,这时候怎么办呢?下面就有详解。文章结构:1.自定义TextView实现彩色字体与霓虹灯字体 2.一个可以字体实现多项效果的类(封装好了,可直接使用)

Jack__Frost的博客 6542

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1241

【Agora 本地录制最全总结- 基于Java SDK】

Agora 本地服务端录制

lizhengze1117的博客 1790

Android自定义ProgressBar,内部显示图标和文字,文字被进度条覆盖时会变色

不多说,先上效果图: Android内置的ProgressBar很鸡肋,样式过于简单,现在需要一个内部能显示图标和文字的ProgressBar,同时,当进度条与图标和文字重叠时,图标和文字会相应变化颜色。这里的关键效果就在于变色的处理,我这里是通过设置相交模式实现这一效果的,应用了SrcIn模式,在图标和文字上方绘制一层白色图层,随progress进度调整图层宽度,当白色图层与图标和文字相交时,会

菜鸟的自我修养 1万+

【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层

用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接导入到CASS中,进一步绘制地形图。那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站shp数据的生成为例,详细介绍ArcGIS 10.2中导入X、Y坐标(这里指的是经度、纬度),生成Shapefile点数据的流程。 相关阅读:《全站仪、RTK测量坐标数据在CASS和ArcGIS中展点的区别和联系》 目录 1、数据准备 2、添加X、Y数据 3、属性表连接(Join) 4、导出为Sh.

智慧空间实验室 10万+

自定义View--->玩转字体变色

自定实现自体变色

weixin_51031363的博客 483

PHP与Node.js的对比及优缺点分析

PHP和Node.js是两种常用的服务器端编程语言,它们在不同的应用场景下各有优势和劣势。本文将全方位比较PHP和Node.js的特点,以及它们在编程中的优缺点,并提供相应的源代码示例供参考。需要注意的是,本文只是对PHP和Node.js的一些优缺点进行了简要介绍,实际应用中还需要考虑其他因素,如团队经验、项目规模和预算等。最终的选择应该基于全面的评估和需求分析。PHP:PHP是一种同步阻塞的编程语言,它的处理方式是一次只处理一个请求。Node.js:Node.js的性能较高,特别适合处理高并发的请求。

ByteSparkX的博客 887

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 345

android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片

/android TextView、EditText对部分内容设置颜色、字体、超链接、图片;//这里是以一个TextView为例子,EditText的设置方法和TextView一样。//设置13-15的字符点击时,转到写短信的界面,发送对象为10086。//不添加这一句,拨号,http,发短信的超链接不能执行.//设置2-5的字符链接到电话簿,点击时触发拨号。//设置9-11的字符为网络链接,点击时打开页面。//设置文本内容到textView。//TextView对象。//设置0-2的字符颜色。

阿茁的专栏 2693

【Bug已解决】Claude Desktop Cowork 报错 Workspace unavailable 解决方案

方案适用场景推荐指数确认虚拟机镜像下载完整性排查的第一步,最基础的前提检查⭐⭐⭐⭐⭐确认虚拟机平台功能已启用Windows 系统功能层面的必要条件⭐⭐⭐⭐⭐重启 CoworkVMService快速尝试恢复服务正常状态⭐⭐⭐⭐完全重启客户端排除临时性状态错乱⭐⭐⭐⭐降级使用文件工具临时替代方案,不阻塞当前工作⭐⭐⭐报错的本质是Cowork 功能依赖的虚拟机管理服务,在 Windows 应用包隔离机制下未能正确定位虚拟机文件的实际存放路径。

博客 6224

重学 Android 自定义 View 系列(五):文字变色的应用

上一篇介绍了文字变色的原理,本篇文章就简单介绍下其应用。原理都掌握了,应用还不是手拿把掐😁重学 Android 自定义 View 系列(四):文字变色结束,睡觉!wolai。

WriteBug001的博客 520

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

重学 Android 自定义 View 系列(九):侧边字母选择器

本文来实现一个侧边字母选择器,很常见的一个控件,和上篇文章星星评分用到的关键技术点类似,难度不大,本篇再来温故知新一下。难度不大,前面文章和接下来几篇文章都是打基础的,只有基础打牢了,遇到高级View才能不发怵,🤭。再会!

WriteBug001的博客 1159

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android自定义变色文字

通过将文字分成两部分绘制实现一个类似歌词效果的变色文字

weixin_40652755的博客 1386

Android开发文本显示之设置文本的颜色

因为上面的xml文件里前三个写了文本显示内容,这里只需要对颜色进行设置即可, 其中的textView1是使用的Color类的颜色常量设置颜色,textView2是使用的8位16进制数设置颜色,textView3是使用的6位16进制数设置颜色,同时如果大家想要知道为什么文本显示内容的代码要这么写,去看我文本内容设置的博客,这里不做过多解释。

weixin_56036523的博客 852

Android自定义View实现不同朝向字体变色

实现效果:1.一个文字两种颜色2.实现不同朝向3.结合ViewPager思路:TextView可行?系统提供的只能够显示一种颜色,需要自定义Viewextends TextView:onMeasure()不需要实现 textColor颜色,textSize字体大小会少很多逻辑。1.一个文字两种颜色 画2.能够从左到右,从右到左3.整合到ViewPager,监听滚动事件自定义属性,不变化的颜色 originColor 变化的颜色 changeColorx要在这个位置。

ChenYiRan123456的博客 655

Android界面实现点击文本变色功能

首先定义一个Textview叫myTextview,修改颜色只需要在ACION_DOWN的Color.RED换一种颜色,比如Color.GREEN实现点击时的颜色。如果点击后显示的颜色可以再ACION_CANCEL实现更换Color.BLACK。

qq_75085852的博客 885

自定义View实战三:实现变色TextView

一、概述 本文讲述如何自定义 TextView,使得 TextView 能切换两种颜色。最终实现效果如下图所示。 二、实现步骤分析 继承自 TextView,做好初始化工作 实现一个文字两种颜色 实现不同朝向(左到右、右到左) 提供一些调用方法 结合 ViewPager 使用 三、具体实现 继承自 TextVie...

Androidtalent的博客 725

Android自定义view-玩转字体变色

一、概述 继续学习自定义view,主要还是讲解画笔,实现的功能是用两种颜色的画笔画文字,根据滑动的偏移量,实现颜色过渡,可以用于页面的指示器。 效果图: 指示器.gif 二、思路分析 有两种颜色,一种默认颜色,一种选中的颜色(改变的颜色),一个文本两种不同颜色的画笔去画,画的起始点和结束点(也就是文字的绘制矩形区域)根据左滑或者右滑的偏移量而改变。 2.1继承自textView自

丿灬安之若死 1080

Android 重学系列--系统启动到Activity

背景 为什么要写这个,是因为做android到今天,发现自己的基础不牢固,很多东西早年明白是怎么回事,下意识的知道怎么做,android这一块做久了过多的思考业务与设计,反而原理开始模模糊糊了。但是探究其原因,是过久没接触,成为了下意识行为。这是个不好的信号,也是一个不好的开始。最近又听闻在tx的哥们,以及面试大厂成功的哥们,一问起他们的面试题,以及工作情况,原以为自己的水平还算过的去,发现自己在...

yujunyu12的博客 784

Android重学系列 红黑树

背景 红黑树,是一个比较复杂的数据结构。让我们分析一下,整个AVL树的性质。AVL最明显的特点就是,每个节点左右子树的高度差不超过1。那么就会势必产生这样的性质:当插入一个新的节点的时候时间复杂度是O(LogN)还有没有办法更快的?因此红黑树诞生了。 正文 先介绍一下红黑树的概念: 这是一种特殊的二叉搜索树。这种二叉搜索树将会符合如下5条性质: 1.每个节点都是黑色或者红色的。 2.根节点是黑色...

yujunyu12的博客 1186

Android 绘制反色文字进度条

一直想要实现一个这样的效果,终于弄出来了做个记录。 public class MyProgressView extends View { private Paint mPaint; private int viewWidth, viewHeight; private float maxProgress = 100; private float pro...

1025

Android TextView中改部分文本颜色

点击 layout中activity_main.xml 看TextView 中代码是否和上面差不多。点击MainActivity.java。color=’#*****' 颜色更改。编译和上面一样的代码。

fccan的博客 502

Android自定义View之画笔(Paint)基础

官网的解释:Paint类保存有关如何绘制几何图形,文本和位图的样式和颜色信息。 Paint常用的方法 先将所有常用的方法列举出来,然后在一 一测试 Paint的三个构造方法 Paint() // Paint(int flags) Paint(Paint paint) 常用的一些方法 // 初始化画笔 paint = new Paint(); // 设置颜色 paint.setColor(C...

Silicon_Valley 1376
上一篇: 安卓属性动画插值器(Interpolator)详解
下一篇: 重学 Android 自定义 View 系列(五):文字变色的应用
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值