这TextView也太闪了,咋做的?

做一个有上下滚动效果的TextView 特性 使用简单,API与TextView类似,setText方法可带有上下滚动的动画 * 支持xml设置android:textSize/android:textColor/android:textStyle等常用属性 * 可高度定制,支持任何单个字符的上下滚动变化效果 动画效果 策略 可以通过设置不同的动画策略来实现不同的滚动效果 默认的动画是小字符向大字符变化时向下滚... 阅读详情

前言

准备写个Demo的时候,发现首页有点空旷,思来想去不知道放点啥内容填充下,后面灵光一闪,能不能做个文字闪烁的效果,放在首页介绍项目。说做就做。

第一步:打开ChatGPT

第二步:搜索“安卓文字闪烁效果用kotlin实现”

第三步:复制粘贴

格式化代码,编译、运行。猿神,启动!!!!

这次移植手术很成功,效果很好!!,效果如下:

效果是不是很nice,好了,做法已经传授给各位了,散了吧。

目前已实现并且上传到MavenCentral,详细用法可以去项目README里面看,项目地址:

https://github.com/fastcv-cc/FlashTextView

觉得可以的给个Star!!!

emmmm,明明我都实现了这个功能了,但为啥总感觉脑袋空空的,做了跟没做似得。不行,还是来分析总结下它的实现思路,不然总感觉哪里怪怪的。

思路

既然是对TextView下手,那么方便起见,我们肯定是简单点直接继承TextView,这里官方建议继承AppCompatTextView,所以,我们定义的FlashTextView初始代码结构就是这样的:

class FlashTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) {

}

那在这个基础上,我们来思考下,文字闪烁效果怎么实现?

文字闪烁效果怎么实现?

基于效果图,我们挑选关键的帧看下文本内容的变化

从上图可以看出,随着时间的变化,文字区域有一部分被虚化了。

那这个效果怎么做呢?

在这一步,我瞬间就有了个想法:弄一个矩形区域改在文本上方,随着时间重复移动,起到光效移动的效果。

说干就干。

矩形区域随时间重复移动

如上图所示,我们通过时间的推移,将矩形区域的显示位置移动来达到闪烁的效果。根据这个思路,我们需要定义一个矩形区域Rect,定义一个变量xTranslate记录x轴的移动量,然后通过画笔定义填充的颜色。

class FlashTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) {

    private val rect = Rect()

    private var xTranslate = 0

    private val paint = Paint().apply {
        setColor("#BBFFFFFF".toColorInt())
        style = Paint.Style.FILL
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        //定义这个矩形的高度与文本区域高度一致,宽度为文本区域的宽度的五分之一
        rect.set(0, 0, w/5, h)
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        //每次移动整个宽度的十分之一
        xTranslate += measuredWidth/10
        //如果超过宽度之后重置为0
        if (xTranslate > measuredWidth) {
            xTranslate = 0
        }
        canvas.withTranslation(xTranslate * 1.0f, 0f) {
            //绘制文字之后
            drawRect(rect, paint)
        }
        //100毫秒左右重绘一次
        postInvalidateDelayed(100)
    }
}

每次重绘都会改变x轴的偏移量,通过偏移量的变化矩形的绘制区域,以此完成整个过程的动效,效果如下:

看起来还可以啊!

但是这个矩形区域目前设置的是个纯色的,我们是不是可以把这玩意染成渐变色的?

那怎么染成渐变色呢?我能马上想到的就是:把Rect换成一个Drawable,比如这里可以用:

- ColorDrawable
- ShapeDrawable
- GradientDrawable
- ...

使用Drawable替代矩形区域

这里我选用的 GradientDrawable 来实现一下效果。

        rect.set(0, 0, w/7, h)
        drawable = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf("#66FFFFFF".toColorInt(),"#99FFFFFF".toColorInt(),"#FFFFFFFF".toColorInt()))
        drawable?.bounds = rect

然后修改下绘制方式

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        xTranslate += measuredWidth/10
        if (xTranslate > measuredWidth) {
            xTranslate = 0
        }

        canvas.withTranslation(xTranslate * 1.0f, 0f) {
            //绘制文字之后
            drawable?.draw(canvas)
        }
        postInvalidateDelayed(100)
    }

