网上的TextView做跑马灯,大多都是要用到焦点,而且字数要超出滚动区域宽度才能实现滚动,使用起来十分不方便。

这里实现一种真正可控的滚动

(1)不需要焦点

(2)任意字数

(3)滚动从滚动区域右边出来,在左边消失,再从右边出来。

上代码

1、布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" > <Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改变滚动内容1"/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn1"
android:text="改变滚动内容2"/>
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn2"
android:text="退出程序"/>
<com.using.margindemo.MarqueeTextView
android:id="@+id/tvScroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40dp" >
</com.using.margindemo.MarqueeTextView>
</RelativeLayout>

2、滚动控件

package com.using.margindemo;

import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView; public class MarqueeTextView extends TextView { /** 是否停止滚动 */
private boolean mStopMarquee;
private String mText;//文本内容
private float mCoordinateX = 1280;//当前滚动位置
private float mTextWidth;//文本宽度
private int mScrollWidth = 1280;//滚动区域宽度
private int speed = 1;//滚动速度
public float getCurrentPosition() {
return mCoordinateX;
} public void setCurrentPosition(float mCoordinateX) {
this.mCoordinateX = mCoordinateX;
} public int getScrollWidth() {
return mScrollWidth;
} public void setScrollWidth(int mScrollWidth) {
this.mScrollWidth = mScrollWidth;
} public int getSpeed() {
return speed;
} public void setSpeed(int speed) {
this.speed = speed;
} public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setText(String text) {
this.mText = text;
mTextWidth = getPaint().measureText(mText);
//mTextWidth = 1280;
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
mHandler.sendEmptyMessageDelayed(0, 10);
} @Override
protected void onAttachedToWindow() {
mStopMarquee = false;
if (!isEmpty(mText))
mHandler.sendEmptyMessageDelayed(0, 2000);
super.onAttachedToWindow();
} public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
} @Override
protected void onDetachedFromWindow() {
mStopMarquee = true;
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
super.onDetachedFromWindow();
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isEmpty(mText))
canvas.drawText(mText, mCoordinateX, 150, getPaint());
} private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
if (mCoordinateX < (-mTextWidth)) {//文字滚动完了,从滚动区域的右边出来
mCoordinateX = mScrollWidth;
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 500);
}
} else {
mCoordinateX -= speed;
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 30);
}
} break;
}
super.handleMessage(msg);
}
}; }

3、

package com.using.margindemo;

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout; public class MainActivity extends Activity {
private ImageView image;
private MarqueeTextView marqueeTextView;
private Button button1;
private Button button2;
private Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.activity_main); marqueeTextView = (MarqueeTextView)findViewById(R.id.tvScroll); MarginLayoutParams margin1 = new MarginLayoutParams(
marqueeTextView.getLayoutParams());
margin1.setMargins(100, 200, 0, 0);//设置滚动区域位置:在左边距400像素,顶边距10像素的位置
RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(margin1);
layoutParams1.height = 240;//设滚动区域高度
layoutParams1.width = 1000; //设置滚动区域宽度
marqueeTextView.setLayoutParams(layoutParams1);
marqueeTextView.setScrollWidth(1000);
marqueeTextView.setCurrentPosition(100 + 1000);//设置滚动信息从滚动区域的右边出来
marqueeTextView.setSpeed(2);
marqueeTextView.setText("这才是真正的跑马灯效果!");
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
button3 = (Button)findViewById(R.id.btn3);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
marqueeTextView.setText("这才是真正的跑马灯效果!");
}
}); button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
marqueeTextView.setText("温馨提示:挂号或缴费后,请到休息区等候,我们会尽快为您服务,请留意屏幕叫号信息,谢谢!"); }
});
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

Demo下载

Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯的更多相关文章

  1. android开发 textview根据字数长度自动调整字体大小

    需求:根据输入的值实时显示到textview中预览,但是字体大小是要自动适配的 网上有一个代码,但是在我这里不能用,注意方法:refitText  注释掉的是之前的代码 import com.cars ...

  2. Android开发 TextView的开发记录

    前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...

  3. Android开发:TextView添加超链接的简便方法

    TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...

  4. Android开发--TextView的应用

    1.概述 TextView主要用于Activity中文本的应用.其中layout中xml文件(activity)设置文本的宽度,高度,ID:values中strings.xml设置文本内容. Text ...

  5. HTML5商城开发四 多图或多商品的水平滚动展示

    一.效果图 二.实现 样式: .horz_scroll { float: left; width: 20px; height: 130px; padding-top: 100px; padding-l ...

  6. Android 高级UI设计笔记05:使用TextView实现跑马灯的效果

    1. 使用TextView属性实现跑马灯的效果: (1). 新建一个Android工程,命名为"MarqueeTextViewDemo",如下: (2). 来到activity_m ...

  7. Android学习总结——TextView跑马灯效果

    Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...

  8. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  9. android:为TextView添加样式、跑马灯、TextSwitcher和ImageSwitcher实现平滑过渡

    一.样式 设置下划线: textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线 textView.getPaint().setAnt ...

随机推荐

  1. MongoDB实战指南(四):MongoDB的Journaling日志功能

    mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...

  2. [wikioi]装箱问题

    http://wikioi.com/problem/1014/ 01背包问题是最经典的动态规划之一,这道题目甚至是这其中还简单的一种,因为价值就是本身的重量了.本来比如,w是总重量限制,v[]是每个的 ...

  3. PDF文件结构

    概述PDF是一种不依赖应用程序软件.硬件和操作系统的文件格式.PDF页包含文本.图形和图像.页面外观由内容流(content stream)描述,内容流包含一些列图形对象(graphics objec ...

  4. java.sizeOf

    Introduction With java.SizeOf you can measure the real memory size of your Java objects. Download it ...

  5. Android Paint和Color类

    要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...

  6. ruby编程语言-学习笔记4(第4章 表达式和操作符)

    4.6.9 范围  Flip-Flops:  ..和... ..和... 操作符不是基于方法的,无法重定义.(优先级比较低) x+1 .. x*x   #可以认为是x+1 至 x*x 的范围 因为操作 ...

  7. CoreCLR源码探索(二) new是什么

    前一篇我们看到了CoreCLR中对Object的定义,这一篇我们将会看CoreCLR中对new的定义和处理 new对于.Net程序员们来说同样是耳熟能详的关键词,我们每天都会用到new,然而new究竟 ...

  8. Android 不能勾选 Project Build Target

    再勾选完project bulid target,从新返回这个页面,发现还是没有被勾选上. 从新刷新一下项目,原因是project.properties配置文件没有加载上. 下回导入的项目第一件事就是 ...

  9. arm linux kernel启动之start_kernel

    了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...

  10. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...