一,如果View 在16ms 之内沒有完成更新就會造成卡頓現象.這是就需要surfaceView來在子線程進行更新.
二:此文章主要是SurfaceView 的手繪闆功能.不多說了,代碼如下:
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* author: pluto
* date: 2018/1/10 15:42
* desc: TODO
*/
public class SurfaceViewTemplate extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private final static String TAG = SurfaceViewTemplate.class.getSimpleName();
private SurfaceHolder mSurfaceHolder;
private Canvas mCanvas;
//子線程标志位
private boolean mIsDrawing;
private Path mPath;
private Paint mPaint;
private int x;
private int y;
public SurfaceViewTemplate(Context context) {
super(context);
init();
}
public SurfaceViewTemplate(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SurfaceViewTemplate(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public SurfaceViewTemplate(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
mPath = new Path();
mPaint = new Paint();
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mIsDrawing = true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mIsDrawing = false;
}
@Override
public void run() {
long start = System.currentTimeMillis();
while (mIsDrawing) {
draw();
}
long end = System.currentTimeMillis();
if (end - start < 100) {
try {
Thread.sleep(100 - (end - start));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void draw() {
try {
mCanvas = mSurfaceHolder.lockCanvas();
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath, mPaint);
} catch (Exception e) {
} finally {
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(x, y);
break;
}
return true;
}
}