整体代码:

class FlashTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) {

    private val rect = Rect()

    private var xTranslate = 0

    private var drawable:GradientDrawable? = null

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        rect.set(0, 0, w/7, h)
        drawable = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf("#66FFFFFF".toColorInt(),"#BBFFFFFF".toColorInt()))
        drawable?.setSize(rect.width(),rect.height())
        drawable?.bounds = rect
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        xTranslate += measuredWidth/10
        if (xTranslate > measuredWidth) {
            xTranslate = 0
        }

        canvas.withTranslation(xTranslate * 1.0f, 0f) {
            //绘制文字之后
            drawable?.draw(canvas)
        }
        postInvalidateDelayed(100)
    }
}

我们来看下效果:

也是很可以的,在原来的基础上面添加了渐变的效果。

我们用自己的想法也实现了个FlashTextView,但是,它存在个问题,就是当我们给TextView设置背景之后,效果就很难看了。和AI提供的方式差别还是挺大的。

AI的实现方式

那AI给我们推荐的代码是怎么实现的呢?它给的代码如下:

class FlashTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) {
    
    //矩阵对象
    private var gradientMatrix: Matrix? = null

    //渐变效果
    private var flashGradient: LinearGradient? = null

    //平移距离
    private var xTranslate = 0

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        if (w > 0 && gradientMatrix == null) {
            //保证只初始化一次
            flashGradient = LinearGradient(
                0f,
                0f,
                w * 1.0f,
                0f,
                intArrayOf(Color.BLUE, 0xffffff, Color.BLUE),
                null,
                Shader.TileMode.CLAMP
            )
            paint.setShader(flashGradient)
            gradientMatrix = Matrix()
        }
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        //绘制文字之后
        if (gradientMatrix != null) {
            xTranslate += measuredWidth / 5
            if (xTranslate > 2 * measuredWidth) {//决定文字闪烁的频繁:快慢
                xTranslate = -measuredWidth
            }
            gradientMatrix!!.setTranslate(xTranslate * 1.0f, 0f)
            flashGradient!!.setLocalMatrix(gradientMatrix)
            postInvalidateDelayed(100)
        }

    }
}

LinearGradient? setShader? Matrix?

这都是啥?啥?啥?

还好我底子厚实,一百度就知道它们是干甚的了。

那我们就在梳理它的思路之前,先来补充一点点Paint、Shader和Matrix的相关内容先,不然看得的云里雾里。

Paint和Shader

Paint大家应该都不陌生,在自定义View中,它指代绘制的画笔,除了我们常用的设置颜色、风格(Style)外,它还有个setShader(Shader shader) 方法用来设置 Shader。那 Shader 是什么呢?

Shader 这个英文单词很多人没有见过,它的中文叫做「着色器」,也是用于设置绘制颜色的。「着色器」不是 Android 独有的,它是图形领域里一个通用的概念,它和直接设置颜色的区别是,着色器设置的是一个颜色方案,或者说是一套着色规则。当设置了 Shader 之后,Paint 在绘制图形和文字时就不使用 setColor/ARGB() 设置的颜色了,而是使用 Shader 的方案中的颜色。

在 Android 的绘制里使用 Shader ,并不直接用 Shader 这个类,而是用它的几个子类。具体来讲有:

  • LinearGradient:线性渐变
  • RadialGradient:辐射渐变
  • SweepGradient:扫描渐变
  • BitmapShader:用 Bitmap 的像素来作为图形或文字的填充
  • ComposeShader :混合着色器

这么几个。具体细节大家可以单独去学习了解下,或者关注我,我后面会写个自定义View基础知识的文章。

这里代码使用到了 LinearGradient ,那我就以 LinearGradient 来简单介绍下 Shader 是干甚用的。

首先我们看到它常用的构造方法

    public LinearGradient(float x0, float y0, float x1, float y1,
            @ColorInt int color0, @ColorInt int color1,
            @NonNull TileMode tile) {
        this(x0, y0, x1, y1, Color.pack(color0), Color.pack(color1), tile);
    }

