关于TextView设置Marquee不滚动问题

1、固定高度导致的

已设置

		android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"

但是不生效。。。

    private void startMarquee() {
        // Do not ellipsize EditText
        if (getKeyListener() != null) return;

        if (compressText(getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight())) {
            return;
        }

        if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected())
                && getLineCount() == 1 && canMarquee()) {
        }
    }

这里判断主要条件有三个:
isFocused() || isSelected():焦点选中或者设置selected=true
getLineCount() == 1:singleLine=“true”
canMarquee()
断点发现canMarquee返回false。

    private boolean canMarquee() {
        int width = mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight();
        return width > 0 && (mLayout.getLineWidth(0) > width
                || (mMarqueeFadeMode != MARQUEE_FADE_NORMAL && mSavedMarqueeModeLayout != null
                        && mSavedMarqueeModeLayout.getLineWidth(0) > width));
    }

断点发现mRight和mLeft为0,其赋值发生在调用判断之后。。。所以这里返回了false。

我断点去看了其他可以正常滚动的TextView。发现了问题:

在makeNewLayout中有一段代码:

if (height != LayoutParams.WRAP_CONTENT && height != LayoutParams.MATCH_PARENT) {
  startMarquee();
} else {
    // Defer the start of the marquee until we know our width (see setFrame())
    mRestartMarquee = true;
}

正常的view走了下面,这个标记mRestartMarquee置为true,然后后面会多次调用restartMarqueeIfNeeded

    private void restartMarqueeIfNeeded() {
        if (mRestartMarquee && mEllipsize == TextUtils.TruncateAt.MARQUEE) {
            mRestartMarquee = false;
            startMarquee();
        }
    }

而出问题的view因为在makeNewLayout中走了if分支,结果又还没layout给mRight和mLeft赋值,导致startMarquee没成功,标志位又是false,导致后面也不会尝试重新startMarquee。

改进方法:高度设为wrap_content

2、RecyclerView中item中的textview没滚动

如上述:

 if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected())
                && getLineCount() == 1 && canMarquee()) {
        }

这个判断中 (isFocused() || isSelected())返回了false,因为我设置的是itemview根布局可以获取焦点,而内部的textview没获取焦点。

改进方法:

itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                v.findViewById(R.id.tv_name).setSelected(hasFocus);
            }
        });
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以通过设置TextView的属性和使用一些代码来实现垂直自动滚动效果。 首先,我们可以使用xml布局文件或者代码动态创建一个TextView。在xml布局文件中,我们可以设置TextView的宽度和高度、文字内容等属性。 接下来,可以在代码中通过设置TextView的属性来实现垂直自动滚动。首先,我们可以使用setMaxLines方法来设置TextView的最大行数,让它只显示一行。然后,可以使用setEllipsize方法来设置TextView的省略方式为Marquee,表示文字超出一行时以滚动的形式显示。最后,再调用setSelected方法来启动滚动效果。 示例代码如下: ```java TextView textView = findViewById(R.id.text_view); textView.setMaxLines(1); textView.setEllipsize(TextUtils.TruncateAt.MARQUEE); textView.setSelected(true); ``` 这样,当TextView的文字内容超过一行时,就会自动以滚动的方式显示。需要注意的是,在xml布局文件中或者代码中,需要将TextView的单行显示设置为true,并且保证TextView可获取焦点才能触发滚动效果。 除了上述方法,还可以使用属性动画或者使用Handler来实现TextView的垂直自动滚动效果。使用属性动画可以设置动画效果的速度和插值器,更加灵活。使用Handler的方式可以自定义滚动的速度和间隔时间。 总之,通过设置TextView的属性和使用一些代码,我们可以实现AndroidTextView的垂直自动滚动效果,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值