opt: API of canvas
This commit is contained in:
188
app/src/main/assets/sample/画布/贪吃蛇美化版.js
Normal file
188
app/src/main/assets/sample/画布/贪吃蛇美化版.js
Normal file
File diff suppressed because one or more lines are too long
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user