跑马灯的一般配置
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/mar_ll"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="是发哈是伐啦设计费拉数据分类撒酒疯as家乐福可接受的浪费精力萨芬记录时间弗利萨沙路口的房间爱丽丝飞机克鲁赛德就"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
/**
* author: Tommy
* time : 2019/8/15
* desc :
*/
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
}
}
这么简单的一个加载就能出现跑马灯的效果了,当然这里不是说怎么实现跑马灯,这里说几种跑马灯跑不动的情况
跑马灯跑步起来的原因
一、缺少必要的配置
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
上面一个配置都不能少,少了任何一个都不能跑,当然换成java代码是下面这样的:
tv.setFocusable(true);
tv.setEllipsize(TextUtils.TruncateAt.MARQUEE);
tv.setSingleLine(true);//设置单行显示
tv.setHorizontallyScrolling(true);//横向滚动
tv.setMarqueeRepeatLimit(-1);//滚动一次1,-1是无线滚动
tv.setSelected(true);//开始滚
二、TextView的宽度大于文字宽度
如上图,文字就几个,但是TextView的宽度铺满,这种情况是不会滚动的。
三、页面的隐藏与显示的时候
这种方式很容易会被忽略掉
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/mar_ll"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="是克鲁赛德就sfsaf顺风使帆份萨法发送到发的发送到方式发发送到发送到发的发送到发送到份士大夫"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold"/>
</LinearLayout>
</LinearLayout>
如上代码块,我把TextView上面的LinearLayout加了个Gone,让它消失掉为什么呢?比如说我们现在有个需求,网络请求回来的参数决定显不显示这组控件,那么一开始肯定就先Gone掉,等网络参数回来再setVisibility。如下代码设置:
/**
* author: Tommy
* time : 2019/8/15
* desc :
*/
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
final LinearLayout ll = findViewById(R.id.mar_ll);
//假装网络请求,2秒后显示 View
ll.postDelayed(new Runnable() {
@Override
public void run() {
ll.setVisibility(View.VISIBLE);
}
}, 2000);
}
}
两秒钟之后,LinearLayout 是显示出来了,但是你会惊奇的发现跑马灯不动了!
下面有两种方式解决:
1.在网络请求完成之后,激活一下它
/**
* author: Tommy
* time : 2019/8/15
* desc :
*/
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
final LinearLayout ll = findViewById(R.id.mar_ll);
final TextView tv = findViewById(R.id.tv_title);
//假装网络请求,2秒后显示 View
ll.postDelayed(new Runnable() {
@Override
public void run() {
ll.setVisibility(View.VISIBLE);
//代码重新设置它
tv.setSelected(true);//开始滚
}
}, 2000);
}
}
2.Xml文件中的 gone 改为 invisible
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/mar_ll"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:orientation="vertical"
android:visibility="invisible">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="是克鲁赛德就sfsaf顺风使帆份萨法发送到发的发送到方式发发送到发送到发的发送到发送到份士大夫"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold"/>
</LinearLayout>
</LinearLayout>
改为 invisible 之后,java代码不用做任何的设置,即可恢复滚动,当然 invisible 也有坑 因为,invisible 会占用View空间,只要不是新手都知道 invisible 跟 gone 的区别。