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

View File

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