Android基于TextView实现的跑马灯效果实例
作者:炫_愛羊 时间:2023-10-07 02:45:05
本文实例讲述了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程序设计有所帮助。
标签:Android,TextView,跑马灯效果
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java实现简单的猜数字小游戏
2023-11-11 12:55:40
![](https://img.aspxhome.com/file/2023/5/59055_0s.jpg)
Android中解决EditText放到popupWindow中,原有复制、粘贴、全选、选择功能失效问题
2021-07-12 10:51:49
![](https://img.aspxhome.com/file/2023/8/139358_0s.png)
Android如何设置圆角图片
2021-12-06 23:35:31
![](https://img.aspxhome.com/file/2023/4/129044_0s.jpg)
使用Swing绘制动态时钟
2023-11-24 07:05:12
![](https://img.aspxhome.com/file/2023/6/59166_0s.gif)
Java深入讲解异常处理try catch的使用
2023-11-04 13:00:32
![](https://img.aspxhome.com/file/2023/1/58921_0s.png)
2022编程语言需求排名出炉:第一不是Python,也不是Java
2023-10-11 19:09:17
![](https://img.aspxhome.com/file/2023/2/107152_0s.png)
C#调用C++DLL传递结构体数组的终极解决方案
2022-05-31 09:54:30
重写hashCode()和equals()方法详细介绍
2023-11-24 16:13:33
![](https://img.aspxhome.com/file/2023/8/59198_0s.png)
C#汉字转换拼音技术详解(高性能)
2022-01-19 02:03:16
springboot整合腾讯云短信开箱即用的示例代码
2023-04-02 06:06:38
![](https://img.aspxhome.com/file/2023/2/113422_0s.png)
Mybatis结果生成键值对的实例代码
2023-11-28 15:50:58
深入理解Java Socket通信
2022-10-03 04:56:10
![](https://img.aspxhome.com/file/2023/2/88142_0s.jpg)
Android 设置应用全屏的两种解决方法
2023-05-07 01:27:50
WPF中鼠标/键盘/拖拽事件以及用行为封装事件详解
2021-05-24 00:22:38
![](https://img.aspxhome.com/file/2023/2/126052_0s.gif)
Android开发中线程池源码解析
2023-12-19 02:30:57
![](https://img.aspxhome.com/file/2023/5/139395_0s.jpg)
Spring Security入门demo案例
2023-07-01 18:57:30
Java如何实现压缩文件与解压缩zip文件
2022-01-28 09:14:00
![](https://img.aspxhome.com/file/2023/6/67496_0s.png)
JDK动态代理过程原理及手写实现详解
2022-07-07 00:35:23
Android生成带圆角的Bitmap图片
2022-09-08 11:18:19
公共POI导出Excel方法详解
2023-09-10 22:51:31
![](https://img.aspxhome.com/file/2023/3/94213_0s.png)