前言:又是午休时间,今天写一个简单的文字轮播demo,主要由一个水平方向的TextView和一个竖直方向的ListView组成。安卓目前提供的TextView支持跑马灯效果(修改几个属性即可),但是其有一个缺点就是一旦失去焦点,文字便不再滚动,自定义TextView修改几个方法可以解决这一问题。ListView的滚动则可以利用TimerTask和ListView的smoothScrollBy实现。
界面:
关键代码:
1、TimeTask
class TimeTaskScroll extends TimerTask { private ListView listView; public TimeTaskScroll(Context context, ListView listView) { this.listView = listView; } private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { // 控制速度 listView.smoothScrollBy(2, 5); } }; @Override public void run() { Message msg = handler.obtainMessage(); handler.sendMessage(msg); } }
2、自定义TextView
@SuppressLint("AppCompatCustomView") public class ScrollTextView extends TextView { private boolean isMarqueeEnable = false; public ScrollTextView(Context context) { super(context); } public ScrollTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public ScrollTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setMarqueeEnable(boolean enable) { if (isMarqueeEnable != enable) { isMarqueeEnable = enable; if (enable) { setEllipsize(TextUtils.TruncateAt.MARQUEE); } else { setEllipsize(TextUtils.TruncateAt.END); } onWindowFocusChanged(enable); } } public boolean isMarqueeEnable() { return isMarqueeEnable; } @Override public boolean isFocused() { return isMarqueeEnable; } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(isMarqueeEnable, direction, previouslyFocusedRect); } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(isMarqueeEnable); } }