网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计。这样做有很多的缺点:

1、如果TextView没有获取焦点,那么跑马灯的效果无法实现。

2、如果文本长度小于TextView的宽度,跑马灯的效果无法实现。

3、需要设置很多属性,麻烦。

还有很多教程是通过重写TextView的方式使TextView获得焦点,但是没有解决上面的几个问题。

本教程也是通过重写TextView的方式,准确的说是通过重写View的方式实现跑马灯。

使用到的技术:

1、Paint的使用;

2、Canvas中的drawText方法;

3、线程;

Paint:就是我们俗称的画笔,Android提供了很多的方法对Paint进行设置:

setAntiAlias: 设置画笔的锯齿效果。 

   setColor: 设置画笔颜色。

   setARGB:  设置画笔的a,r,p,g值。 

   setAlpha:  设置Alpha值。 

   setTextSize: 设置字体尺寸。 

   setStyle:  设置画笔风格,空心或者实心。 

   setStrokeWidth: 设置空心的边框宽度。 

   getColor:  得到画笔的颜色。 

   getAlpha:  得到画笔的Alpha值。

Canvas:提供了如下的方法

Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。 

    Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。 

    Canvas(GL gl): 在绘制3D效果时使用,与OpenGL相关。 

    drawColor: 设置Canvas的背景颜色。 

    setBitmap:  设置具体画布。 

    clipRect: 设置显示区域,即设置裁剪区。 

    isOpaque:检测是否支持透明。 

    rotate:  旋转画布 

    setViewport:  设置画布中显示窗口。 

    skew:  设置偏移量。

线程:这方面的资料很多。

以下是代码:

 
package net.songsoft.paomadeng;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.TextView;
/**
* <br>
* CreateDate: 2014-3-25<br>
* Copyright: Copyright(c)<br>
* Company: songsoft<br>
* @author 宋志辉
* @version V1.0.0
* @Description 跑马灯的实现类
*/
public class MarqueeTextView extends TextView implements Runnable {
private Paint m_paint;
private int width;
private String src;
/**
*
* @return src
* @Description 获取字符串
* 2014-3-26::宋志辉::创建此方法</br>
*/
public String getSrc() {
return src;
}
/**
*
* @param src
* @Description 设置字符串
* 2014-3-26::宋志辉::创建此方法</br>
*/
public void setSrc(String src) {
this.src = src;
}
/**
* <br>
* @param context <br>
* @Description 构造函数,对跑马灯的数据进行初始化
* 2014-3-25::宋志辉::创建此构造方法<br>
*/
public MarqueeTextView(Context context) {
super(context);
width = 320;
m_paint = new Paint();
new Thread(this).start();
}
/**
*
* @param strText
* @return
* @Description 获取字符的宽度和高度
* 2014-3-25::宋志辉::创建此方法</br>
*/
Rect GetStringRect(String strText) {
Rect rect = new Rect();
m_paint.getTextBounds(strText, 0, strText.length(), rect);
return rect;
}
/**
*
* @param canvas
* @param txtStr
* @Description 跑马灯的效果
* 2014-3-25::宋志辉::创建此方法</br>
*/
void marquee(Canvas canvas, String txtStr) {
String txtStr2 = txtStr.substring(0, txtStr.length()) ; Rect rect = GetStringRect(txtStr);
int len = txtStr.length();
while((width + rect.width() > 320) && (len > 0))
{
rect = GetStringRect(txtStr.substring(0, len));
len -= 1;
}
m_paint.setColor(Color.BLACK); String txtLeft = txtStr.substring(len, txtStr.length());
if (!txtLeft.equals(""))
{
canvas.drawText(txtLeft, 20, 40, m_paint);
}
String txtRight = txtStr.substring(0, len);
if (!txtRight.equals(""))
{
canvas.drawText(txtRight, width, 40, m_paint);
}
if(width>20){
width-=1;
}else{
width=320;
}
}
/**
*
* @param canvas
* @see android.view.View#onDraw(android.graphics.Canvas)
* @Description 重绘
* 2014-3-25::宋志辉::创建此方法<br>
*/
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
marquee(canvas, this.getSrc());
}
/**
*
* @see java.lang.Runnable#run()
* @Description 线程,刷新界面
* 2014-3-25::宋志辉::创建此方法<br>
*/
@Override
public void run() {
// TODO Auto-generated method stub
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
Thread.currentThread().interrupt();
}
postInvalidate();
}
}
}

