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;
|
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();
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user