android 应用有时候需要做一个广告栏,可以做文字闪烁,跑马灯等效果,文字闪烁可以放在线程里面执行,多少秒过后设置文字的TextColor即可,跑马灯效果很少接触,之前写了一个demo,但是实现的效果不是自己想要的,普遍的跑马灯效果直接在layout里面的TextView控件加上如下属性即可实现:
  

android:marqueeRepeatLimit="marquee_forever"
android:ellipsize="marquee"
android:scrollHorizontally="true"
android:focusableInTouchMode="true"
android:focusable="true"

但是这种效果有一个致命的问题,文字的宽度必须要大于TextView设置的宽度(android:layout_width=”“),有时候需求文字很少,甚至根本没法实现跑马灯效果,这是让人头疼的事。

当然肯定有解决的办法,第一想到的就是自定义,急需要用的时候,自定义显得太麻烦了,耗时间,这里给大家介绍一个封装好的jar,下面一起来实现这个效果。

先要加入marquee的jar包,在项目的build.gradle文件中加入

compile 'com.dalong:marqueeview:1.0.0'

这里面只有一个类,自定义的MarqueeView,简单的来看一下:

package com.dalong.marqueeview;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;/*** Created  16/5/15.*/
public class MarqueeView  extends SurfaceView implements SurfaceHolder.Callback{public Context  mContext;private float mTextSize = 100; //字体大小private int mTextColor = Color.RED; //字体的颜色private int mBackgroundColor=Color.WHITE;//背景色private boolean mIsRepeat;//是否重复滚动private int mStartPoint;// 开始滚动的位置  0是从最左面开始    1是从最末尾开始private int mDirection;//滚动方向 0 向左滚动   1向右滚动private int mSpeed;//滚动速度private SurfaceHolder holder;private TextPaint mTextPaint;private MarqueeViewThread mThread;private String margueeString;private int textWidth=0,textHeight=0;private int ShadowColor=Color.BLACK;public int currentX=0;// 当前x的位置public int sepX=5;//每一步滚动的距离public MarqueeView(Context context) {this(context,null);}public MarqueeView(Context context, AttributeSet attrs) {this(context, attrs,0);}public MarqueeView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.mContext=context;init(attrs, defStyleAttr);}private void init(AttributeSet attrs, int defStyleAttr) {TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MarqueeView, defStyleAttr, 0);mTextColor = a.getColor(R.styleable.MarqueeView_textcolor, Color.RED);mTextSize = a.getDimension(R.styleable.MarqueeView_textSize, 48);mBackgroundColor=a.getColor(R.styleable.MarqueeView_marqueebackground,Color.BLACK);mIsRepeat=a.getBoolean(R.styleable.MarqueeView_isRepeat,false);mStartPoint=a.getInt(R.styleable.MarqueeView_startPoint,0);mDirection=a.getInt(R.styleable.MarqueeView_direction,0);mSpeed=a.getInt(R.styleable.MarqueeView_speed,20);a.recycle();holder = this.getHolder();holder.addCallback(this);mTextPaint = new TextPaint();mTextPaint.setFlags(Paint.ANTI_ALIAS_FLAG);mTextPaint.setTextAlign(Paint.Align.LEFT);}public void setText(String msg){if(!TextUtils.isEmpty(msg)){measurementsText(msg);}}protected void measurementsText(String msg) {margueeString=msg;mTextPaint.setTextSize(mTextSize);mTextPaint.setColor(mTextColor);mTextPaint.setStrokeWidth(0.5f);mTextPaint.setFakeBoldText(true);// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
//        mTextPaint.setShadowLayer(5, 3, 3, ShadowColor);textWidth = (int)mTextPaint.measureText(margueeString);Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();textHeight = (int) fontMetrics.bottom;WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();if(mStartPoint==0)currentX=0;elsecurrentX=width-getPaddingLeft()-getPaddingRight();}@Overridepublic void surfaceCreated(SurfaceHolder holder) {this.holder=holder;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {if(mThread!=null)mThread.isRun = true;}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(mThread!=null)mThread.isRun = false;}/*** 开始滚动*/public  void startScroll(){if(mThread!=null&&mThread.isRun)return;mThread = new MarqueeViewThread(holder);//创建一个绘图线程mThread.start();}/*** 停止滚动*/public  void stopScroll(){if(mThread!=null){mThread.isRun = false;mThread.interrupt();}mThread=null;}/*** 线程*/class MarqueeViewThread extends Thread{private SurfaceHolder holder;public boolean isRun ;//是否在运行public  MarqueeViewThread(SurfaceHolder holder) {this.holder =holder;isRun = true;}public void onDraw() {try {synchronized (holder) {if (TextUtils.isEmpty(margueeString)) {Thread.sleep(1000);//睡眠时间为1秒return;}Canvas canvas = holder.lockCanvas();int paddingLeft = getPaddingLeft();int paddingTop = getPaddingTop();int paddingRight = getPaddingRight();int paddingBottom = getPaddingBottom();int contentWidth = getWidth() - paddingLeft - paddingRight;int contentHeight = getHeight() - paddingTop - paddingBottom;int centeYLine = paddingTop + contentHeight / 2;//中心线if(mDirection==0) {//向左滚动if(currentX <=-textWidth){if(!mIsRepeat){//如果是不重复滚动mHandler.sendEmptyMessage(ROLL_OVER);}currentX=contentWidth;}else{currentX-=sepX;}}else {//  向右滚动if(currentX>=contentWidth){if(!mIsRepeat){//如果是不重复滚动mHandler.sendEmptyMessage(ROLL_OVER);}currentX=-textWidth;}else{currentX+=sepX;}}if(canvas!=null)canvas.drawColor(mBackgroundColor);canvas.drawText(margueeString,currentX, centeYLine+dip2px(getContext(),textHeight)/2,mTextPaint);holder.unlockCanvasAndPost(canvas);//结束锁定画图,并提交改变。int a=textWidth/margueeString.trim().length();int b=a/sepX;int c=mSpeed/b==0?1:mSpeed/b;Thread.sleep(c);//睡眠时间为移动的频率}}catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while (isRun) {onDraw();}}}public static  final  int  ROLL_OVER =100;Handler mHandler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case ROLL_OVER:stopScroll();if(mOnMargueeListener!=null){mOnMargueeListener.onRollOver();}break;}}};/*** dip转换为px* @param context* @param dpValue* @return*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}public void reset(){int contentWidth = getWidth() - getPaddingLeft() - getPaddingRight();if(mStartPoint==0)currentX=0;elsecurrentX=contentWidth;}/*** 滚动回调*/public interface OnMargueeListener{void onRollOver();//滚动完毕}OnMargueeListener mOnMargueeListener;public void setOnMargueeListener(OnMargueeListener mOnMargueeListener){this.mOnMargueeListener=mOnMargueeListener;}
}

