1、机顶盒应用中经常用到跑马灯效果,而自己绘制跑马灯效果的关键在于步长和刷新频率的控制,一般情况下,刷新频率不要大于16ms,因为16ms是保证不掉帧的关键时间点,所以就不会出现卡顿的现象,具体实现代码如下:
package com.example.marquee;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
public class CustomTextView extends View {
/**
* 界面刷新时间(ms)
*/
public static final int INVALIDATE_TIME = 15;
/**
* 每次移动的像素点(px)
*/
public static final int INVALIDATE_STEP = 4;
/**
* 一次移动完成后等待的时间(ms)
*/
public static final int WAIT_TIME = 1500;
/**
* 滚动文字前后的间隔
*/
private String space = " ";
private String drawingText = "";
private TextPaint paint;
public boolean exitFlag;
private float textWidth;
private String _mText;
private int posX = 0;
private float posY;
private int width;
private RectF rf;
private Handler mHandler = new Handler();
public CustomTextView(Context context) {
this(context, null);
}
public CustomTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private void initView() {
paint = new TextPaint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setTextSize(30F);
rf = new RectF(0, 0, 0, 0);
}
public void setText(String text) {
this._mText = text;
this.drawingText = _mText;
layoutView();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
layoutView();
}
private void layoutView() {
width = getWidth();
rf.right = width;
rf.bottom = getHeight();
textWidth = paint.measureText(_mText, 0, _mText.length());
posY = getTextDrawingBaseline(paint, rf);
}
@Override
protected void onDraw(Canvas canvas) {
if (getVisibility() != View.VISIBLE || TextUtils.isEmpty(drawingText)) {
return;
}
canvas.save();
canvas.drawText(drawingText, 0, drawingText.length(), posX, posY, paint);
canvas.restore();
}
private Runnable moveRun = new Runnable() {
@Override
public void run() {
if(width >= textWidth){
return;
}
drawingText = _mText + space + _mText;
posX -= INVALIDATE_STEP;
if(posX >= -1 * INVALIDATE_STEP / 2 && posX <= INVALIDATE_STEP / 2){
mHandler.postDelayed(this, WAIT_TIME);
invalidate();
return;
}
if (posX < -1 * textWidth - paint.measureText(space, 0, space.length())) {
posX = INVALIDATE_STEP;
}
invalidate();
if(!exitFlag){
mHandler.postDelayed(this, INVALIDATE_TIME);
return;
}
posX = 0;
}
};
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
stopMove();
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
layoutView();
startMove();
}
private void stopMove() {
exitFlag = true;
mHandler.removeCallbacksAndMessages(null);
}
public void startMove() {
exitFlag = false;
mHandler.post(moveRun);
}
/**
* 获取绘制文字的baseline
*
* @param paint
* @param targetRect
* @return
*/
public static float getTextDrawingBaseline(Paint paint, RectF targetRect) {
if (paint == null || targetRect == null) {
return 0;
}
Paint.FontMetrics fontMetric = paint.getFontMetrics();
return targetRect.top + (targetRect.height() - fontMetric.bottom + fontMetric.top) / 2.0f - fontMetric.top;
}
}
调用代码:
package com.example.marquee;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rl = new RelativeLayout(MainActivity.this);
setContentView(rl);
CustomTextView view = new CustomTextView(MainActivity.this);
view.setBackgroundColor(Color.GRAY);
view.setText("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
rl.addView(view, 300, 100);
}
}
大家可以根据自己的需要去调整步长,建议不要修改刷新间隔时间。
附件是Demo工程,可以在上面调整出需要的速度
分享到:
相关推荐
本文实例为大家分享了Android自定义textview实现跑马灯效果的具体代码,供大家参考,具体内容如下 xml布局 <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android=...
android 自定义textview 模拟走马灯效果
自定义TextView实现竖直跑马灯效果,特殊字符串改变颜色
Android自带的跑马灯效果不太好控制,还必须要满足条件才能有效果,而且速度不受控制。前面我的博客中有一篇就是用Android自带的跑马灯效果的,但是基于不同的使用效果,这里在网上找到了一个更好的方法。沿用了作者...
自定义TextView实现文字的跑马灯效果,里面的东西很全、很基础,适合初学者,简单易懂。
自定义View—实现滚动TextView(跑马灯)效果源码,教程在http://blog.csdn.net/u012933743/article/details/46310225 如有不懂 可以评论提问
主要为大家详细介绍了Android自定义TextView跑马灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
好像跑马灯这种效果已经不用咱们来实现了 呵呵 不过有一点 如果文字不过长 在组件的范围内 还想要跑马灯的效果怎么办呢 当然的自己自定义啦 那还能怎么做 哈哈 ">android:ellipsize设置当文字过长时 该控件该如何...
android自带的TextView可以实现跑马灯效果,但是有很多的局限性;比如需要设置ellipsize=”marquee”,获取 focusable=”true”,设置singleLine=”true”,控件里的内容需要超过控件本身的长度,无法控制滚动速度和...
Android中继承TextView实现文字的跑马灯效果,详细了解请移步http://blog.csdn.net/zxc514257857/article/details/70184606
本文为大家分享一个非常简单但又很常用的控件,跑马灯状态的TextView。当要显示的文本长度太长,又不想换行时用它来显示文本,一来可以完全的显示出文本,二来效果也挺酷,实现起来超级简单,所以,何乐不为。先看下...
大家知道,横向的跑马灯android自带的TextView就可以实现,详情请百度【Android跑马灯效果】。但是竖直的跑马灯效果原生Android是不支持的。网上也有很多网友实现了自定义的效果,但是我一贯是不喜欢看别人的代码,...
Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需所以自己写了一个自定义的TextView,感兴趣的朋友可以了解下
NULL 博文链接:https://1136051009.iteye.com/blog/2022580
人生中第一篇博客便是关于TextView跑马灯的实现,但是随着知识的增多,实现一些功能的方式方法也增多了起来,这里只是自定义控件一个例子,可以同理到很多控件上! 首先写一个类继承你需要重写的控件 比如我这里是...