Java 在特定时间段内为TextView着色
有没有一种方法可以在特定的时间段内在Java 在特定时间段内为TextView着色,java,android,colors,textview,Java,Android,Colors,Textview,有没有一种方法可以在特定的时间段内在TextView或Android中给文本上色。因此,它将以全白色文本开始,然后颜色将从左向右移动,并在一定的持续时间内填充 因此,例如,如果持续时间为10,则整条线应在10秒内变为彩色,但也应以相同的速度移动 看起来是这样的: 有一种方法可以在IOS上使用CATextLayer进行操作,但是我还没有找到一种方法可以在Android上进行操作,这是一种优化的、简单的、平滑的、漂亮的方法 有很多教程(例如视频)展示了如何制作漂亮的动画。基本步骤如下: 为文本创
TextView
或Android
中给文本上色。因此,它将以全白色文本开始,然后颜色将从左向右移动,并在一定的持续时间内填充
因此,例如,如果持续时间
为10
,则整条线应在10
秒内变为彩色,但也应以相同的速度移动
看起来是这样的:
有一种方法可以在IOS上使用CATextLayer进行操作,但是我还没有找到一种方法可以在Android上进行操作,这是一种优化的、简单的、平滑的、漂亮的方法
有很多教程(例如视频)展示了如何制作漂亮的动画。基本步骤如下:
- 为文本创建两个SVG矢量图像,一个使用普通颜色,另一个使用
彩色字母。例如,您可以在Adobe Illustrator中轻松完成此操作
- 将两者导入到
- 根据您的喜好为第二个(彩色层)创建动画
- 将生成的xml文件复制到绘图表中,就完成了
祝你好运 有一种方法可以做到这一点:优化、简单、平滑和美观:
有很多教程(例如视频)展示了如何制作漂亮的动画。基本步骤如下:
- 为文本创建两个SVG矢量图像,一个使用普通颜色,另一个使用
彩色字母。例如,您可以在Adobe Illustrator中轻松完成此操作
- 将两者导入到
- 根据您的喜好为第二个(彩色层)创建动画
- 将生成的xml文件复制到绘图表中,就完成了
祝你好运 你可以使用文本扫描,一次可以设置一个角色的动画你可以使用文本扫描,一次可以设置一个角色的动画我去年刚刚创建了一个自定义的文本视图,这是我的课程
public class AKChangeColorTextView extends TextView {
public AKChangeColorTextView(Context context) {
this(context,null);
}
String TAG = "AKChangeColorTextView";
public AKChangeColorTextView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
RectF mRectF;
float mX;
float mY;
public AKChangeColorTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLUE);
PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
mPaint.setXfermode(mode);
float x = 60;
float y = 10;
mY = 0;
mRectF = new RectF(x, y, x + 50, y + 50);
mTPaint = getPaint();
mX = 0;
}
Paint mPaint;
TextPaint mTPaint;
Bitmap shadowBitmap ;
Rect bounds = new Rect();
Canvas textCanvas;
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
if (shadowBitmap == null) {
shadowBitmap = Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(), Bitmap.Config.ARGB_8888);
}
if (textCanvas == null) {
textCanvas = new Canvas(shadowBitmap);
}
textCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
if (mTPaint == null) {
mTPaint = getPaint();
}
String content = getText().toString();
mTPaint.getTextBounds(content,0,content.length(),bounds);
textCanvas.drawText(content,0,bounds.height(),mTPaint);
mRectF.set(colorLeft,mY,colorRight,mY+bounds.height()+10);
textCanvas.drawRect(mRectF,mPaint);
canvas.drawBitmap(shadowBitmap,0,0,null);
}
float colorLeft;
float colorRight;
public void setXOffset(float left,float right){
colorLeft = left;
colorRight = right;
invalidate();
}
}
我的演示代码:
class MainActivity : AppCompatActivity() {
val TAG = "MainActivity"
lateinit var countDownTimer:CountDownTimer
var currentOffsetx = 0
var textWidth = 0
var isIncrease = true
lateinit var txt:AKChangeColorTextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
(findViewById<View>(R.id.tv_hello) as AKChangeColorTextView).apply{
txt = this
}
countDownTimer = object:CountDownTimer(300000,200){
override fun onFinish() {
}
override fun onTick(millisUntilFinished: Long) {
if (textWidth == 0) {
textWidth = txt.width
}
if (currentOffsetx <= textWidth) {
if (isIncrease) {
currentOffsetx += 10
currentOffsetx = min(currentOffsetx, textWidth)
} else {
currentOffsetx -= 10
currentOffsetx = max(currentOffsetx, 0)
}
}
if (currentOffsetx == textWidth) {
isIncrease = false
}else if (currentOffsetx == 0) {
isIncrease = true
}
txt.setXOffset(0f,currentOffsetx.toFloat())
Log.w(TAG,"check current tick:$millisUntilFinished,offsetx:$currentOffsetx,txtWidth:$textWidth")
}
}
countDownTimer.start()
}
}
class MainActivity:AppCompatActivity(){
val TAG=“main活动”
lateinit变量倒计时:倒计时
var currentOffsetx=0
var textWidth=0
var isIncrease=true
lateinit var txt:AKChangeColorTextView
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
设置支持操作栏(工具栏)
(findViewById(R.id.tv_hello)作为AKChangeColorTextView)。应用{
txt=这个
}
countDownTimer=对象:countDownTimer(300000200){
重写函数onFinish(){
}
覆盖趣味点击(毫秒直到完成:长){
如果(textWidth==0){
textWidth=txt.width
}
如果(currentOffsetx我去年刚刚创建了一个自定义的文本视图,那么下面是我的课程
public class AKChangeColorTextView extends TextView {
public AKChangeColorTextView(Context context) {
this(context,null);
}
String TAG = "AKChangeColorTextView";
public AKChangeColorTextView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
RectF mRectF;
float mX;
float mY;
public AKChangeColorTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLUE);
PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
mPaint.setXfermode(mode);
float x = 60;
float y = 10;
mY = 0;
mRectF = new RectF(x, y, x + 50, y + 50);
mTPaint = getPaint();
mX = 0;
}
Paint mPaint;
TextPaint mTPaint;
Bitmap shadowBitmap ;
Rect bounds = new Rect();
Canvas textCanvas;
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
if (shadowBitmap == null) {
shadowBitmap = Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(), Bitmap.Config.ARGB_8888);
}
if (textCanvas == null) {
textCanvas = new Canvas(shadowBitmap);
}
textCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
if (mTPaint == null) {
mTPaint = getPaint();
}
String content = getText().toString();
mTPaint.getTextBounds(content,0,content.length(),bounds);
textCanvas.drawText(content,0,bounds.height(),mTPaint);
mRectF.set(colorLeft,mY,colorRight,mY+bounds.height()+10);
textCanvas.drawRect(mRectF,mPaint);
canvas.drawBitmap(shadowBitmap,0,0,null);
}
float colorLeft;
float colorRight;
public void setXOffset(float left,float right){
colorLeft = left;
colorRight = right;
invalidate();
}
}
我的演示代码:
class MainActivity : AppCompatActivity() {
val TAG = "MainActivity"
lateinit var countDownTimer:CountDownTimer
var currentOffsetx = 0
var textWidth = 0
var isIncrease = true
lateinit var txt:AKChangeColorTextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
(findViewById<View>(R.id.tv_hello) as AKChangeColorTextView).apply{
txt = this
}
countDownTimer = object:CountDownTimer(300000,200){
override fun onFinish() {
}
override fun onTick(millisUntilFinished: Long) {
if (textWidth == 0) {
textWidth = txt.width
}
if (currentOffsetx <= textWidth) {
if (isIncrease) {
currentOffsetx += 10
currentOffsetx = min(currentOffsetx, textWidth)
} else {
currentOffsetx -= 10
currentOffsetx = max(currentOffsetx, 0)
}
}
if (currentOffsetx == textWidth) {
isIncrease = false
}else if (currentOffsetx == 0) {
isIncrease = true
}
txt.setXOffset(0f,currentOffsetx.toFloat())
Log.w(TAG,"check current tick:$millisUntilFinished,offsetx:$currentOffsetx,txtWidth:$textWidth")
}
}
countDownTimer.start()
}
}
class MainActivity:AppCompatActivity(){
val TAG=“main活动”
lateinit变量倒计时:倒计时
var currentOffsetx=0
var textWidth=0
var isIncrease=true
lateinit var txt:AKChangeColorTextView
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
设置支持操作栏(工具栏)
(findViewById(R.id.tv_hello)作为AKChangeColorTextView)。应用{
txt=这个
}
countDownTimer=对象:countDownTimer(300000200){
重写函数onFinish(){
}
覆盖趣味点击(毫秒直到完成:长){
如果(textWidth==0){
textWidth=txt.width
}
如果(currentOffsetx您在动画中使用着色器来更改着色区域。请注意,如果您不小心的话,这样的动画可能会有荒谬的性能和内存消耗。@Gabeschen有没有办法做到这一点而不消耗太多的permorfmance,因为我还有很多其他事情要做—重新分配着色器和JU在它们之间切换会提前消耗更多内存,但可以节省您不断分配它们的时间,这可能会提高性能。您在动画中使用着色器来更改阴影区域。请注意,如果您不小心,这样的动画可能会导致性能和内存不足。@Gabeschen有什么方法可以做到这一点吗不需要消耗太多的permorfmance,因为我还有很多其他事情要做。预先分配着色器并在它们之间切换将消耗更多内存,但可以节省您不断分配它们的时间,这可能会提高性能。您是否有方法计算curentOffsetx
的间隔如果我想用5000ms来填充这个句子,那么我会做倒计时(5000,间隔)
但是间隔是多少,currentOffsetx是多少(目前是静态的10)?5000/宽度,例如,宽度是250,那么你的间隔应该是20。你有方法计算间隔吗?curentOffsetx
?假设我想用5000ms填充句子,那么我会做倒计时(5000,间隔)
,但是间隔和currentfoffsetx
(此时为静态10)?5000/宽度,例如,宽度为250,则间隔应为20