Android Maquee的幾種實現方式

最近在做一個盒子應用,有個地方是走馬燈。實現方式總結一下(蒼蠅也是肉啊)

二話不說先看效果:
這裏寫圖片描述

就是有焦點的時候需要進行跑馬燈效果,沒有焦點的時候文字末尾收縮成省略號

有幾種實現的方式:
實現方式一:使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章