opt: API of canvas

This commit is contained in:
hyb1996
2018-03-24 13:37:10 +08:00
parent a009eb02b0
commit 9c43b1f41c
3 changed files with 232 additions and 9 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,7 @@
package com.stardust.autojs.core.graphics;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.DrawFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
@@ -17,28 +18,35 @@ import android.support.annotation.RequiresApi;
import com.stardust.autojs.core.image.ImageWrapper;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.exception.ScriptException;
/**
* Created by Stardust on 2018/3/22.
*/
public class Canvas {
public class ScriptCanvas {
private final android.graphics.Canvas mCanvas;
private android.graphics.Canvas mCanvas;
public Canvas(android.graphics.Canvas canvas) {
public ScriptCanvas(android.graphics.Canvas canvas) {
mCanvas = canvas;
}
public Canvas(@NonNull Bitmap bitmap) {
public ScriptCanvas(@NonNull Bitmap bitmap) {
mCanvas = new android.graphics.Canvas(bitmap);
}
public Canvas(@NonNull ImageWrapper image) {
public ScriptCanvas(@NonNull ImageWrapper image) {
this(image.getBitmap());
}
public ScriptCanvas() {
}
void setCanvas(Canvas canvas) {
mCanvas = canvas;
}
public boolean isHardwareAccelerated() {
return mCanvas.isHardwareAccelerated();
}

View File

@@ -4,16 +4,17 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.SystemClock;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.stardust.autojs.core.eventloop.EventEmitter;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* Created by Stardust on 2018/3/16.
@@ -28,6 +29,7 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
private final SurfaceHolder mHolder;
private ExecutorService mDrawingThreadPool;
private ScriptRuntime mScriptRuntime;
private volatile long mTimePerDraw = 1000 / 30;
public ScriptCanvasView(Context context, ScriptRuntime scriptRuntime) {
super(context);
@@ -37,6 +39,15 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
init();
}
public void setMaxFps(int maxFps) {
if (maxFps <= 0) {
mTimePerDraw = 0;
} else {
mTimePerDraw = 100 / maxFps;
}
}
private void init() {
mHolder.addCallback(this);
}
@@ -59,13 +70,21 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
mDrawingThreadPool.execute(() -> {
Canvas canvas = null;
SurfaceHolder holder = getHolder();
long time = SystemClock.uptimeMillis();
ScriptCanvas scriptCanvas = new ScriptCanvas();
try {
while (mDrawing) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
emit("draw", canvas, this);
scriptCanvas.setCanvas(canvas);
scriptCanvas.drawColor(Color.WHITE);
emit("draw", scriptCanvas, this);
holder.unlockCanvasAndPost(canvas);
canvas = null;
long dt = mTimePerDraw - (SystemClock.uptimeMillis() - time);
if (dt > 0) {
sleep(dt);
}
time = SystemClock.uptimeMillis();
}
} catch (Exception e) {
mScriptRuntime.exit(e);
@@ -78,6 +97,14 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
});
}
private void sleep(long dt) {
try {
Thread.sleep(dt);
} catch (InterruptedException e) {
throw new ScriptInterruptedException(e);
}
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
Log.d(LOG_TAG, "onWindowVisibilityChanged: " + this + ": visibility=" + visibility + ", mDrawingThreadPool=" + mDrawingThreadPool);