android采用SurfaceView实现文字滚动效果

前言

为了实现文字的滚动效果,之前也重写了TextView效果都不太好,后来对SurfaceView进行完善。

声明

       欢迎转载,但请保留文章原始出处:) 
    小崔博客:http://blog.csdn.net/cuiran 

正文

     
package com.ghyf.mplay.view;

import java.util.ArrayList;
import java.util.ListIterator;

import com.ghyf.mplay.datatype.AlignMode;
import com.ghyf.mplay.datatype.BackParam;
import com.ghyf.mplay.datatype.FontParam;
import com.ghyf.mplay.datatype.RGBA;
import com.ghyf.mplay.datatype.ShowType;
import com.ghyf.mplay.util.LogUtil;
import com.ghyf.mplay.util.TypeFaceFactory;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 
 * 显示滚动文字的控件
 * @author cuiran
 * @version 1.0.0
 */
public class MScroll extends SurfaceView implements SurfaceHolder.Callback {
	private static final String TAG="MScroll";
	private int module_type; // 模块类型
	
	private int zOrder; // 模块的ZOrder
	
	private String file_version;	//文件版本
	
	private String module_name;	//控件名
	
	private int module_uid;//控件标识
	
	private int module_gid;//控件组标识
	

	private int refresh_time; // 滚动刷新的时间间隔
	private int scroll_pixel; // 滚动刷新的间距
	private int scroll_space=200; // 滚动上一文本和下一文本间距
	
	
	private boolean runFlag = true;
	protected SurfaceHolder holder;
	private Thread myThread;
	private int currentScrollX;// 当前滚动的位置

	public int getCurrentScrollX() {
		return currentScrollX;
	}

	public void setCurrentScrollX(int currentScrollX) {
		this.currentScrollX = currentScrollX;
	}

	private String currentText = "";
	private String nextText = "";
	private BackParam backgroud;
	private ArrayList text_list;// 待显示的文本列表

	// 5
	private AlignMode align;// 对齐方式

	// 0
	private ShowType scroll_type;// 滚动文本的显示方式。

	
	private FontParam font;


	public MScroll(Context context) {
		super(context);
		holder = this.getHolder();
		holder.addCallback(this);
		holder.setFormat(PixelFormat.TRANSPARENT); // 顶层绘制SurfaceView设成透明
		this.setZOrderOnTop(true);
		
		
	}
	boolean isAdd=true;
	/* 自定义线程 */
	class MyRunnable implements Runnable {
		private Paint paint = null;
		private float textWidth;
		private ListIterator listIterator = null;

		public void run() {
			Canvas canvas = null;
			
			//整个空间的宽度
			int mWidth=MScroll.this.getWidth();;
			while (runFlag) {
			
				try {
					if (paint == null) {
						initPaint();
						textWidth = paint.measureText(currentText);// 得到文本的长度。
					}
					currentScrollX -= scroll_pixel;// 滚动速度
					canvas = holder.lockCanvas(new Rect(0, 0, MScroll.this
							.getWidth(), MScroll.this.getHeight())); // 获取画布
					if (canvas != null) { // 退出时holder.lockCanvas()方法可能返回空,未免报空指针异常
						// 清除画布方法一
						canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
						
						canvas.drawText(currentText, 0, currentText.length(),
								currentScrollX, paint.getTextSize(), paint);
						
						holder.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
						
					}
					/**
					 * 1、currentScrollX+文本的宽度+100<=mWidth
					 */
						if((currentScrollX+textWidth+scroll_space)<=mWidth){
							currentText = currentText+"               "+nextText;
							textWidth = paint.measureText(currentText);// 得到文本的长度。
							findNext();
						}
						
						if(isAdd){
							currentScrollX = MScroll.this.getWidth();
							isAdd=false;
						}
					/**
					 * 2、滚动的文本结尾坐标=宽度的一半 显示 下一个文本
					 */
					
//					if (currentScrollX <= -textWidth) { // 滚完一屏文本后接着下一个文本。
//						currentScrollX = MScroll.this.getWidth();
//						currentText = nextText;
//						textWidth = paint.measureText(currentText);// 得到文本的长度。
//						findNext();
//						
//					}
					
					Thread.sleep(getRefresh_time());
				} catch (InterruptedException e) {
					LogUtil.e(TAG, "ScrollSurfaceView:绘制失败...\r\n"
							+ e);
				} catch (Exception e) {
					LogUtil.e(TAG, "ScrollSurfaceView:run...\r\n"
							+ e);
				}
			}
		}