参数:

  • x0 y0 x1 y1:渐变的两个端点的位置,它有两个作用:
    • 控制渐变的方向,从 [x0,y0] > [x1,y1]
    • 控制渐变的范围,毕竟两个点可以得到渐变的宽或者高
  • color0 color1 是端点的颜色
  • tile:端点范围之外的着色规则,类型是 TileMode。TileMode 一共有 3 个值可选:CLAMP, MIRROR 和 REPEAT。
    • CLAMP 会在端点之外延续端点处的颜色
    • MIRROR 是镜像模式
    • REPEAT 是重复模式

tile的作用就是超出渐变的范围后,控制后续区域渐变效果。画个图给大家解释下:

编码举个例子:

class ShaderView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : View(context, attrs, defStyleAttr) {

    //渐变效果
    private var flashGradient: LinearGradient? = null

    private val paint = Paint()

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        flashGradient = LinearGradient(
            0f,
            0f,
            w / 5f * 1.0f,
            0f,
            intArrayOf(Color.RED, Color.BLUE),
            null,
            Shader.TileMode.CLAMP
        )
        paint.setShader(flashGradient)
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawRect(RectF(0f, 0f, measuredWidth * 1.0f, measuredHeight * 1.0f), paint)

    }
}

然后只修改TileMode,不同的TileMode的表现如下:

简单了解了 Shader 之后,我们再来看看 Matrix 矩阵是干嘛的。

Matrix 矩阵

矩阵说起来比较麻烦,全是掉头发的数学知识,作为一个纯正的开发,我自然而然的不会这些知识点。

但是,我不会说不代表我不会用,我们一般将矩阵用在图形变换上,常见的一些操作有:

  • 平移
  • 缩放
  • 翻转
  • 旋转

详细说起来也好麻烦,大伙想深入研究的可以自己去查下。这里我简单举下例子。

比如平移操作:

    fun setTransition(value:Int) {
        transition = value
        matrix.setTranslate(transition / 5f * 1.0f, 0f)
        flashGradient?.setLocalMatrix(matrix)
        invalidate()
    }

从结果导向,我们的图像都向右偏移了一段距离,空出来的地方,在不同的模式下表现不同:

  • CLAMP模式下,会以端点的颜色延伸,所以补充的红色
  • MIRROR模式下,还是镜像的方式反向延伸
  • REPEAT模式下,也是反向重复延伸

还举个旋转的操作:

    fun setRotate(value:Float) {
        matrix.setRotate(value)
        flashGradient?.setLocalMatrix(matrix)
        invalidate()
    }

我们的图像倾斜了一定角度,看起来怪怪的,那为啥是这样的效果呢?

这是因为我们旋转是针对整个图像而言的,比如上图。

然后在显示区域内显示特定区域的内容,所以看起来就很奇怪了,但是理解之后就不觉得奇怪了。

思路

综合上面所有的知识点,我们再来看看AI提供的代码

class FlashTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) {
    
    //矩阵对象
    private var gradientMatrix: Matrix? = null

    //渐变效果
    private var flashGradient: LinearGradient? = null

    //平移距离
    private var xTranslate = 0

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        if (w > 0 && gradientMatrix == null) {
            //保证只初始化一次
            flashGradient = LinearGradient(
                0f,
                0f,
                w * 1.0f,
                0f,
                intArrayOf(Color.BLUE, 0xffffff, Color.BLUE),
                null,
                Shader.TileMode.CLAMP
            )
            paint.setShader(flashGradient)
            gradientMatrix = Matrix()
        }
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        //绘制文字之后
        if (gradientMatrix != null) {
            xTranslate += measuredWidth / 5
            if (xTranslate > 2 * measuredWidth) {//决定文字闪烁的频繁:快慢
                xTranslate = -measuredWidth
            }
            gradientMatrix!!.setTranslate(xTranslate * 1.0f, 0f)
            flashGradient!!.setLocalMatrix(gradientMatrix)
            postInvalidateDelayed(100)
        }

    }
}

