Android textview和listview实现水平自动滚动的走马灯效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bit_kaki/article/details/70158805

当我们遇到需要在一个textview里显示较长文字时候,往往有以下几种考虑:

          1.换行,Android里本身也是这样在考虑;

          2.可以进行水平或者垂直滑动;

          3.采用走马灯效果。

          其实这三种要实现都不难,根据实际情况进行选择就是了。不过我在具体实现走马灯时候遇到了一些问题,后来参考了下大神的代码,得以解决,记录一下。

          代码地址是:http://download.csdn.net/download/wds1181977/5997065

          具体情况如下:


          textview里要实现走马灯效果,主要需要三点:

          设置单行显示;设置文本超出textview后的效果;以及最重要的是设置焦点。

          对应代码如下:

<TextView
    android:id="@+id/tv_title"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:text="基本信息"
    android:textColor="@color/black"
    android:gravity="center_vertical"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"  />

         focusable和fucosableInTouchMode是配套用来设置获取焦点的;singleLine是设置单行;ellipsize是设置文本过长的效果,其中marquee是走马灯的效果,marqueeRepeatLimit是自动滚动显示多少次,marquee_forver是一直滚动。

         这样写好了以后,但实际我运行的时候并没有出现走马灯的效果,而是显示了最前面部分,然后就是,,,省略掉后面内容了。

         找了一下原因,就是在这个获取焦点上。

         一般情况我们的布局都比demo复杂,静态的设置focusable=true甚至动态的在代码用textview.setfocusable里设置并不能保证焦点就是在这个textview上。

         所以更好的办法是写一个自定义的textview,将焦点写死。比如:

public class MTextView  extends TextView {

    public MTextView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean isFocused() {
        // TODO Auto-generated method stub
        return true;
    }

}
        然后在代码里 引用:

<com.diit.apppro.presentation.view.component.common.MTextView
    android:id="@+id/tv_title"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:text="基本信息"
    android:textColor="@color/black"
    android:gravity="center_vertical"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"  />
         这样就可以实现了。

         如果是listview的话,只需要在每个item里的textview引用这个自定义view即可实现各自的走马灯效果。


阅读更多

没有更多推荐了,返回首页