问题——Android 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">

        <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 的区别。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android中,可以通过设置TextView的一些属性来实现跑马灯效果。其中包括设置ellipsize属性为marquee,marqueeRepeatLimit属性为marquee_forever,focusable属性为true,singleLine属性为true等。通过这些属性的设置,可以让TextView的文字在有限的宽度下实现跑马灯效果,让用户完整地看到所有的文字。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Android——TextView实现真正的跑马灯效果](https://blog.csdn.net/u013836857/article/details/51423393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Android TextView设置跑马灯效果](https://blog.csdn.net/qq_43278826/article/details/122668992)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Android三种方式实现TextView跑马灯效果](https://blog.csdn.net/qq_26440221/article/details/52621302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s清风s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值