那整体思路就特别清晰了。

首先给TextView的画笔设置了一个 [Color.BLUE, 0xffffff, Color.BLUE] 两端蓝色、中间白色的 LinearGradient,用中间的白色达到闪烁的效果。并且设置的TileMode是CLAMP,了解过上面知识点的就知道,它会两端的颜色延伸,所以保证除了中间的白色闪光效果,其他的文字颜色一致。

那下一步就是让白色闪光点动起来,那这里就是用的Shader的setLocalMatrix方法来动态修改矩阵效果,以达到闪光点动起来的效果。

而且它只是修改了文字的着色效果,所以背景啥的没影响。

存在的问题和思考

AI生成的代码很好用,但是存在一个问题,就是此时给TextView设置的文本颜色是无效的,我们应该让它适应用户设置的颜色。

这里简单修改下:

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        if (w > 0 && gradientMatrix == null) {
            //保证只初始化一次
            flashGradient = LinearGradient(
                0f,
                0f,
                w * 1.0f,
                0f,
                intArrayOf(textColors.defaultColor, 0xffffff, textColors.defaultColor),
                null,
                Shader.TileMode.CLAMP
            )
            paint.setShader(flashGradient)
            gradientMatrix = Matrix()
        }
    }

这样就是直接使用的用户设置的文本颜色了。

但是如果直接设置的白色的话,就会看不出效果,所以我们可以使用自定义属性的方式来让用户自定义闪光的颜色以及光效范围。这里就不贴代码了。大家可以自己基于这个代码自己去扩展一下,也可以给我提个issues我来补充,我也会慢点更新这个组件的内容。

在TextView中使用了ClickableSpan后,禁止TextView滑动。 解决在TextView中使用了ClickSpan后,TextView触摸会滑动的问题。 阅读详情

相关推荐

TextView属性大全

android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法

这里才是学习Android的好地方 2万+

带闪光效果的自定义TextView

自己写了一个简单的小demo,通过使用LinearGradient和Shader渲染器来自定义带闪光的TextView,效果如下: 下面贴上自定义的TextView代码: package com.dfhe.textviewself; import android.content.Context; import android.graphics.Canvas; import android

b10060224的博客 1634

Glowy:向Android中的TextView和Button文本添加发光效果。 对发光动画的完全运行时控制

[过时] 尽管此api非常基本,并且可能开箱即用,但不再开发或维护。 发光文字动画API 这是适用于Android程序员的API。 使用此API,可以使用您选择的颜色使TextView和Button文本发光。 用法 步骤1:初始化变量 // TextView which is to be glow TextView textView; // Create instance of Activity MainActivity activity = this ; float startGlowRadius = 6f , // Glowing starts with this Intensity minGlowRadius = 3f , // Minimum Glowing Intensity maxGlowRadius = 15

TextView闪烁效果

TextView 闪烁效果在Android开发中,TextView可以说是出镜率非常高的控件,除了常用的设置文字大小,文字颜色等基本属性,有时也需要一些特殊的效果,例如文字的闪烁效果。首先上效果图: 实现这一效果可以使用Paint对象的Shader渲染器,通过给Paint对象设置一个不断变化的LinearGradient来绘制要显示的字符串。 布局文件如下: <com.examp

Tom_ji的博客 2384

Android TextView闪闪发光特效

Android TextView闪闪发光特效

TextView跑马灯、闪烁和跳动动画

TextView跑马灯、闪烁和跳动动画,跳动有左右跳动,上下跳动,还有波浪形从左往右跳动

自定义控件三部曲之绘图篇(十九)——LinearGradient与闪动文字效果

前言:家和万事兴 博主这段时间工作实在是太忙了,全天无尿点……博客一直没更新,实在对不住大家…… 现在优快云的图片上传功能又废了……等会再传图片吧……真是服了…… 这篇就给大家讲setShader的另一个参数,LinearGradient,使用过shape标签的同学,对这个方法估计都不莫生,就是线性渐变。跟PhotoShop中的线性渐变的原理和作用是一样的。这篇文章的最终会实现一个闪动文字效果