Android使用Canvas实现跑马灯的更多相关文章

  1. canvas九宫格跑马灯

    canvas九宫格跑马灯抽奖 之前用dom写了一版,部分 安卓机会卡顿,换用canvas dom版本九宫格抽奖

  2. Android:TextView 自动滚动(跑马灯) (转)

    Android:TextView 自动滚动(跑马灯)       TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...

  3. android使用TextView实现跑马灯的效果(1)

    android使用TextView实现跑马灯的效果 1.activity_main.xml <?xml version="1.0" encoding="utf-8& ...

  4. Android成长日记-仿跑马灯的TextView

    在程序设计中有时候一行需要显示多个文字,这时候在Android中默认为分为两行显示,但是对于必须用一行显示的文字需要如何使用呢? ----------------------------------- ...

  5. Android自定义之TextView跑马灯的监听

    TextView都有跑马灯的效果,如果说让你去监听跑马灯效果的执行,我觉得这个需求有点二了,但是也要实现. 思路: 1.自定义View  继承TextView   这种方法过于麻烦,只是监听一个跑马灯 ...

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

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

  7. Android 开发笔记___textvieww__跑马灯效果

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. Android 使用TextView实现跑马灯效果

    前言 我们在开发中经常会遇到一个小问题.比如下面一个小例子: 这个文字太长,单行中导致无法全部显示出来,这就是今天要实现的功能. 当然,百度中也有很多这种解决方案. 其中有一种,例如: <Tex ...

  9. Android使用TextView实现跑马灯效果(自定义控件)

    对于一个长的TetxView 折行显示是一个很好的办法,另一种方法就是跑马灯显示(单行滚动) 1.折行显示的长TextView <LinearLayout xmlns:android=" ...

随机推荐

  1. CDH集群安装&测试总结

    0.绪论 之前完全没有接触过大数据相关的东西,都是书上啊,媒体上各种吹嘘啊,我对大数据,集群啊,分布式计算等等概念真是高山仰止,充满了仰望之情,觉得这些东西是这样的: 当我搭建的过程中,发现这些东西是 ...

  2. springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)

    在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...

  3. android PM2.5监控demo开发

    最近看到了这个网站是aqicn.org,是一个监控北京空气状态的网站,截图如下 好了,接下来我们利用这个网站返回的json数据来写一个监控北京空气状况尤其是PM2.5的demo. 1.布局文件如下: ...

  4. Android之获取屏幕的尺寸像素及获取状态栏标题栏高度

    在Android的实际开发中,会经常用到获取屏幕的尺寸的问题,以便设置一些布局在屏幕上的固定位置,从而适配各个屏幕的设备. 今天我就来讲一下怎么得到当前设备的屏幕像素吧: 一.在Activity中: ...

  5. 【shell点滴】参数变量

    参数变量故名思议就是用来操作输入参数的变量,知道用户输入了哪些参数,才可以进行相应的处理. 参数变量 作用 $1,$2- 取第几个参数的意思 $* 取出所有的参数,解析参数的分割符环境变量 IFS 来 ...

  6. Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类

    泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制. 好处: 1.将运行时的异常出现问题classcastException.转移到了编译时期.方便程序员调试解决问题,让运行事情问题减少, ...

  7. 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...

  8. Linux技巧:一次删除一百万个文件的最快方法

    最初的测评 昨天,我看到一个非常有趣的删除一个目录下的海量文件的方法.这个方法来自http://www.quora.com/How-can-someone-rapidly-delete-400-000 ...

  9. Ubuntu15.10下制作Linux 操作系统优盘启动盘

    上次电脑出现了一些问题,于是不得不重新装机了.下面就跟大家分享一下我在Ubuntu下制作优盘启动盘的一些心得. 准备原料 我这里用到的是 镜像文件是:debian-8.3.0-amd64-DVD-2. ...

  10. FND Debug Log(FND_LOG_MESSAGES)

    之前每个模块记录日志的方式都不同,都会把日志写到不同的文件中,对于User来说很麻烦,需要记住很多的配置,现在越来越多的模块使用FND Logging来存储日志,比如WIP,RCV,OAF...FND ...