文档章节

Libgdx学习笔记:跑马灯效果

flyoahc
 flyoahc
发布于 2015/12/09 15:39
字数 1013
阅读 217
收藏 0

首先看下效果图:

 

黑色底部背景,文字的可显示区域。红色为滚动的文字。

预备知识:

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html

我们用了Actor中的,clipBegin和clipEnd

裁剪方法,类似截图,给一个矩形区域,仅绘制矩形区域内的内容。

这里面有个注意事项就是,在clipbegin()之前,需要调用batch.flush()。目的是让之前加入舞台的Actor进行绘制,如果不加就会导致之前的Actor不被绘制。

batch.flush(); 
clipBegin();

滚动的实现,我们直接用的是MoveByAction。

使用方法:

// 设置速度,宽度,文字,文字颜色
CHMarqueeText marqueeText = new CHMarqueeText.Builder().setMoveSpeed(100).setMarqueeWidth(100)
	.setText("测试跑马灯效果超长文本显示1234567890结束了。").setTextColor(Color.RED).build();
addActor(marqueeText);
marqueeText.setPosition(100, 560);


代码展示:

package com.oahcfly.chgame.core.ui;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.oahcfly.chgame.core.freefont.FreeFont;
import com.oahcfly.chgame.core.freefont.FreeLabel;
import com.oahcfly.chgame.core.helper.CHPixmapHelper;
import com.oahcfly.chgame.core.mvc.CHActor;

/**
 * 跑马灯
 * @author haocao
 *
 */
public class CHMarqueeText extends CHActor {

	// 文本Label
	private FreeLabel label;
	private Texture bgTexture;

	public void setMarqueeTextParams (String text, Color textColor, int width, int moveSpeed) {
		stoped = false;
		label = FreeFont.getLabel(textColor, text);
		// 设置透明背景
		Color alphaColor = new Color(Color.BLACK);
		alphaColor.a = 0.2f;
		bgTexture = CHPixmapHelper.createRectangleTexture(alphaColor, width, 20 + FreeFont.getBitmapFont().getSize());
		setBgTexture(bgTexture);
		setClipRectangle(new Rectangle(0, 0, width, getHeight()));

		// float moveDistance = Math.max(0, label.getWidth() - width);
		float duration = Math.max(0, 12 - 3 * moveSpeed / 100f);
		if (label.getWidth() > width) {
			label.addAction(Actions.repeat(-1,
				Actions.sequence(Actions.moveBy(-label.getWidth(), 0, duration), Actions.run(new Runnable() {

					@Override
					public void run () {
						// 从尾部重新开始
						label.setX(getRight());
					}
				}), Actions.moveBy(-label.getWidth() - width, 0, duration))));
		}
	}

	@Override
	public void drawAfterBg (Batch batch) {
		if (label.getX() == 0) {
			// 设置初始坐标
			label.setX(getX());
		}
		label.draw(batch, 1);
		// 随着action的执行,坐标会发生变化,在这里进行赋值更新
		label.setPosition(label.getX(), getY() + 5f);
	}

	@Override
	public void act (float delta) {
		if (!stoped) {
			label.act(delta);
		}
		super.act(delta);
	}

	public FreeLabel getLabel () {
		return label;
	}

	@Override
	public boolean remove () {
		if (bgTexture != null) {
			bgTexture.dispose();
		}
		return super.remove();
	}

	private boolean stoped;

	public void stopMarquee () {
		stoped = true;
	}

	public void resumeMarquee () {
		stoped = false;
	}

	public static class Builder {
		private String text;
		private Color textColor;
		private int marqueeWidth;
		private int moveSpeed = 50;

		public Builder setText (String text) {
			this.text = text;
			return this;
		}

		public Builder setTextColor (Color textColor) {
			this.textColor = textColor;
			return this;
		}

		public Builder setMarqueeWidth (int marqueeWidth) {
			this.marqueeWidth = marqueeWidth;
			return this;
		}

		/**
		 * 范围【0~100】越大速度越快
		 * @param moveSpeed
		 * @return 
		 */
		public Builder setMoveSpeed (int moveSpeed) {
			this.moveSpeed = moveSpeed > 100 ? 100 : moveSpeed < 0 ? 0 : moveSpeed;
			return this;
		}

