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

@ -2,8 +2,8 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Auto.js.iml" filepath="$PROJECT_DIR$/Auto.js.iml" />
<module fileurl="file://E:\YiBin\AndroidStudioProjects\NoRootScriptDroid\Auto.js.iml" filepath="E:\YiBin\AndroidStudioProjects\NoRootScriptDroid\Auto.js.iml" />
<module fileurl="file://$PROJECT_DIR$/NoRootScriptDroid.iml" filepath="$PROJECT_DIR$/NoRootScriptDroid.iml" />
<module fileurl="file://C:\Users\Stardust\Documents\AndroidProjects\Auto.js\NoRootScriptDroid.iml" filepath="C:\Users\Stardust\Documents\AndroidProjects\Auto.js\NoRootScriptDroid.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/autojs/autojs.iml" filepath="$PROJECT_DIR$/autojs/autojs.iml" />

View File

@ -1,24 +0,0 @@
"ui";
ui.layout(
<frame>
<canvas id="graphic" w="*" h="*"/>
</frame>
);
var f = function(x){
return x * x + 3 * x - 4;
}
var paint = new Paint();
paint.setStrokeWidth(2);
var start = -5;
var end = 5;
ui.graphic.on("draw", function(canvas){
var w = canvas.getWidth();
for (var i = 0; i < w; i++) {
var x = (end - start) / w * i + start;
var y = f(x);
canvas.drawPoint(x, y, paint);
}
});

View File

@ -0,0 +1,41 @@
"ui";
//ui布局为一块画布
ui.layout(
<frame>
<canvas id="board" w="*" h="*"/>
</frame>
);
//要绘制的函数,这里是一个一元二次函数
var f = function(x){
return x * x + 3 * x - 4;
}
//绘制区间
var minX = -5;
var maxX = 5;
var minY = -10;
//画笔
var paint = new Paint();
ui.board.on("draw", function(canvas){
var w = canvas.getWidth();
var h = canvas.getHeight();
//计算y轴区间上限
var maxY = minY + (maxX - minX) * h / w;
//设置画笔颜色为黑色
paint.setColor(colors.parseColor("#000000"));
//绘制两个坐标轴
canvas.drawLine(w / 2, 0, w / 2, h, paint);
canvas.drawLine(0, h / 2, w, h / 2, paint);
//设置画笔颜色为红色
paint.setColor(colors.parseColor("#ff0000"));
//绘制图像
for(var i = 0; i < w; i++){
var x = minX + i / w * (maxX - minX);
var y = f(x);
var j = h - (y - minY) / (maxY - minY) * h;
canvas.drawPoint(i, j, paint);
}
});

View File

@ -0,0 +1,99 @@
"ui";
//ui布局为一块画布和一些函数调整控件
ui.layout(
<vertical>
<linear>
<input id="fx" textSize="16sp" text="x*x+3*x-4" layout_weight="1"/>
<button id="ok" w="50dp"/>
</linear>
<linear>
<button id="left" text="←" layout_weight="1"/>
<button id="right" text="→" layout_weight="1"/>
<button id="up" text="↓" layout_weight="1"/>
<button id="down" text="↑" layout_weight="1"/>
<button id="zoom_in" text="+" layout_weight="1"/>
<button id="zoom_out" text="-" layout_weight="1"/>
</linear>
<canvas id="board" w="*" h="*"/>
</vertical>
);
//函数表达式
var f = "x*x+3*x-4";
//绘制区间
var minX = -5;
var maxX = 5;
var minY;
var h = 1;
var w = 1;
//画笔
var paint = new Paint();
paint.setStrokeWidth(2);
ui.board.on("draw", function(canvas){
w = canvas.getWidth();
h = canvas.getHeight();
if(minY == undefined){
minY = -(maxX - minX) * h / w / 2;
}
//计算y轴区间上限
var maxY = minY + (maxX - minX) * h / w;
//设置画笔颜色为黑色
paint.setColor(colors.parseColor("#000000"));
//绘制两个坐标轴
var x0 = parseInt(- minX / (maxX - minX) * w);
canvas.drawLine(x0, 0, x0, h, paint);
var y0 = parseInt(h + minY / (maxY - minY) * h);
canvas.drawLine(0, y0, w, y0, paint);
//设置画笔颜色为红色
paint.setColor(colors.parseColor("#ff0000"));
//绘制图像
for(var i = 0; i < w; i++){
var x = minX + i / w * (maxX - minX);
var y = eval(f);
var j = h - (y - minY) / (maxY - minY) * h;
canvas.drawPoint(i, j, paint);
}
});
ui.ok.click(()=>{
f = String(ui.fx.text());
});
ui.left.click(()=>{
var d = maxX - minX;
maxX -= d / 10;
minX -= d / 10;
});
ui.right.click(()=>{
var d = maxX - minX;
maxX += d / 10;
minX += d / 10;
});
ui.up.click(()=>{
var d = maxX - minX;
minY += d / 8;
});
ui.down.click(()=>{
var d = maxX - minX;
minY -= d / 8;
});
ui.zoom_in.click(()=>{
var d = maxX - minX;
var a = (maxX + minX) / 2;
maxX = a + d;
minX = a - d;
minY *= (maxX - minY) / d * h / w;
});
ui.zoom_out.click(()=>{
var d = maxX - minX;
maxX -= d / 2;
minX += d / 2;
});

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;
}