废话少说 , 先展示下效果图:
图一是只有一条信息时 , 不滚动展示 ;
图二是有多条信息时 , 滚动展示信息.

图一

图二

代码如下:

☆☆☆自定义控件的代码:

package com.eg.lyx.ctsscrolltextview;import android.content.Context;import android.graphics.Color;import android.text.TextUtils;import android.util.AttributeSet;import android.util.TypedValue;import android.view.Gravity;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;/** * Created by li_yx on 2017/5/17. */public class CtsScrollTextView extends LinearLayout {    private Context mContext;    private TextView textViews[] = new TextView[3];    private LinearLayout llayout;    private String curText = null;    /***     * 每次动画执行时间     */    private int mAnimTime = 500;    /**     * 停留时间     */    private int mStillTime = 1500;    /***     * 轮播的string     */    private List mTextList;    /***     * 当前轮播的索引     */    private int currentIndex = 1;    /***     * 动画模式     */    private int animMode = 0;// 默认向上 0--向上,1--向下    public final static int ANIM_MODE_UP = 0;    public final static int ANIM_MODE_DOWN = 1;    private TranslateAnimation animationDown, animationUp;    public CtsScrollTextView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        initViews();    }    private void initViews() {        llayout = new LinearLayout(mContext);        llayout.setOrientation(LinearLayout.VERTICAL);        this.addView(llayout);        textViews[0] = addText();        textViews[1] = addText();        textViews[2] = addText();    }    /***     * 当界面销毁时     */    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        stopAutoScroll();// 防止内存泄漏的操作    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        setViewsHeight();    }    /***     * 重新设置VIEW的高度     */    private void setViewsHeight() {        for (TextView tv : textViews) {            LayoutParams lp = (LayoutParams) tv.getLayoutParams();            lp.height = getHeight();            lp.width = getWidth();            tv.setLayoutParams(lp);            tv.setTextColor(getResources().getColor(R.color.white));            tv.setMaxLines(2);            tv.setEllipsize(TextUtils.TruncateAt.END);        }        LayoutParams lp2 = (LayoutParams) llayout.getLayoutParams();        lp2.height = getHeight() * (llayout.getChildCount());        lp2.setMargins(0, -getHeight(), 0, 0);// 使向上偏移一定的高度,用padding,scrollTo都分有问题        llayout.setLayoutParams(lp2);    }    public void setTextList(List mTextList) {        this.mTextList = mTextList;    }    private TextView addText() {        TextView tv = new TextView(mContext);        tv.setGravity(Gravity.CENTER_VERTICAL);        llayout.addView(tv);        return tv;    }    /***     * 设置初始的字     */    public void setText(String curText) {        this.curText = curText;        textViews[1].setText(curText);    }    /***     * 开始自动滚动     */    public void startAutoScroll() {        if (mTextList == null || mTextList.size() == 0 || mTextList.size() == 1) {            return;        }        // 先停止动画        stopAutoScroll();        this.postDelayed(runnable, mStillTime);// 可用runnable来代替hander或者 timer    }    /***     * 停止自动滚动     */    public void stopAutoScroll() {        this.removeCallbacks(runnable);    }    private Runnable runnable = new Runnable() {        @Override        public void run() {            currentIndex = (currentIndex) % mTextList.size();            switch (animMode) {                case ANIM_MODE_UP:                    setTextUpAnim(mTextList.get(currentIndex));                    break;                case ANIM_MODE_DOWN:                    setTextDownAnim(mTextList.get(currentIndex));                    break;            }            currentIndex++;            CtsScrollTextView.this.postDelayed(runnable, mStillTime + mAnimTime);        }    };    public void setTextUpAnim(String text) {        this.curText = text;        textViews[2].setText(text);        up();// 向上的动画    }    public void setTextDownAnim(String text) {        this.curText = text;        textViews[0].setText(text);        down();// 向上的动画    }    /***     * 向上动画     */    private void up() {        llayout.clearAnimation();        if (animationUp == null)            animationUp = new TranslateAnimation(0, 0, 0, -getHeight());        animationUp.setDuration(mAnimTime);        llayout.startAnimation(animationUp);        animationUp.setAnimationListener(listener);    }    /***     * 向下动画     */    public void down() {        llayout.clearAnimation();        if (animationDown == null)            animationDown = new TranslateAnimation(0, 0, 0, getHeight());        animationDown.setDuration(mAnimTime);        llayout.startAnimation(animationDown);        animationDown.setAnimationListener(listener);    }    /***     * 动画监听,动画完成后,动画恢复,设置文本     */    private Animation.AnimationListener listener = new Animation.AnimationListener() {        @Override        public void onAnimationStart(Animation arg0) {        }        @Override        public void onAnimationRepeat(Animation arg0) {        }        @Override        public void onAnimationEnd(Animation arg0) {            setText(curText);        }    };    //-----------------------------------以下是textView要用到一些基本方法-----------------------------------    public void setGravity(int graty) {        for (TextView tv : textViews) {            tv.setGravity(graty);        }    }    public void setTextSize(int dpSize) {        for (TextView tv : textViews) {            tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dpSize);        }    }    public void setTextColor(int color) {        for (TextView tv : textViews) {            tv.setTextColor(color);        }    }    public void setAnimTime(int mAnimTime) {        this.mAnimTime = mAnimTime;    }    public void setStillTime(int mStillTime) {        this.mStillTime = mStillTime;    }    public void setCurrentIndex(int currentIndex) {        this.currentIndex = currentIndex;    }    public void setDuring(int during) {        this.mAnimTime = during;    }    public void setAnimMode(int animMode) {        this.animMode = animMode;    }}

☆☆☆布局代码:

<?xml version="1.0" encoding="utf-8"?>            

☆☆☆Activity代码:

package com.eg.lyx.ctsscrolltextview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Gravity;import android.view.View;import java.util.ArrayList;import static android.R.id.list;public class MainActivity extends AppCompatActivity {    private CtsScrollTextView ctv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ctv = (CtsScrollTextView) findViewById(R.id.ctv);        ArrayList list = new ArrayList<>();        list.add(getResources().getString(R.string.text1));        list.add(getResources().getString(R.string.text2));        list.add(getResources().getString(R.string.text3));        list.add("第四条信息");        list.add("第五条信息");        if (list.size() != 0) {            ctv.setText(list.get(0));        }        ctv.setTextList(list);        ctv.startAutoScroll();    }}

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android基本程序单元Activity
  3. android――SharedPreferences存放数据
  4. Android无需申请权限拨打电话的两种方式
  5. android的TabActivity
  6. android jni调用opencv库失败 could not load library libopencv
  7. 【Android(安卓)开发教程】链接Activities
  8. Android(安卓)源码阅读之建立3G网络流程
  9. 解决使用android studio中的git update后报错当前未提交的代码被

随机推荐

  1. Study:基于Selenium进行Android客户端自动
  2. android listview 的使用方法
  3. Android(安卓)SDK Manager 更新代理配置
  4. 第六篇 Gallery与ImageSwitcher混合使用
  5. Android(安卓)解决 Toolbar 的 Menu 图标
  6. Android(安卓)bluetooth介绍(四): a2dp conn
  7. Android(安卓)DrawerLayout 使用
  8. android属性动画最简单使用
  9. 【Android】九宫格的实现
  10. Android(安卓)viewpager 拿到当前显示的