		public CHMarqueeText build () {
			CHMarqueeText chMarqueeText = CHActor.obtain(CHMarqueeText.class);
			chMarqueeText.setMarqueeTextParams(text, textColor, marqueeWidth, moveSpeed);
			return chMarqueeText;
		}
	}

}

关联的CHActor代码:

package com.oahcfly.chgame.core.mvc;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pool.Poolable;
import com.badlogic.gdx.utils.Pools;
import com.oahcfly.chgame.core.Chao;

/** <pre>
 * 二次封装的actor
 * 
 * date: 2014-12-11
 * </pre>
 * 
 * @author caohao */
public class CHActor extends Actor implements Poolable {
	private int tag;

	private Texture bgTexture;

	private TextureRegion bgTextureRegion;

	public CHActor () {
	}

	@Override
	public void draw (Batch batch, float parentAlpha) {
		boolean clipok = false;
		// 开始裁剪
		if (clipRectangle != null) {
			batch.flush(); // 绘制之前添加的元素,如果不添加此处代码,后面的裁剪会导致之前的纹理也会被裁剪
			clipok = clipBegin(getX() + clipRectangle.x, getY() + clipRectangle.y, clipRectangle.width, clipRectangle.height);
		}

		Color color = getColor();
		batch.setColor(color.r, color.g, color.b, color.a);

		float x = getX();
		float y = getY();
		float scaleX = getScaleX();
		float scaleY = getScaleY();

		float width = getWidth();
		float height = getHeight();

		if (bgTexture != null) {
			batch.draw(bgTexture, x, y, getOriginX(), getOriginY(), getWidth(), getHeight(), scaleX, scaleY, getRotation(), 0, 0,
				(int)width, (int)height, false, false);
		}

		if (bgTextureRegion != null) {
			if (bgTextureRegion instanceof Sprite) {
				Sprite sprite = (Sprite)bgTextureRegion;
				sprite.setColor(batch.getColor());
				sprite.setOrigin(getOriginX(), getOriginY());
				sprite.setPosition(x, y);
				sprite.setScale(scaleX, scaleY);
				sprite.setSize(width, height);
				sprite.setRotation(getRotation());
				sprite.draw(batch);
			} else {
				batch.draw(bgTextureRegion, x, y, getOriginX(), getOriginY(), width, height, scaleX, scaleY, getRotation());
			}
		}

		// 绘制完背景后进行其他内容绘制
		drawAfterBg(batch);
		
		// 提交裁剪内容
		if (clipok) {
			batch.flush();
			clipEnd();
		}
	}

	public void drawAfterBg (Batch batch) {
	};

	public void setBgTexture (Texture bgTexture) {
		this.bgTexture = bgTexture;
		if (bgTexture != null) {
			setSize(bgTexture.getWidth(), bgTexture.getHeight());
		}
		setOrigin(Align.center);
	}

	/** <pre>
	 * 使用缓存池
	 * 
	 * date: 2015-1-3
	 * </pre>
	 * 
	 * @author caohao
	 * @return */
	@SuppressWarnings("unchecked")
	public static <T extends CHActor> T obtain (Class<T> type) {
		Pool<CHActor> pool = (Pool<CHActor>)Pools.get(type);
		CHActor actor = pool.obtain();
		actor.setBgTexture(null);
		return (T)actor;
	}

	public static CHActor obtain () {
		return obtain(CHActor.class);
	}

	@Override
	public void reset () {
		this.bgTexture = null;
		this.bgTextureRegion = null;
		clipRectangle = null;
		setScale(1);
		setRotation(0);
		clear();
		setUserObject(null);
		this.setColor(new Color(1, 1, 1, 1));
		setStage(null);
		setParent(null);
		setVisible(true);
		setName(null);
		setOrigin(Align.center);
		setPosition(0, 0);
	}

	public Texture getBgTexture () {
		return bgTexture;
	}

	public TextureRegion getBgTextureRegion () {
		return bgTextureRegion;
	}

	public void setBgTextureRegion (TextureRegion textureRegion) {
		this.bgTextureRegion = textureRegion;
		if (bgTextureRegion != null) {
			if (bgTextureRegion instanceof Sprite) {
				Sprite sprite = (Sprite)bgTextureRegion;
				setSize(sprite.getWidth(), sprite.getHeight());
			} else if (bgTextureRegion instanceof AtlasRegion) {
				AtlasRegion atlasRegion = (AtlasRegion)bgTextureRegion;
				bgTextureRegion = Chao.plistCenter.createSprite(atlasRegion);
				Sprite sprite = (Sprite)bgTextureRegion;
				setSize(sprite.getWidth(), sprite.getHeight());
			} else {
				setSize(bgTextureRegion.getRegionWidth(), bgTextureRegion.getRegionHeight());
			}
		}

		setOrigin(Align.center);
	}

