RunTextView 滾動的TextView,仿淘寶頭條等

廢話不多說直接上代碼智嚷。

水平滾動卖丸,類似跑馬燈

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;
import android.view.ViewDebug;

public class RunTextView extends AppCompatTextView {
    public RunTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public RunTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RunTextView(Context context) {
        super(context);
    }

    /**
     * 當(dāng)前并沒有焦點
     */
    @Override
    @ViewDebug.ExportedProperty(category = "focus")
    public boolean isFocused() {
        return true;
    }
}

下面的是布局文件

<com.cwq.view.RunTextView
        android:id="@+id/tv_runTextView"
        android:layout_width="match_parent"  //寬度可以自定義
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:text="我愛我的祖國,我愛我的祖國盏道,我愛我的祖國稍浆,我愛我的祖國,我愛我的祖國,我愛我的祖國衅枫,我愛我的祖國嫁艇,我愛我的祖國,我愛我的祖國弦撩,我愛我的祖國步咪,我愛我的祖國,我愛我的祖國益楼,我愛我的祖國猾漫,我愛我的祖國,我愛我的祖國偏形,我愛我的祖國静袖,我愛我的祖國,我愛我的祖國俊扭,我愛我的祖國队橙,…"
        android:textColor="#7a583e"/>

仿淘寶頭條:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;


import com.vondear.rxtools.R;

import java.util.List;

/**
 * 仿淘寶首頁的 淘寶頭條滾動的自定義View
 *
 */
public class TextViewVerticalMore extends ViewFlipper {

    private Context mContext;
    private boolean isSetAnimDuration = false;
    private int interval = 5000;
    /**
     * 動畫時間
     */
    private int animDuration = 500;

    public RxTextViewVerticalMore(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        this.mContext = context;
        setFlipInterval(interval);
        Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_in);
        if (isSetAnimDuration) animIn.setDuration(animDuration);
        setInAnimation(animIn);
        Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_out);
        if (isSetAnimDuration) animOut.setDuration(animDuration);
        setOutAnimation(animOut);
    }


    /**
     * 設(shè)置循環(huán)滾動的View數(shù)組
     *
     * @param views
     */
    public void setViews(final List<View> views) {
        if (views == null || views.size() == 0) return;
        removeAllViews();
        for ( int i = 0; i < views.size(); i++) {
            final int position=i;
            //設(shè)置監(jiān)聽回調(diào)
            views.get(i).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(position, views.get(position));
                    }
                }
            });
            addView(views.get(i));
        }
        startFlipping();
    }

    /**
     * 點擊
     */
    private OnItemClickListener onItemClickListener;

    /**
     * 設(shè)置監(jiān)聽接口
     * @param onItemClickListener
     */
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    /**
     * item_view的接口
     */
    public interface OnItemClickListener {
        void onItemClick(int position, View view);
    }
}

anim_marquee_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="100%p"
        android:toYDelta="0"/>
    <alpha
        android:duration="500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

anim_marquee_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromYDelta="0"
        android:toYDelta="-100%p"/>
    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.0"/>
</set>

實現(xiàn)代碼:

 TextViewVerticalMore mUpview1;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      mUpview1 = (TextViewVerticalMore)findViewById(R.id.upview1);
      List<View> views = new ArrayList<>();//存放需要滾動的list
      int size = 11;
      for (int i = 0; i < size; i = i + 2) {
            final int position = i;
            //設(shè)置滾動的單個布局
            LinearLayout moreView = (LinearLayout)           LayoutInflater.from(mContext).inflate(R.layout.item_view, null);
            //初始化布局的控件
            TextView tv1 = (TextView) moreView.findViewById(R.id.tv1);
            TextView tv2 = (TextView) moreView.findViewById(R.id.tv2);

            /**
             * 設(shè)置監(jiān)聽
             */
            moreView.findViewById(R.id.rl).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });
            /**
             * 設(shè)置監(jiān)聽
             */
            moreView.findViewById(R.id.rl2).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });
            //進行對控件賦值
            tv1.setText("五一歡樂與您共享萨惑,XX節(jié)能高清驚喜大促銷捐康。");
            if (size > i + 1) {
                //因為淘寶那兒是兩條數(shù)據(jù),但是當(dāng)數(shù)據(jù)是奇數(shù)時就不需要賦值第二個庸蔼,所以加了一個判斷解总,還應(yīng)該把第二個布局給隱藏掉
                tv2.setText("五一充值送機,你準(zhǔn)備好了嗎姐仅?");
            } else {
                moreView.findViewById(R.id.rl2).setVisibility(View.GONE);
            }

            //添加到循環(huán)滾動數(shù)組里面去
            views.add(moreView);
        }
 mUpview1.setViews(views);
}

布局文件:

<com.cwq.view.TextViewVerticalMore
        android:id="@+id/upview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"/>

item_view.xml

  <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/title_tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="熱議"
            android:textSize="9sp"
            android:padding="3dp"
            android:background="@drawable/textview_border"
            android:layout_marginRight="6dp"
            android:textColor="@color/red" />

        <TextView
            android:id="@+id/tv1"
            android:textColor="@color/black"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/title_tv1"
            android:ellipsize="end"
            android:textSize="14sp"
            android:maxLines="1" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl2"
        android:layout_width="match_parent"
        android:layout_marginTop="5dp"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/title_tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="熱評"
            android:padding="3dp"
            android:textSize="9sp"
            android:background="@drawable/textview_border"
            android:layout_marginRight="6dp"
            android:textColor="@color/red" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/title_tv2"
            android:textColor="@color/black"
            android:ellipsize="end"
            android:textSize="14sp"
            android:maxLines="1" />
    </RelativeLayout>

textview_border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFFFF" />
    <stroke android:width="1dip" android:color="@color/red" />
    <corners
        android:radius="2dp"
       />
</shape>

OK 搞定

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末花枫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掏膏,更是在濱河造成了極大的恐慌劳翰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馒疹,死亡現(xiàn)場離奇詭異佳簸,居然都是意外死亡,警方通過查閱死者的電腦和手機颖变,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門生均,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腥刹,你說我怎么就攤上這事马胧。” “怎么了衔峰?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵漓雅,是天一觀的道長录别。 經(jīng)常有香客問我,道長邻吞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任葫男,我火速辦了婚禮抱冷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梢褐。我一直安慰自己旺遮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布盈咳。 她就那樣靜靜地躺著耿眉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鱼响。 梳的紋絲不亂的頭發(fā)上鸣剪,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音丈积,去河邊找鬼筐骇。 笑死,一個胖子當(dāng)著我的面吹牛江滨,可吹牛的內(nèi)容都是我干的铛纬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼唬滑,長吁一口氣:“原來是場噩夢啊……” “哼告唆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晶密,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤擒悬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惹挟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茄螃,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年连锯,在試婚紗的時候發(fā)現(xiàn)自己被綠了归苍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡运怖,死狀恐怖拼弃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摇展,我是刑警寧澤吻氧,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響盯孙,放射性物質(zhì)發(fā)生泄漏鲁森。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一振惰、第九天 我趴在偏房一處隱蔽的房頂上張望歌溉。 院中可真熱鬧,春花似錦骑晶、人聲如沸痛垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匙头。三九已至,卻和暖如春仔雷,著一層夾襖步出監(jiān)牢的瞬間蹂析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工朽寞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留识窿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓脑融,卻偏偏與公主長得像喻频,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肘迎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容