package suda.sudamodweather.widget.weather;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public abstract class BaseAnimView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
public BaseAnimView(Context context, int backColor) {
super(context);
holder = getHolder();
holder.addCallback(this);
this.backColor = backColor;
holder.setFormat(PixelFormat.TRANSLUCENT); // 顶层绘制SurfaceView设成透明
init();
}
/**
* 初始化
*/
protected void init() {
Rect rect = new Rect();
getWindowVisibleDisplayFrame(rect);
windowWidth = rect.width();
windowHeight = rect.height();
}
/**
* 画子类
*/
protected abstract void drawSub(Canvas canvas);
/**
* 动画逻辑处理
*/
protected abstract void animLogic();
protected abstract void reset();
/**
* @return 线程睡眠时间,值越大,动画越慢,值越小,动画越快
*/
protected int sleepTime() {
return sleepTime;
}
protected float getFitSize(float size) {
return size * windowWidth / 1080;
}
protected void startAnim() {
isRunning = true;
new Thread(this).start();
}
protected void doLogic() {
while (isRunning) {
Canvas canvas = null;
synchronized (this) {
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(backColor);
drawSub(canvas);
animLogic();
holder.unlockCanvasAndPost(canvas);
}
Thread.sleep(sleepTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void callStop() {
isRunning = false;
}
//////////////////////////////////////////////
protected Thread thread;
protected int backColor = 0;
protected int windowWidth; //屏幕宽
protected int windowHeight; //屏幕高
protected int sleepTime = 30;
protected SurfaceHolder holder;
private boolean isRunning;
}