Android Maquee的几种实现方式

    xiaoxiao2021-12-14  46

    最近在做一个盒子应用,有个地方是走马灯。实现方式总结一下(苍蝇也是肉啊)

    二话不说先看效果:

    就是有焦点的时候需要进行跑马灯效果,没有焦点的时候文字末尾收缩成省略号

    有几种实现的方式: 实现方式一:使用TextView,设置相关的属性

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="@dimen/px_positive_410"> <!-- ....此处省略一些 --> <TextView ... android:ellipsize="marquee" android:focusable="true" android:marqueeRepeatLimit="marquee_forever" android:maxLines="1" android:scrollbars="none" /> </RelativeLayout> 对相关的几个属性进行说明: 1> android:ellipsize是表示如果文字长度超过了显示长度,那么应该怎么办,他的值是一个枚举,start/middle/end/marquee分别表示在起始位置、中间位置、结尾位置显示省略号、以及跑马灯方式。 2> focusable必须可以获得焦点,因为跑马灯要有焦点才能跑 3> marqueeRepeatLimit表示获得焦点的情况下跑马灯的重复次数,此处设置为了无限 4> maxLines 这个属性在旧版本中是singleLine表示单行显示

    值得注意的是在我的布局中这个只是一个RecyclerView的Item布局,而设置了这些属性以后,跑马灯并没有跑起来。

    为题就在于如果是一个普通的TextView其中的文字等信息不会发生改变的时候,那么这么设置是没有问题的!!!

    但是因为在一个AdapterView里面(RecyclerView)Item的文字是会发生变化的,因此设置的关于文字的跑马灯属性就失效了。

    于是:在Adapter中设置文字的时候重新进行了设置

    public class BookRecyclerAdapter extends RecyclerView.Adapter<BookRecyclerAdapter.ViewHolder> { @Override public void onBindViewHolder(final ViewHolder holder, int position) { // ... holder.mTextView.setText(mListOfBooks.get(position).getName()); holder.mTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); holder.mTextView.setSingleLine(); holder.mTextView.setMarqueeRepeatLimit(-1); //... } }

    关于实现焦点切换的时候进行跑马灯的启动和停止

    public class BookRecyclerAdapter extends RecyclerView.Adapter<BookRecyclerAdapter.ViewHolder> { //还是在刚才的onBindViewHolder方法中写 holder.itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { holder.mTextView.setSelected(true); holder.mTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); holder.mTextView.setSingleLine(); holder.mTextView.setMarqueeRepeatLimit(-1); } else { holder.mTextView.setSelected(false); holder.mTextView.setFocusableInTouchMode(false); holder.mTextView.setFocusable(false); } } }); }

    这是就有了文章开头的效果!

    第二种方式: 使用第三方控件FocusTextView获得MarqueeView

    public class FocusTextView extends TextView { public FocusTextView(Context context) { super(context); } public FocusTextView(Context context, AttributeSet attrs) { super(context, attrs); } public FocusTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } //将原有TextView上的isFocus方法默认修改为永久获得焦点 @Override public boolean isFocused() { return true; } }

    这个FocusTextView有一些问题。经量不要使用。会产生焦点方面的问题 至于MarqueeView比较专业可以设置跑马灯的动画速度、动画效果、时间间隔等,比较灵活,详细去GitHub上下载。用法相对复杂一点。

    因此我最终选择了简单直接的TextView

    转载请注明原文地址: https://ju.6miu.com/read-970727.html

    最新回复(0)