Android使用Canvas实现跑马灯
网上的很多的教程都是通过更改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实现跑马灯的更多相关文章
- canvas九宫格跑马灯
canvas九宫格跑马灯抽奖 之前用dom写了一版,部分 安卓机会卡顿,换用canvas dom版本九宫格抽奖
- Android:TextView 自动滚动(跑马灯) (转)
Android:TextView 自动滚动(跑马灯) TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...
- android使用TextView实现跑马灯的效果(1)
android使用TextView实现跑马灯的效果 1.activity_main.xml <?xml version="1.0" encoding="utf-8& ...
- Android成长日记-仿跑马灯的TextView
在程序设计中有时候一行需要显示多个文字,这时候在Android中默认为分为两行显示,但是对于必须用一行显示的文字需要如何使用呢? ----------------------------------- ...
- Android自定义之TextView跑马灯的监听
TextView都有跑马灯的效果,如果说让你去监听跑马灯效果的执行,我觉得这个需求有点二了,但是也要实现. 思路: 1.自定义View 继承TextView 这种方法过于麻烦,只是监听一个跑马灯 ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- Android 开发笔记___textvieww__跑马灯效果
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Android 使用TextView实现跑马灯效果
前言 我们在开发中经常会遇到一个小问题.比如下面一个小例子: 这个文字太长,单行中导致无法全部显示出来,这就是今天要实现的功能. 当然,百度中也有很多这种解决方案. 其中有一种,例如: <Tex ...
- Android使用TextView实现跑马灯效果(自定义控件)
对于一个长的TetxView 折行显示是一个很好的办法,另一种方法就是跑马灯显示(单行滚动) 1.折行显示的长TextView <LinearLayout xmlns:android=" ...
随机推荐
- 改进版getpass库
编程伊始 正式实施 改进版 源码 以数字显示 以自定义分隔符delimiter显示 如何使用 下载及安装 在您的代码中使用 源码下载 总结 用过Linux的都知道,尤其是进行使用包管理软件类似于apt ...
- ROS机器人程序设计(原书第2版)补充资料 教学大纲
ROS机器人程序设计(原书第2版) 补充资料 教学大纲 针对该书稍后会补充教学大纲.教案.多媒体课件以及练习题等. <ROS机器人程序设计>课程简介 课程编号:XXXXXX 课程名称:RO ...
- Android中GridView的一些特殊属性
GridView的一些特殊属性: 1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidt ...
- springmvc注解形式的开发参数接收
springmvc基于注解的开发 注解第一个例子 1. 创建web项目 springmvc-2 2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- sprimgmvc 注解 ...
- 关闭Win10自动更新
使用过Windows10系统的小伙伴们都清楚,在Windows10中强制开启了自动更新功能,我们无法通过常规的办法关闭自动更新功能,那么我们该怎么去关闭自动更新呢?欢迎速来围观我的经验啦. 工具/原料 ...
- 百度地图隐藏缩放控件比例尺Logo
对于百度地图最新版V3.7.3,以前的隐藏控件方法失效,可用以下方法隐藏: 1.隐藏缩放控件: mMapView.showZoomControls(false); 2.隐藏比例尺: mMapView. ...
- 2、Android构建本地单元测试
如果你的单元测试在Android中没有依赖或者只有简单的以来,你可以在你的本地开发环境中运行你的测试.这种测试比较高效因为它能让你避免将整个app安装到物理设备或虚拟机中执行单元测试.最后,执行单元测 ...
- Eclipse中pydev开发,python重载__init__报错,是可以正常执行
python支持函数重载 而在使用Eclipse的pydev开发时,重载函数__init__时,却出现了错误duplicated 我想不到解决办法,但是居然能正常执行. pydev报错是编译错误,而p ...
- Eclipse 快捷方式 指定 固定 workspace
右点击Eclipse快捷键,然后点击属性, 把目标(target)内容修改如下: clipse -data c:\myworkspace -vm c:\ j2sdk1.5\jre\bin\javaw ...
- ROS_Kinetic_13 ROS数据录制与回放
ROS_Kinetic_13 ROS数据录制与回放 官网教程:http://wiki.ros.org/cn/ROS/Tutorials/Recording%20and%20playing%20back ...