android 跑马灯效果
2015-12-29 10:12
363 查看
修改界面跳转后跑马灯线程停止问题
package com.sunarvr.artist.view; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * 跑马灯效果 */ public class AlwaysMarqueeTextView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private MyThread myThread; private String mText = "Zenip, MarqueeTextSurfaceView"; private int xOffset = 0; private boolean isSurfaceValid = false; private Typeface tf; private int i=0; public AlwaysMarqueeTextView(Context context) { super(context); init(context); } public AlwaysMarqueeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } public AlwaysMarqueeTextView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public void init(Context context) { setZOrderOnTop(true); mHolder = getHolder(); mHolder.addCallback(this); myThread = new MyThread(mHolder); mHolder.setFormat(PixelFormat.TRANSPARENT); AssetManager manager = context.getAssets(); tf = Typeface.createFromAsset(manager, "fonts/FZLTHJW.TTF"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { holder.setFixedSize(width, height); } public void setText(String str) { mText = str; startScroll(); i++; } int height = 0, width = 0; @Override public void surfaceCreated(SurfaceHolder holder) { isSurfaceValid = true; height = mHolder.getSurfaceFrame().height(); width = mHolder.getSurfaceFrame().width(); xOffset = width + 10; if(i==1) { startScroll(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { isSurfaceValid = false; stopScroll(); } class MyThread extends Thread { private SurfaceHolder holder; public boolean canRun; public MyThread(SurfaceHolder holder) { this.canRun = true; this.holder = holder; } @Override public void run() { Canvas c = null; while (canRun && isSurfaceValid) { try { c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。 handlerDrawInternal(c); } catch (Exception e) { e.printStackTrace(); } finally { if (c != null) { holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。 } } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }//睡眠时间为1秒 } // reset try { xOffset = width + 10; c = holder.lockCanvas(); handlerDrawInternal(c); } catch (Exception e) { e.printStackTrace(); } finally { if (c != null) { holder.unlockCanvasAndPost(c); } } } } public void startScroll() { if (!isSurfaceValid) { return; } myThread.canRun = true; if (!myThread.isAlive()) { xOffset = width + 10; myThread = new MyThread(mHolder); myThread.start(); } } public void stopScroll() { myThread.canRun = false; xOffset = 0; } private void handlerDrawInternal(Canvas canvas) { if (canvas == null) { return; } canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //创建画笔 paint.setTextSize(spToPixel(getContext(), 12f)); paint.setColor(Color.WHITE); paint.setTypeface(tf); // font height float fontHeight = getFontHeight(paint); Rect textBound = new Rect(); paint.getTextBounds(mText.toCharArray(), 0, mText.length(), textBound); int textWidth = textBound.width(); // base line float baseLineY = height / 2 + fontHeight / 2; canvas.drawText(mText, xOffset, baseLineY, paint); if (xOffset < (-textWidth - 10)) { xOffset = width +10; } else { xOffset -= 1; } } private static float getFontHeight(Paint paint) { Rect bounds = new Rect(); paint.getTextBounds("这", 0, 1, bounds); return bounds.height(); } private static float pixelsToSp(Context context, Float px) { float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; return px / scaledDensity; } private static float spToPixel(Context context, Float sp) { float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; return sp * scaledDensity; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories