网上的一些跑马灯文本布局ScrollTextview复杂又麻烦了,我来给个简单的实现方法,研究了一个晚上唉。。。
public class ScrollTextView extends AppCompatTextView {
private TextPaint paint;
private float textWidth;
private boolean marquee = true;
private int dtX;
public MarqueeTextView(@NonNull Context context) {
this(context, null);
}
public MarqueeTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public MarqueeTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
paint = getPaint();
paint.setColor(getTextColors().getDefaultColor());
paint.drawableState = getDrawableState();
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
textWidth = getPaint().measureText(text.toString());
setSingleLine();
}
public final void stop() {
marquee = false;
}
public final void start() {
marquee = true;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
// 实现左右跑马灯
if (-dtX > textWidth) {
dtX = 0;
}
if (dtX == 0) {
canvas.translate(dtX, 0.0F);
if (marquee && textWidth > getWidth()) {
postDelayed(this::invalidate, 2000);
dtX--;
}
} else {
canvas.translate(dtX--, 0.0F);
invalidate();
}
getLayout().draw(canvas, null, paint, 0);
canvas.restore();
}
}
主要还是这篇文章给了我灵感,也感谢这位大佬,让我理解了跑马灯原理,写出了最主要的代码!