以上代码写明了注释,就不多说了,大家可以了解下。

下面先写一个xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><com.dalong.marqueeview.MarqueeView
            android:id="@+id/tv_marquee"android:layout_width="match_parent"android:layout_height="wrap_content"app:direction="left"app:isRepeat="true"app:speed="50"app:startPoint="end"app:textSize="12sp"app:textcolor="#E72803" /></LinearLayout></LinearLayout>

只加了一个自定义控件,app:direction=”left” 表示向左滚动,根据自己的需求设定方向;app:isRepeat=”true” 是否重复滚动;app:speed=”100” 设置滚动的速度,值越小速度越快,值越大速度越慢,app:startPoint=”end” 是文字的起始点。

经亲自测试:该自定义控件只能再layout里面使用一次,不可重复使用多个。

然后再MainActivity里面设置开始滚动就OK了,还是把代码贴出来吧!

package com.lai.marqueedemo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import com.dalong.marqueeview.MarqueeView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MarqueeView marqueeView = (MarqueeView)findViewById(R.id.tv_marquee);marqueeView.setFocusable(true);marqueeView.requestFocus();marqueeView.setText("我使劲跑");//设置文本marqueeView.startScroll(); //开始}}

这样使用起来就方便了,一起看下其效果:

源码下载地址

