Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在特定时间段内为TextView着色_Java_Android_Colors_Textview - Fatal编程技术网

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