Android 单行文本的跑马灯
来源:互联网 发布:淘宝汉堡妈代购假货 编辑:程序博客网 时间:2024/06/08 03:44
最近项目有一个实现跑马灯效果的需求,需求很简单,就是单行文本(只有几个字)无限循环的效果,最开始也是百度和Github上找,找寻半天不是有BUG就是无法达到需求,最后在一位博主jixiaolong<microjixl@gmail.com>的github上借鉴了他所写的自定义View,该博主的自定义控件是作为多行文本使用的,但是该控件也有BUG,就是多行文本切换的太不自然,或者说,实际中用不成。因此本文介绍的控件只针对单行文本使用,滑动自然,不反人类,先看下效果:
废话不多说,奉上具体用法,再强调一遍,只适合单行文本!!!!!!!!!!!
1.自定义View
import java.util.List;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Paint;import android.text.TextUtils.TruncateAt;import android.util.AttributeSet;import android.view.Gravity;import android.widget.TextView;/** * @author jixiaolong<microjixl@gmail.com> */@SuppressLint("AppCompatCustomView")public class BulletinView extends TextView implements Runnable{private int currentScrollX;// 当前滚动的位置private boolean isStop = false; private int textWidth; private List<String> mList;private final int REPEAT = 1;private int repeatCount = 0;private int currentNews = 0;public BulletinView(Context context) { super(context); init();// TODO Auto-generated constructor stub } public BulletinView(Context context, AttributeSet attrs) { super(context, attrs); init();} public BulletinView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init();} public void init(){setClickable(true);setSingleLine(true);setEllipsize(TruncateAt.MARQUEE);setGravity(Gravity.START|Gravity.CENTER_VERTICAL);}public void setData(List<String> mList){if(mList == null || mList.size()==0){return;}this.mList = mList; currentNews = 0;String n = mList.get(currentNews);setText(n);setTag(n);startScroll();}@Overridepublic void setText(CharSequence text, BufferType type) {super.setText(text, type);MeasureTextWidth(); }@Overridepublic void onScreenStateChanged(int screenState) {super.onScreenStateChanged(screenState);if(screenState == SCREEN_STATE_ON){startScroll();}else{stopScroll();}}/** * 获取文字宽度 */ private void MeasureTextWidth() { Paint paint = this.getPaint(); String str = this.getText().toString(); textWidth = (int) paint.measureText(str); } @Override public void run() { if(textWidth < 1){//title null api error.if(mList != null && mList.size() > 0){nextNews();}else{return;}}currentScrollX += 5;// 滚动速度scrollTo(currentScrollX, 0); if (isStop) { return; }if (getScrollX() >= textWidth) {currentScrollX = -getWidth();if(repeatCount >= REPEAT){//reach max times 我对原文的修改只有这么一点 startif (mList.size()==1){scrollTo(currentScrollX, 0);}else {nextNews();scrollTo(currentScrollX,0);}//我对原文的修改只有这么一点 end}else{repeatCount ++;}}postDelayed(this, 50); }private void nextNews(){repeatCount = 0;currentNews ++;currentNews = currentNews%mList.size();//cycle indexString n = mList.get(currentNews);setText(n);setTag(n);}// 开始滚动 public void startScroll() { isStop = false; this.removeCallbacks(this); post(this); } // 停止滚动 public void stopScroll() { isStop = true; } }
2.xml使用
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.anshi.chattraining.BulletinView android:id="@+id/tv_bulletin" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:textColor="@android:color/white" android:padding="10dp" android:background="#b0000000" android:textSize="20sp" /></RelativeLayout>3.Activity使用
import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import java.util.ArrayList;import java.util.List;/** * * Created by yulu on 2017/12/12. */public class MarqueeActivity extends AppCompatActivity { private BulletinView view; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.marquee_activity); view = (BulletinView) findViewById(R.id.tv_bulletin); List<String> mList = new ArrayList<>(); mList.add("今天共找寻成功22对"); view.setData(mList); } @Override protected void onResume() { view.startScroll(); super.onResume(); } @Override protected void onPause() { view.stopScroll(); super.onPause(); }}end.........................就这样把,其他的用SurfaceView做的多半都有些问题,还是用TextView做吧。博主原文地址
阅读全文
0 0
- Android 单行文本的跑马灯
- android中TextView实现单行跑马灯
- android中TextView实现单行跑马灯
- TextView: android中TextView实现单行跑马灯
- Android TextView 单行文本的坑
- textview 长文本 跑马灯的实现
- 一个文本跑马灯的“学”案
- 单行文字向上跑马灯滚动显示
- TextView单行滚动效果(跑马灯)
- 跑马灯式文本
- Android 文本实现跑马灯效果 用自带的TextView控件
- android的跑马灯效果
- Android 跑马灯的方法
- android的textView跑马灯
- android跑马灯的效果
- Android跑马灯的实现
- android的跑马灯效果
- android 垂直的跑马灯
- java web项目为什么我们要放弃jsp?
- Log4j使用详解(log4j.XML格式)
- PINGCAP-tidb入门到跑路
- Nvidia TX2 刷机 JetPack 3.1
- canal系列—配置文件介绍
- Android 单行文本的跑马灯
- hash简介
- 42、C#:EF框架的:导航属性,加载记录追踪方式(MergeOption),添加内存内容到新上下文(Attach)
- IE上ORACLE OEM 证书错误 , 导航阻止,无法”继续浏览此网站”
- tensorboard报错
- 听见丨特朗普命令NASA让宇航员重返月球,最终前往火星 Airbnb考虑引入VR和AR技术 让租客预览房间
- 初创企业墓志铭:创业死亡榜背后的逻辑
- HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
- spark on yarn的cpu使用