您的位置:首页 > 移动开发 > Android开发

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android