feat: new ui widget canvas

This commit is contained in:
hyb1996
2018-03-19 19:17:06 +08:00
parent c5e3050732
commit f16b3ad922
9 changed files with 174 additions and 41 deletions

View File

@@ -9,6 +9,7 @@ import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.stardust.autojs.core.eventloop.EventEmitter;
import com.stardust.autojs.runtime.ScriptRuntime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -25,11 +26,13 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
private EventEmitter mEventEmitter;
private final SurfaceHolder mHolder;
private ExecutorService mDrawingThreadPool;
private ScriptRuntime mScriptRuntime;
public ScriptCanvasView(Context context, EventEmitter eventEmitter) {
public ScriptCanvasView(Context context, ScriptRuntime scriptRuntime) {
super(context);
mEventEmitter = eventEmitter;
mScriptRuntime = scriptRuntime;
mEventEmitter = new EventEmitter(mScriptRuntime.bridges);
mHolder = getHolder();
init();
}
@@ -52,14 +55,24 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
if (mDrawingThreadPool == null)
mDrawingThreadPool = Executors.newCachedThreadPool();
mDrawingThreadPool.execute(() -> {
Canvas canvas = null;
SurfaceHolder holder = getHolder();
while (mDrawing) {
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
emit("draw", canvas, this);
holder.unlockCanvasAndPost(canvas);
try {
while (mDrawing) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
emit("draw", canvas, this);
holder.unlockCanvasAndPost(canvas);
canvas = null;
}
} catch (Exception e) {
mScriptRuntime.exit(e);
mDrawing = false;
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
Log.d(LOG_TAG, "drawing thread: mRunning = false");
});
}

View File

@@ -27,6 +27,6 @@ public class CanvasViewAttrSetter extends BaseViewAttrSetter<ScriptCanvasView> {
@Nullable
@Override
public ViewCreator<ScriptCanvasView> getCreator() {
return (context, attrs) -> new ScriptCanvasView(context, new EventEmitter(mScriptRuntime.bridges));
return (context, attrs) -> new ScriptCanvasView(context, mScriptRuntime);
}
}

View File

@@ -1,5 +1,6 @@
package com.stardust.autojs.engine;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
@@ -63,6 +64,9 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine {
@Override
public void forceStop() {
LooperHelper.quitForThread(getThread());
Activity activity = (Activity) getTag("activity");
if (activity != null)
activity.finish();
super.forceStop();
}

View File

@@ -14,6 +14,10 @@ public class ScriptEngineProxy<S extends ScriptSource> implements ScriptEngine<S
mScriptEngine = scriptEngine;
}
public ScriptEngine<S> getInner() {
return mScriptEngine;
}
@Override
public void put(String name, Object value) {
mScriptEngine.put(name, value);

View File

@@ -101,6 +101,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
private void prepare() {
mScriptEngine.put("activity", this);
mScriptEngine.setTag("activity", this);
mScriptEngine.setTag(ScriptEngine.TAG_ENV_PATH, mScriptExecution.getConfig().getRequirePath());
mScriptEngine.setTag(ScriptEngine.TAG_EXECUTE_PATH, mScriptExecution.getConfig().getExecutePath());
mScriptEngine.init();
@@ -121,6 +122,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
protected void onDestroy() {
super.onDestroy();
mScriptEngine.put("activity", null);
mScriptEngine.setTag("activity", null);
mScriptEngine.destroy();
mScriptExecution = null;
}
@@ -149,13 +151,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
if (mScriptEngine != null) {
mScriptEngine.forceStop();
}
mScriptEngine = new ScriptEngineProxy(mScriptEngineManager.createEngineOfSourceOrThrow(getSource())) {
@Override
public void forceStop() {
super.forceStop();
activity.finish();
}
};
mScriptEngine = mScriptEngineManager.createEngineOfSourceOrThrow(getSource());
return mScriptEngine;
}