Android——TextView实现真正的跑马灯效果相关推荐

  1. android 图片跑马灯动画,【Android自定义View】- 文本跑马灯效果

    简介 有些时候,文字过长,或者有多条需要展示的文本时,我们需要将文本进行左右滚动,多条文本时,还得上下滚动以实现展示不同的文本内容.这时候就需要我们自定义view来实现文本跑马灯效果了. 效果图 jj ...

  2. TextView属性大全及跑马灯效果

    TextView控件常见属性: android:autoLink :设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phon ...

  3. Android移动开发之【通往安卓的神奇之旅】TextView和ImageView 实现跑马灯效果

    文章目录 1 textview 1.1 介绍属性(全) 1.2 自带跑马灯代码 2 imageview 1 textview 1.1 介绍属性(全) android:autoLink设置是否当文本为U ...

  4. android跑马灯效果横向,Android自定义View实现纵向跑马灯效果详解

    首先看看效果图(录制的gif有点卡,真实的效果还是很流畅的) 实现思路 通过上面的gif图可以得出结论,其实它就是同时绘制两条文本信息,然后通过动画不断的改变两条文本信息距离顶部的高度,以此来实现滚动 ...

  5. android:ellipsize = marquee 跑马灯,Android基于TextView属性android:ellipsize实现跑马灯效果的方法...

    本文实例讲述了Android基于TextView属性android:ellipsize实现跑马灯效果的方法.分享给大家供大家参考,具体如下: Android系统中TextView实现跑马灯效果,必须具 ...

  6. Android 使用 ellipsize 实现文字横向移动效果(跑马灯效果)

    实现的效果图如下 ellipsize 可以设置跑马灯效果 具体代码设置如下 <TextViewandroid:layout_width="match_parent"andro ...

  7. TextView的跑马灯效果实现

    TextView的跑马灯效果实现 问题描述 当文字内容过长,但是只允许显示一行时,可以将文字显示为跑马灯效果,即文字滚动显示. 代码实现 第一种方法实现 先查询TextView控件的属性,得到以下信息 ...

  8. TextView跑马灯效果

    转载:http://www.2cto.com/kf/201409/330658.html 一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 androi ...

  9. 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果

    迷你播放器--第一阶段(2) 退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/artic ...

  10. 跑马灯效果影响EditText的焦点

    最近Android项目中想用跑马灯效果,于是写了如下类: public class MarqueeTextView extends TextView { ...... @Override  publi ...

最新文章

  1. 第一学期网络技术知识总汇
  2. “偷鸡”不成的马斯克,终于丢掉了自己的“王位”
  3. 机器人纹身师出世,你敢让它帮你纹身吗?
  4. centos7安装ftp_python 编译安装
  5. 【项目管理】接手一支技术团队,你会做些哪些事?
  6. Oracle中的Raw类型解释
  7. 用css3制作旋转加载动画的几种方法
  8. 19年8月 字母哥 第五章 静态资源与模板引擎的整合 用热点公司网不行
  9. vaadin_嵌入式码头,Vaadin和焊接
  10. 【Julia】ERROR: UndefVarError: linspace not defined
  11. python中的字符类型_八、 python中的数据类型——字符串
  12. 分享几款流程图软件,帮助你熟悉工作流程
  13. linux usb回环程序,在Linux中创建回环设备(loopback device)的方法
  14. word指定页插入页码
  15. C++:实现量化SMM Caplet均匀校准测试实例
  16. cad图文档管理系统,图文档查找困难解决方法
  17. 又有12款APP违规收集用户信息,下架整改
  18. OpenCV色彩空间类型
  19. 企业管理中,商业智能BI主要做哪些事情?
  20. 球球大作战简易版代码(含简单人机)

热门文章

  1. matlab中四元数与三维向量的乘,四元数与三维向量相乘运算法则
  2. poj 1260 dp
  3. 基于HostLink协议的Fins命令读写
  4. 吉首大学期末计算机考试,吉首大学微机原理期末考试试卷.doc
  5. 解决vscode下载慢的问题
  6. 《MLB棒球创造营》:走近棒球运动·坦帕湾光芒队
  7. 计算机显卡风扇有异响,电脑运行中有异响,拍一拍就好了,原来好多人还不知道问题在哪!...
  8. 实验:IP 与 ICMP 分析
  9. html页面排版会乱,窗口缩放导致页面排版错乱的解决方法
  10. 云服务器虚拟化安全,云计算中的安全云服务的资源池化和虚拟化(1)