	@Override
	public boolean remove () {
		boolean remove = super.remove();
		if (remove) {
			Pools.free(this);
		}
		return remove;
	}

	public int getTag () {
		return tag;
	}

	public void setTag (int tag) {
		this.tag = tag;
	}

	private Rectangle clipRectangle;

	/**
	 * 设置裁剪矩形,范围为当前Actor的显示区域即:(0,0)~(w,h)
	 * @param rectangle
	 */
	public void setClipRectangle (Rectangle rectangle) {
		this.clipRectangle = rectangle;
	}

}

欢迎关注CHGame框架(基于Libgdx二次封装快速开发框架):

https://git.oschina.net/oahcfly/CHGame.git


© 著作权归作者所有

flyoahc
粉丝 12
博文 37
码字总数 15728
作品 0
南京
程序员
私信 提问
第一天学习Android的一些笔记

昨天学习了怎样装Android配置环境,下载SDK用了好久的时间,再加上一开始不会,弄了好长时间,今天第一天学习,跟着视频教程学的。下边是我的一些笔记,仅做留念与学习笔记 。 快捷键: 智能...

子弹兄
2014/01/16
122
0
Android控件笔记——使用TextView实现跑马灯效果

1、如何在Android中显示长文本? 在Android中,当我们要显示长文本的时候,如果不做任何操作,仅仅是在TextView中显示,则会自动换行。

落叶-归根
2016/05/12
102
1
微信小程序如何开发跑马灯效果?

跑马灯效果比较常见,一般做电商类的小程序,都会用到,所以代码君今天特地写一篇文章,来教一下大家,如何去实现跑马灯效果,下面是代码君实现的效果,可以先看一下! 跑马灯效果的制作 制作...

2018/10/12
0
0
JavaScript文本特效实例小结

1、标题跑马灯 常常能够在一些新闻网站,或者其他地方,看到文字在一个特定的区域内,来回滚动。一旦超出边界就消失了,那么这些效果是如何做到的呢,今天我们就来讲讲。 图示效果: 源代码:...

前端小攻略
2018/12/25
0
0
android跑马灯效果

<TextViewandroid:layoutheight="wrapcontent"android:layoutwidth="fillparent"android:textSize="30px"android:text="hello,my name is linyuhuan,i am come from canada,where are you co......

林家的人
2013/11/21
433
0

没有更多内容

加载失败,请刷新页面

加载更多

JS 打印控制

JS 打印控制 var PrintStartString = "<!--打印开始标示符-->";//设置打印开始区域var PrintEndString = "<!--打印结束标示符-->";//设置打印结束区域var HtmlText = window.do......

DrChenXX
23分钟前
5
0
LevelDB:使用介绍

LevelDB 提供的接口其实很简单,下面举例进行简单说明。 安装 git clone https://github.com/google/leveldb cd leveldb mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. ......

slagga
28分钟前
5
0
《JavaScript正则表达式迷你书》读书笔记

正则基础 常见简写形式 字符组 具体含义 记忆方式 \d 表示 [0-9]。表示是一位数字。 其英文是 digit(数字) \D 表示 [^0-9]。表示除数字外的任意字符。 \w 表示 [0-9a-zA-Z_]。表示数字、大小...

muzi131313
33分钟前
4
0
Git的反悔操作

概述 这次主要来讲讲Git的反悔操作,自己平时在写代码的过程中经常会出现想要弃用所有的改动或回滚到上一次commit的情况。Git上的反悔操作有reset、rebase、revert等,每个操作各有区别和对应...

duduYZ
33分钟前
3
0
实现双向绑定Proxy比defineproperty优劣如何?

前言 双向绑定其实已经是一个老掉牙的问题了,只要涉及到MVVM框架就不得不谈的知识点,但它毕竟是Vue的三要素之一. Vue三要素 响应式: 例如如何监听数据变化,其中的实现方法就是我们提到的双向...

寻找海蓝
45分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部