		/**
		 * 初始化paint
		 */
		private void initPaint() {
			paint = new Paint();
			listIterator = text_list.listIterator();
			if (listIterator.hasNext()) {
				currentText = listIterator.next();
				findNext();
			}

			initFont(paint, font);

		}

		// 找到下一个文本。
		void findNext() {
			if (listIterator.hasNext()) {
				nextText = listIterator.next();
			} else { // 文本集合播完了就再播第一项。
				isAdd=true;
				while (listIterator.hasPrevious()) {
					listIterator.previous();
				}
				nextText = listIterator.next();
			}
		}

		/**
		 * 设置TextView的字体
		 * 
		 * @param paint
		 *            textview控件
		 * @param font
		 *            字体
		 */
		void initFont(Paint paint, FontParam font) {
			// paint.setTextAlign(Align.RIGHT);
			// 大小
			paint.setTextSize(font.getSize());
			// 字体
			Typeface typeface = TypeFaceFactory.createTypefae(font.getName());
			paint.setTypeface(typeface);
			// 颜色
			RGBA rgba = font.getFaceColor();
			int color = Color.argb(rgba.getAlpha(), rgba.getRed(),
					rgba.getGreen(), rgba.getBlue());
			paint.setColor(color);
			// TODO 其它字体参数的设置
		}

	}

	@Override
	/**
	 * 当控件创建时自动执行的方法
	 */
	public void surfaceCreated(SurfaceHolder holder) {
		// 启动自定义线程
		myThread = new Thread(new MyRunnable());
		runFlag = true;
		myThread.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}

	@Override
	/**
	 * 当控件销毁时自动执行的方法
	 */
	public void surfaceDestroyed(SurfaceHolder holder) {
		// 终止自定义线程
		runFlag = false;
		myThread.interrupt();
	}

	public int getScroll_pixel() {
		return scroll_pixel;
	}

	public void setScroll_pixel(int scroll_pixel) {
		this.scroll_pixel = scroll_pixel;
	}

	public String getText() {
		return currentText;
	}

	public void setText(String text) {
		this.currentText = text;
	}

	public BackParam getBackgroud() {
		return backgroud;
	}

	public void setBackgroud(BackParam backgroud) {
		this.backgroud = backgroud;
	}

	public AlignMode getAlign() {
		return align;
	}

	public void setAlign(AlignMode align) {
		this.align = align;
	}

	public ShowType getScroll_type() {
		return scroll_type;
	}

	public void setScroll_type(ShowType scroll_type) {
		this.scroll_type = scroll_type;
	}

	public FontParam getFont() {
		return font;
	}

	public void setFont(FontParam font) {
		this.font = font;
	}

	public long getRefresh_time() {
		return refresh_time;
	}

	public void setRefresh_time(int refresh_time) {
		this.refresh_time = refresh_time;
	}

	public ArrayList getText_list() {
		return text_list;
	}

	public void setText_list(ArrayList text_list) {
		this.text_list = text_list;
	}
	
	public int getModule_type() {
		return module_type;
	}

	public void setModule_type(int module_type) {
		this.module_type = module_type;
	}

	public int getzOrder() {
		return zOrder;
	}

	public void setzOrder(int zOrder) {
		this.zOrder = zOrder;
	}

	public String getFile_version() {
		return file_version;
	}

	public void setFile_version(String file_version) {
		this.file_version = file_version;
	}

	public String getModule_name() {
		return module_name;
	}

	public void setModule_name(String module_name) {
		this.module_name = module_name;
	}

	public int getModule_uid() {
		return module_uid;
	}

	public void setModule_uid(int module_uid) {
		this.module_uid = module_uid;
	}

	public int getModule_gid() {
		return module_gid;
	}

	public void setModule_gid(int module_gid) {
		this.module_gid = module_gid;
	}
	

}

针对上面代码怎么调用,其实它就是一个类,在使用的时候new 然后实现里面方法就可以了。


你可能感兴趣的:(Android学习笔记)