前言:又是午休时间,今天写一个简单的文字轮播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);
}
}