Android基于TextView实现的跑马灯效果实例
作者:炫_愛羊 发布时间:2023-10-07 02:45:05
标签:Android,TextView,跑马灯效果
本文实例讲述了Android基于TextView实现的跑马灯效果。分享给大家供大家参考,具体如下:
package sweet.venst.act;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class AutoScrollTextView extends TextView {
public final static String TAG = AutoScrollTextView.class.getSimpleName();
private float textLength = 0f;// 文本长度
private int viewWidth = 0;
private int viewHight = 300;
private float step = 0f;// 文字的横坐标
private float y = 0f;// 文字的纵坐标
private float temp_view_plus_text_length = 0.0f;// 用于计算的临时变量
private float temp_view_plus_two_text_length = 0.0f;// 用于计算的临时变量
public boolean isStarting = false;// 是否开始滚动
private Paint paint = null;// 绘图样式
private String text = "";// 文本内容
public AutoScrollTextView(Context context)
{
super(context);
}
public AutoScrollTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int measureWidth = measureWidth(widthMeasureSpec);
int measureHight = measureHeight(heightMeasureSpec);
// int measureWidth = 1024;
// int measureHight = 300;
viewWidth = measureWidth;
viewHight = measureHight;
setMeasuredDimension(viewWidth, viewHight);
}
private int measureWidth(int widthMeasureSpec)
{
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.UNSPECIFIED) {
return viewWidth;
}
else {
return viewWidth;
}
}
private int measureHeight(int widthMeasureSpec) {
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.UNSPECIFIED) {
return viewHight;
} else {
return viewHight;
}
}
public void setScrollText(String text)
{
this.text = text;
inittextLength(text);
// invalidate();
}
public void init(Context cx) {
paint = getPaint();
paint.setTextSize(40);
paint.setColor(Color.WHITE);
text = getText().toString();
textLength = paint.measureText(text);
viewWidth = getWidth();
if (viewWidth == 0) {
DisplayMetrics dm = new DisplayMetrics();
dm = cx.getApplicationContext().getResources().getDisplayMetrics();
viewWidth = dm.widthPixels;
}
step = textLength;
temp_view_plus_text_length = viewWidth + textLength;
temp_view_plus_two_text_length = viewWidth + textLength * 2;
y = getTextSize() + getPaddingTop();
}
private void inittextLength(String text) {
textLength = paint.measureText(text);
step = textLength;
temp_view_plus_text_length = viewWidth + textLength;
temp_view_plus_two_text_length = viewWidth + textLength * 2;
}
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.step = step;
ss.isStarting = isStarting;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
step = ss.step;
isStarting = ss.isStarting;
}
public static class SavedState extends BaseSavedState {
public boolean isStarting = false;
public float step = 0.0f;
SavedState(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBooleanArray(new boolean[] { isStarting });
out.writeFloat(step);
}
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
public SavedState[] newArray(int size) {
return new SavedState[size];
}
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
};
private SavedState(Parcel in) {
super(in);
boolean[] b = null;
in.readBooleanArray(b);
if (b != null && b.length > 0)
isStarting = b[0];
step = in.readFloat();
}
}
public void startScroll() {
isStarting = true;
// invalidate();
}
public void stopScroll() {
isStarting = false;
// invalidate();
}
public void onDraw(Canvas canvas) {
canvas.save();
canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
if (!isStarting) {
return;
}
step += 3.2;// 0.5为文字滚动速度。
if (step > temp_view_plus_two_text_length)
step = textLength;
canvas.restore();
// invalidate();
postInvalidate();
}
}
希望本文所述对大家Android程序设计有所帮助。


猜你喜欢
- Visual Studio 2022 默认.net framework4.8,而4.6~4.7版本的.net framework可以通过方法
- 超简单,几行代码搞定Android底部导航栏—–应项目需求以及小伙伴的留言,新加了两个方法:设置底部导航栏背景图片添加底部导航栏选项卡切换监
- 在对接第三方支付的时候,第三方会要求参数按照ASCII码从小到大排序。如下:public static void requestPay()
- 前言.NET中的委托是一个类,它定义了方法的类型,是一个方法容器。委托把方法当作参数,可以避免在程序中大量使用条件判断语句的情况。项目名为T
- namespace ConsoleApplication1{ using System; &n
- 先给大家展示下关于仿支付宝钱包首页中带有分割线的gridview,俗称九宫格 的效果图,怎么样是不是和你想象的一样啊。在你的预料之中就继续访
- 定义建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不
- 作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Androi
- 1、写在前面今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答)。所以写了这边
- 1、找奇数:public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真
- 一、代码结构:二、数据实体类:using System;using System.Collections.Generic;using Sys
- 当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中
- 函数式接口1.1 函数式接口概述函数式接口:有且仅有一个抽象方法的接口Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可
- 单个异常捕捉val handler = CoroutineExceptionHandler { coroutineContext, thro
- MyBatis Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。Mybati
- spring validation多层对象校验1、第一层对象定义import java.io.Serializable; import ja
- 正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务
- 一般查询手机归属地内容应该很好用json格式保存,在网上找到了淘宝的归属地API,并下了处理json相关的jar包,做了这个手机归属地查询功
- 1.添加引用Windows服务(.NET Framework)2.输入项目名称,选择安装位置,,选择安装框架版本;创建。3.找到MyServ
- Spring Cloud Gateway是Spring 官方基于Spring 5.0、Spring Boot 2.0和Project Rea