网上的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. 在8086中,[ idata],[bx]表示内存单元时。可能是一个字节,也可能是一个字。

    可能表示一个字节,也可能表示一个字.主要由指令中另一个计算对象决定.如al表示一个字节.ax就表示一个字. 这个区别主要体现在循环中,偏移地址的循环变量是加1还是加2,al是偏移地址加1,ax是偏移地 ...

  2. [状压dp]HDOJ4539 郑厂长系列故事——排兵布阵

    中文题,题意不再赘述 对于“?”这一格,它所能攻击到的(曼哈顿距离为2的) 前方的 即“√”的四个位置 那么与此格有关的即它前方两行(即状压这两行) 首先预处理每行能满足的: i 和(i<< ...

  3. Oracle系列之视图

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 创建视图,把tb_Employee表sal<1000的雇员,映射到该视图( view) create or replace vi ...

  4. Java开发所需架包官方下载

    1.连接MySQL数据库所需架包点击进入官网下载 2.连接Oracle数据库所需架包点击进入官网下载 3.JUnit测试所需架包点击进入官网下载或者点击进入官网下载 4.Struts所需架包点击进入官 ...

  5. MapReduce的数据流程、执行流程

    MapReduce的数据流程: 预先加载本地的输入文件 经过MAP处理产生中间结果 经过shuffle程序将相同key的中间结果分发到同一节点上处理 Recude处理产生结果输出 将结果输出保存在hd ...

  6. C# winform 渐变效果

    在用到vs的兴奋过程中,想给程序做个启动画面,我采用了显示Aform,过一段时间,隐藏这个Aform,showdialog下一个Bform,closeAForm这个方法来做了,不知道大家有没有跟好的办 ...

  7. BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1613 n分钟,疲劳值上限是m,开始时疲劳值为0.第i分钟可以跑d[i]米.在某一时刻,如果疲劳 ...

  8. __cdecl、__stdcall、__fastcall、thiscall 进栈、出栈区别

    https://en.wikipedia.org/wiki/X86_calling_conventions https://msdn.microsoft.com/en-us/library/984x0 ...

  9. LightOJ 1220 Mysterious Bacteria 水题

    暴力就行了,找出素因子,正的最多是30,然后负的最多是31(这一点wa了一次) #include <cstdio> #include <iostream> #include & ...

  10. Growling Gears

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11587 G Growling GearsThe Best A ...