mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-21 21:01:43 +08:00
feat: new ui widget canvas
This commit is contained in:
parent
c5e3050732
commit
f16b3ad922
@ -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" />
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
41
app/src/main/assets/sample/画布/函数图像简单版.js
Normal file
41
app/src/main/assets/sample/画布/函数图像简单版.js
Normal 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);
|
||||
}
|
||||
});
|
||||
99
app/src/main/assets/sample/画布/函数图像高级版.js
Normal file
99
app/src/main/assets/sample/画布/函数图像高级版.js
Normal 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;
|
||||
});
|
||||
@ -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");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user