1.textView本身的跑马灯
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="49dp"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ"
/>
2.listView的item的textView跑马灯
如果你和上面的一样使用的时候会发现,没有任何的跑马灯效果
(1)这边介绍下 解决办法http://justwyy.iteye.com/blog/1487427 在代码中动态给item 的textView聚焦 setSelected(true);
还要记住不要在item的layout中设置focusable ="true",然后在listView中添加上 这个,具体的看上面的链接吧
(2)可以自己重新定义一个textView ,首先贴下自定义的view
public class MarqueeText extends TextView implements Runnable {
private int currentScrollX = 0;// 初始滚动的位置
private int firstScrollX = 0;
private boolean isStop = false;
private int textWidth;
private int mWidth = 0; // 控件宽度
//text每次滚动长度
private int speed = 2;
//text两次滚动时间间隔 ms
private int delayed = 8;
private int endX; // 滚动到哪个位置
private boolean isFirstDraw = true; // 当首次或文本改变时重置
//text一次滚动完成后,多长时间启动第二次滚动
private int delayAgain =1000 ;
private List<String> list =new ArrayList<String>();
public MarqueeText(Context context) {
super(context);
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isFirstDraw) {
getTextWidth();
firstScrollX = getScrollX(); // 起始位置不一定为0,改变内容后会变,需重新赋值
currentScrollX = firstScrollX;
mWidth = this.getWidth();
// endX = firstScrollX + textWidth - mWidth / 2;//字体滚动到一半的时候就从头滚动
endX = firstScrollX + textWidth;//字体滚完整个屏幕后再从头滚动
isFirstDraw = false;
}
}
// 每次滚动几点
public void setSpeed(int sp) {
speed = sp;
}
// 滚动间隔时间,毫秒
public void setDelayed(int delay) {
delayed = delay;
}
/**
* 设置滚动的list 内容
* @param list
*/
public void setList(List<String> list){
if(list!=null&&list.size()!=0){
this.list = list;
setText(list.get(0));
}
}
/**
* 获取文字宽度
*/
private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int) paint.measureText(str);
}
@Override
public void run() {
// currentScrollX += 1;// 滚动速度
currentScrollX += speed;// 滚动速度,每次滚动几点
scrollTo(currentScrollX, 0);
if (isStop) {
return;
}
// 从头开始
if (currentScrollX >= endX) {
// scrollTo(0, 0);
// currentScrollX = 0; //原文重置为0,发现控件所放的位置不同,初始位置不一定为0
scrollTo(firstScrollX, 0);
currentScrollX = firstScrollX;
//postDelayed(this, 1000);
if(list.size()!=0){
int current = list.indexOf(getText().toString());
if(current+1<list.size()){
setText(list.get(current+1));
}else{
setText(list.get(0));
}
}
} else {
postDelayed(this, delayed);
}
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
isStop = true; // 停止滚动
this.removeCallbacks(this); // 清空队列
currentScrollX = firstScrollX; // 滚动到初始位置
this.scrollTo(currentScrollX, 0);
super.onTextChanged(text, start, lengthBefore, lengthAfter);
isFirstDraw = true; // 需重新设置参数
isStop = false;
postDelayed(this, 4000); // 头部停4秒
}
// 开始滚动
public void startScroll() {
isStop = false;
this.removeCallbacks(this);
postDelayed(this, 1000);
}
// 停止滚动
public void stopScroll() {
isStop = true;
}
// 从头开始滚动
public void startFor0() {
currentScrollX = 0;
startScroll();
}
}
里面的代码注释个人认为还是很清晰的。。。。所以就不多做说明了,
使用的话,xml:
android:ellipsize="none"和android:singleLine="true"还是不能少的
<com.example.textedittext.MarqueeText2
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="none"
android:singleLine="true"
android:textSize="16sp" />
ok,就是这样了
下载链接:https://github.com/pszh/learngit
3.淘宝app的首页垂直滚动
这边就直接贴一个比教好的链接吧http://blog.csdn.net/dreamlivemeng/article/details/51979650
还有一个 是 https://github.com/Neacy/UpMarqueerTextView/tree/master
最后一个封装成了库 http://m.blog.csdn.net/article/details?id=51537129
最后一个 效果图
GitHub 上一个架包 https://github.com/gongwen/MarqueeViewLibrary