Android Maquee的几种实现方式

来源:互联网 发布:linux查看snmp服务 编辑:程序博客网 时间:2024/05/11 21:38

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

二话不说先看效果:
这里写图片描述

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

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

0 0