Có cách nào để tạo hiệu ứng thay đổi màu văn bản (từ bất kỳ màu nào thành màu trắng) không?Hoạt ảnh màu văn bản
Biến thể duy nhất tôi đưa ra, đặt hai bản xem trước văn bản (cùng một văn bản) vào một vị trí và làm mờ phần trên cùng, vì vậy phần dưới cùng (có màu trắng) sẽ hiển thị.
P.S. Tôi đã loại bỏ các biến thể của 2 TextViews vì nó trông kỳ lạ (các cạnh không mượt mà và, vì tôi có rất nhiều thành phần như vậy trên màn hình, nó thực sự đã làm chậm quá trình cuộn). Những gì tôi đã làm, là một hack điên mà không hoạt hình với việc sử dụng một Thread và setTextColor (mà cũng buộc vẽ lại của một textview).
Vì tôi chỉ cần 2 thay đổi màu (từ đỏ sang trắng, và từ xanh sang trắng), tôi đã mã hóa cứng các giá trị và tất cả các màu chuyển tiếp giữa chúng. Vì vậy, dưới đây là cách có vẻ:
public class BlinkingTextView extends TextView {
public BlinkingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void animateBlink(final boolean red) {
if (animator != null) {
animator.drop();
}
animator = new Animator(this, red);
animator.start();
}
public void clearBlinkAnimation() {
if (animator != null) {
animator.drop();
}
}
private Animator animator;
private final static class Animator extends Thread {
public Animator(final TextView textView, final boolean red) {
this.textView = textView;
if (red) {
SET_TO_USE = RED;
} else {
SET_TO_USE = GREEN;
}
}
private TextView textView;
private final int[] SET_TO_USE;
private final static int[] RED = {
-2142396,
-2008754,
-1874854,
-1740697,
-1540490,
-1405563,
-1205099,
-1004634,
-804170,
-669243,
-469036,
-334879,
-200979,
-67337,
-1
};
private final static int[] GREEN = {
-6959821,
-6565826,
-6106293,
-5646758,
-5055894,
-4530309,
-3939444,
-3283042,
-2692177,
-2166592,
-1575728,
-1116193,
-656660,
-262665,
-1
};
private boolean stop;
@Override
public void run() {
int i = 0;
while (i < 15) {
if (stop) break;
final int color = SET_TO_USE[i];
if (stop) break;
textView.post(new Runnable() {
@Override
public void run() {
if (!stop) {
textView.setTextColor(color);
}
}
});
if (stop) break;
i++;
if (stop) break;
try {
Thread.sleep(66);
} catch (InterruptedException e) {}
if (stop) break;
}
}
public void drop() {
stop = true;
}
}
}
Cảm ơn . Tôi thực sự đã không thực hiện phương pháp tôi đã nói về (chỉ nghĩ về nó). Cảm ơn rất nhiều, tôi sẽ thử phương pháp của bạn ngay bây giờ :) –