启舰 1万+

android实现字体闪烁动画的方法

主要介绍了android实现字体闪烁动画的方法,涉及Android中线程调用和Timer计时器的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

textview选中颜色设置,主题,背景颜色 TextView也太闪

textview选中颜色设置 https://www.icode9.com/content-4-230765.html https://blog.youkuaiyun.com/weixin_36111764/article/details/117493386 https://blog.youkuaiyun.com/jinmie0193/article/details/80723724 textview的各种参数 https://blog.youkuaiyun.com/sinat_38184748/article/details/988692

chezabo6116的博客 753

SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)

SUMO安装环境的设置 目录一.SUMO下载的官方网址二.下载步骤:三.环境设置:1.打开设置环境变量的界面2.用户(Administrator)变量设置3.系统变量设置四.总述 一.SUMO下载的官方网址 sumo的下载地址: 二.下载步骤: 1.以sumo1.8.0为示例进行演示,点击下载地址; 2.选择Windows64位的安装版本,如下图所示: 3.点击对应版本会跳转到如下图所示的界面,等待几秒后会自动下载(温馨提示:请将下载路径提前设置好): 4.到目标存储路径下查看下载完成的SUMO(本

weixin_50632459的博客 1万+

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 493

TextView

TextView还派生了一个CheckedTextView,CheckedTextView增加了一个checked状态,可通过setChecked(boolean)和isChecked()方法来改变、访问该组件的checked状态。//必须设置图片大小,否则不显示。(2)、使用Html.ImageGetter提供网页中要显示的图片。(3)、在TextView内部四周可以各设置一张图片。

6163

台达B3伺服电机485通讯的调试过程

最近上了一项目,没办法直接把B3伺服接到PLC上去,怎么办?偶说试下直接电脑通过100多米的485线控制好了,定型前的测试就这样展开了。 1、焊CN1口 如果不安装CN1,是开不了机的,要报很多错误,比如SERV EMG ALERT, 上限报警,下限报警什么的,怎么办?直接焊好CN1头子吧,烦了点,但是必要的。 主要接的是11,9,10,32,31,30几个脚,按照图上连接好就是了。 2、 接线路 按照上面的图,接上伺服电机线,编码器线,电源线,包括限位常闭开关、485连线等,就完..

shidong01的博客 1万+

Android中TextView的滑动

Android中TextView的滑动(横向/纵向) 一开始自然就想到了ScrollView和HorizontalScrollView这两个可以实现横向和纵向的滑动,但是ScrollView 有个特性就是它的内部只能有一个子元素,这样如果有多个控件外层还得给套一层布局包裹,想想这样不仅费事,而且还会影响绘制,布局一旦嵌套过多就会导致重复绘制,多少会影响效率,而且产品需求只是简单的文字滑动,并没有...

qq_35540164的博客 5756

高缺失率时空数据插补实战:从随机森林到扩散模型的性能对比

数据缺失是数据分析与机器学习建模中普遍面临的挑战,尤其在时空数据领域,传感器故障、传输中断等问题常导致数据不完整。数据插补技术旨在基于已知数据的模式和关联性,合理估算缺失值,为后续分析提供可靠基础。其核心原理在于利用数据的时空相关性(如时间周期性、空间邻近性)及与外部驱动因素(如交通、气象)的关联构建预测模型。这项技术的价值在于能将不完整的数据集转化为可用于高质量分析和预测的可用资产,广泛应用于环境监测、交通流量预测、金融风控等领域。本文聚焦于一个极具挑战性的场景——PM2.5监测数据缺失率高达82%,通过

weixin_30363285的博客 544

ESP8266开发之旅 基础篇① 走进ESP8266的世界

    欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。 1. 简介     从笔者的角度来说,ESP8266这个词可以理解为ESP8266EX芯片(当然,后面也有可能出现了其他芯片,这里首推ESP8266EX)以及依赖ESP8266EX芯片开发的系列模组的简称。     ESP8266EX是由乐鑫信息科技公司(Espressif)出品的一款应用于物联...

单片机菜鸟哥的博客 15万+

原生TextView能做哪些事。

TextView一、XML文本基本显示1、改变文本颜色2、改变文本大小3、将文本水平拉伸压缩4、给文本添加阴影效果5、改变文本背景颜色文本超链接相关1、超链接文本颜色文本布局位置相关1、改变文本在组件内显示的位置2、改变文本显示行数3、改变文本行距选中文本1、改变选中文本左右指示器图标,高亮文本颜色其他1、给文本周边添加视图二、CODE1、上述XML实现的效果2、富文本3、可滑动文本三、另外想要TextView文本内容自适应组件大小 一、XML 文本基本显示 1、改变文本颜色 自己在color里面定义颜色进

weixin_48261911的博客 769

comsol如何实现五厚度的单元模拟?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 469

android,做一个定制化的TextView,在TextView中画图

说明: 做一个定制化的TextView,在TextView中画图 在TextView中画图,一开始要做这个的时候,就想到子类化,自绘。。。 其实很简单 1. MyTextView继承TextView, 重载 TextView.onDraw public class MyTextView extends TextView { public MyTextView(Co

butyesbutno的专栏 1308

Unity 面试篇⚠️ | Unity性能优化好,山寨机都能跑~

Unity 面试篇⚠️ | Unity性能优化好,山寨机都能跑~

m0_58523831的博客 1万+

LeRobot 入门教程(十六)Isaac Lab LeIsaac 叠衣服、夹橙子仿真环境

LeRobotEnvHub现已支持通过LeIsaac进行机器人模仿学习,提供摘橙子、搬立方体等日常任务仿真环境。用户可通过HuggingFace共享环境,使用一行代码加载任务,支持随机动作测试和远程操控。系统提供云端仿真方案,无需本地GPU即可运行。当前支持4种任务环境,通过make_env函数切换,其中折叠布料任务需先调用initialize()函数。该平台集成了数据采集、转换和训练全流程,为机器人学习提供便捷工具链。

2506_90492529的博客 1483

【Android】tabLayout改变标签文字大小时发生的跳闪问题解决方法

上面这种写法,会导致左右滑动indicator切换发生跳闪,原因是TextView.setTextSize会导致requestLayout(),造成动画重新开始。如上图,tabLayout在选中时改变文字大小。下面给出其中一种解决方法,套两个textview。上代码test.xml。test.xml布局。...

mk12300的博客 1728

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android两个textview,将2个textview彼此并排放置,使第二个textview始终可见

1种方法尝试使用 ConstraintLayoutxmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent">android:id="@+id/longTextView"android:layout_widt...

weixin_27013291的博客 2473

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android textview清除,如何删除TextView的旧行

我有同样的问题。 我刚刚解决了。诀窍是使用TextView的getEditableText()方法。 它有一个replace()方法,甚至是一个delete()方法。 当你在其中追加getEditableText() ,TextView已经被标记为“editable”,这是使用getEditableText()所必需的。 我有这样的事情:private final static int MAX_L...

weixin_36099799的博客 3111

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 获取textview的高度,Android 可直接获取高度的textView

众所周知Android原生的textView在setText()执行之后并不能马上通过getHeight得到当前textView的高度,此时需要使用观察者模式在textView绘制完毕后取得,那么如果需要立即知道此时textView的高度和行数,甚至是要锁定textView的行数并拿到某一行最后一个字符的下标,这时候使用textView就非常的不方便了。如果强行使用观察者模式,在实践中往往需要执行...

weixin_29184371的博客 1526

android给textview添加边框,Android:在textview周围添加边框

如何使用xml布局在图片所示的文字周围添加边框我尝试将边框添加到布局中,但与文本重叠。您可以使用形状可绘制将textviews背景设置为白色,然后将其放在框上方能否请您详细说明一下,我必须在该矩形内添加textviews这回答了你的问题了吗? 如何在Android textview周围放置边框?您可以尝试这种布局,它可以根据您的要求进行反映android:layout_width="match_p...

weixin_39914863的博客 4658
上一篇: 手把手教你上传安卓库到Central Portal
fastcv
博客等级 码龄10年 90粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值