Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯
网上的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();
}
});
}
}
Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯的更多相关文章
- android开发 textview根据字数长度自动调整字体大小
需求:根据输入的值实时显示到textview中预览,但是字体大小是要自动适配的 网上有一个代码,但是在我这里不能用,注意方法:refitText 注释掉的是之前的代码 import com.cars ...
- Android开发 TextView的开发记录
前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...
- Android开发:TextView添加超链接的简便方法
TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...
- Android开发--TextView的应用
1.概述 TextView主要用于Activity中文本的应用.其中layout中xml文件(activity)设置文本的宽度,高度,ID:values中strings.xml设置文本内容. Text ...
- HTML5商城开发四 多图或多商品的水平滚动展示
一.效果图 二.实现 样式: .horz_scroll { float: left; width: 20px; height: 130px; padding-top: 100px; padding-l ...
- Android 高级UI设计笔记05:使用TextView实现跑马灯的效果
1. 使用TextView属性实现跑马灯的效果: (1). 新建一个Android工程,命名为"MarqueeTextViewDemo",如下: (2). 来到activity_m ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- 【转】Android开发笔记(序)写在前面的目录
原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...
- android:为TextView添加样式、跑马灯、TextSwitcher和ImageSwitcher实现平滑过渡
一.样式 设置下划线: textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线 textView.getPaint().setAnt ...
随机推荐
- MongoDB实战指南(四):MongoDB的Journaling日志功能
mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...
- [wikioi]装箱问题
http://wikioi.com/problem/1014/ 01背包问题是最经典的动态规划之一,这道题目甚至是这其中还简单的一种,因为价值就是本身的重量了.本来比如,w是总重量限制,v[]是每个的 ...
- PDF文件结构
概述PDF是一种不依赖应用程序软件.硬件和操作系统的文件格式.PDF页包含文本.图形和图像.页面外观由内容流(content stream)描述,内容流包含一些列图形对象(graphics objec ...
- java.sizeOf
Introduction With java.SizeOf you can measure the real memory size of your Java objects. Download it ...
- Android Paint和Color类
要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...
- ruby编程语言-学习笔记4(第4章 表达式和操作符)
4.6.9 范围 Flip-Flops: ..和... ..和... 操作符不是基于方法的,无法重定义.(优先级比较低) x+1 .. x*x #可以认为是x+1 至 x*x 的范围 因为操作 ...
- CoreCLR源码探索(二) new是什么
前一篇我们看到了CoreCLR中对Object的定义,这一篇我们将会看CoreCLR中对new的定义和处理 new对于.Net程序员们来说同样是耳熟能详的关键词,我们每天都会用到new,然而new究竟 ...
- Android 不能勾选 Project Build Target
再勾选完project bulid target,从新返回这个页面,发现还是没有被勾选上. 从新刷新一下项目,原因是project.properties配置文件没有加载上. 下回导入的项目第一件事就是 ...
- arm linux kernel启动之start_kernel
了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...
- 洛谷P1118 数字三角形游戏
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...