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,跑马灯效果
0
投稿

猜你喜欢

  • java实现简单的猜数字小游戏

    2023-11-11 12:55:40
  • Android中解决EditText放到popupWindow中,原有复制、粘贴、全选、选择功能失效问题

    2021-07-12 10:51:49
  • Android如何设置圆角图片

    2021-12-06 23:35:31
  • 使用Swing绘制动态时钟

    2023-11-24 07:05:12
  • Java深入讲解异常处理try catch的使用

    2023-11-04 13:00:32
  • 2022编程语言需求排名出炉:第一不是Python,也不是Java

    2023-10-11 19:09:17
  • C#调用C++DLL传递结构体数组的终极解决方案

    2022-05-31 09:54:30
  • 重写hashCode()和equals()方法详细介绍

    2023-11-24 16:13:33
  • C#汉字转换拼音技术详解(高性能)

    2022-01-19 02:03:16
  • springboot整合腾讯云短信开箱即用的示例代码

    2023-04-02 06:06:38
  • Mybatis结果生成键值对的实例代码

    2023-11-28 15:50:58
  • 深入理解Java Socket通信

    2022-10-03 04:56:10
  • Android 设置应用全屏的两种解决方法

    2023-05-07 01:27:50
  • WPF中鼠标/键盘/拖拽事件以及用行为封装事件详解

    2021-05-24 00:22:38
  • Android开发中线程池源码解析

    2023-12-19 02:30:57
  • Spring Security入门demo案例

    2023-07-01 18:57:30
  • Java如何实现压缩文件与解压缩zip文件

    2022-01-28 09:14:00
  • JDK动态代理过程原理及手写实现详解

    2022-07-07 00:35:23
  • Android生成带圆角的Bitmap图片

    2022-09-08 11:18:19
  • 公共POI导出Excel方法详解

    2023-09-10 22:51:31
  • asp之家 软件编程 m.aspxhome.com