Android Maquee的几种实现方式

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

二话不说先看效果:
Android Maquee的几种实现方式_第1张图片

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

有几种实现的方式:
实现方式一:使用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

你可能感兴趣的:(Android)