热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android跑马灯谷歌“偷渡”法

遇到问题一个跑马灯的需求,在网上扒了几个,发现都是写一个线程去循环画需要显示的字。效果来说不是很理想。偶然下我发现了TextView自己就带了跑马灯的属性,只是谷歌为了方便文本内容

遇到问题

一个跑马灯的需求,在网上扒了几个,发现都是写一个线程去循环画需要显示的字。效果来说不是很理想。
偶然下我发现了TextView自己就带了跑马灯的属性,只是谷歌为了方便文本内容超过了TextView的范围实现的。这个效果还是很不错的。
一般情况给TextView设置了 setEllipsize(TextUtils.TruncateAt.MARQUEE);是不跑的。会跑动的条件第一是TextView要显示的内容超出TextView的显示范围,第二是TextView获得了焦点

实现

根据这个两个特性我们可以自己根据TextView改造出一个跑马灯来
我就直接贴代码了:


import android.content.Context;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.support.v7.widget.AppCompatTextView;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
@SuppressWarnings("unused")
public class MarqueeView extends AppCompatTextView {
private volatile int spaceCount = 0;
private String layout_width;
public MarqueeView(Context context) {
super(context);
}
public MarqueeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
if (attrs != null) {
//直接获取XML中设置的宽度
layout_width = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_width");
switch (layout_width) {
case "-2"://宽度设置为wrap_content的情况。这个时候宽度是文本内容的宽度决定的。
setWidthByText(getText().toString(),getTextSize());
initView();
break;
default:
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {//系统确认了宽度和高度时回调的
if(getViewTreeObserver().isAlive()){
getViewTreeObserver().removeOnGlobalLayoutListener(this);
int view-2")){
setWidthByText(text.toString(),getTextSize());
}
if(spaceCount != 0) {
text = getCount(spaceCount - 2 ) + text;
}
super.setText(text, type);
}
@Override
public CharSequence getText() {
return super.getText().toString().trim();
}
public void setWidthByText(final String string,final float textSize){
setWidth((int)getCharacterWidth(string, textSize));
float spaceWidth = getCharacterWidth(textSize);
spaceCount = (int) (getCharacterWidth(string, textSize)/spaceWidth);
}
public float getCharacterWidth(final float size) {
Paint paint = new Paint();
paint.setTextSize(size);
return paint.measureText(" ");
}
public float getCharacterWidth(String string ,float size) {
Paint paint = new Paint();
paint.setTextSize(size);
return paint.measureText(string);
}
public String getCount(int count) {
if (count <0) return "";
StringBuilder st = new StringBuilder();
for (int i = 0; i st.append(" ");
}
return st.toString();
}
}

重点是利用空格去填充TextView,让原本要显示的内容隐藏。而需要多少个空格可以通过

Paint paint = new Paint();
paint.setTextSize(size);
paint.measureText(" ");//返回这个文本的宽度单位是px.

而调用getText()的时候只需要复写一下方法,通过trim()去掉两端的空格。

super.getText().toString().trim();

实现的效果:

《Android 跑马灯--谷歌“偷渡”法》 效果图,GIF的帧率太低了,所以感觉很卡顿。

好了,基本需求解决了,这个只是一个demo,你们可以根据你的实际需求利用好TextView的这个特性去实现你自己的跑马灯。


推荐阅读
author-avatar
扈菁雄佳纯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有