feat: new ui widget canvas
This commit is contained in:
2
.idea/modules.xml
generated
2
.idea/modules.xml
generated
@@ -2,8 +2,8 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<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://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://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$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/autojs/autojs.iml" filepath="$PROJECT_DIR$/autojs/autojs.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 android.view.SurfaceView;
|
||||||
|
|
||||||
import com.stardust.autojs.core.eventloop.EventEmitter;
|
import com.stardust.autojs.core.eventloop.EventEmitter;
|
||||||
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
@@ -25,11 +26,13 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
|
|||||||
private EventEmitter mEventEmitter;
|
private EventEmitter mEventEmitter;
|
||||||
private final SurfaceHolder mHolder;
|
private final SurfaceHolder mHolder;
|
||||||
private ExecutorService mDrawingThreadPool;
|
private ExecutorService mDrawingThreadPool;
|
||||||
|
private ScriptRuntime mScriptRuntime;
|
||||||
|
|
||||||
|
|
||||||
public ScriptCanvasView(Context context, EventEmitter eventEmitter) {
|
public ScriptCanvasView(Context context, ScriptRuntime scriptRuntime) {
|
||||||
super(context);
|
super(context);
|
||||||
mEventEmitter = eventEmitter;
|
mScriptRuntime = scriptRuntime;
|
||||||
|
mEventEmitter = new EventEmitter(mScriptRuntime.bridges);
|
||||||
mHolder = getHolder();
|
mHolder = getHolder();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@@ -52,14 +55,24 @@ public class ScriptCanvasView extends SurfaceView implements SurfaceHolder.Callb
|
|||||||
if (mDrawingThreadPool == null)
|
if (mDrawingThreadPool == null)
|
||||||
mDrawingThreadPool = Executors.newCachedThreadPool();
|
mDrawingThreadPool = Executors.newCachedThreadPool();
|
||||||
mDrawingThreadPool.execute(() -> {
|
mDrawingThreadPool.execute(() -> {
|
||||||
|
Canvas canvas = null;
|
||||||
SurfaceHolder holder = getHolder();
|
SurfaceHolder holder = getHolder();
|
||||||
while (mDrawing) {
|
try {
|
||||||
Canvas canvas = holder.lockCanvas();
|
while (mDrawing) {
|
||||||
canvas.drawColor(Color.WHITE);
|
canvas = holder.lockCanvas();
|
||||||
emit("draw", canvas, this);
|
canvas.drawColor(Color.WHITE);
|
||||||
holder.unlockCanvasAndPost(canvas);
|
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
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public ViewCreator<ScriptCanvasView> getCreator() {
|
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;
|
package com.stardust.autojs.engine;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
@@ -63,6 +64,9 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine {
|
|||||||
@Override
|
@Override
|
||||||
public void forceStop() {
|
public void forceStop() {
|
||||||
LooperHelper.quitForThread(getThread());
|
LooperHelper.quitForThread(getThread());
|
||||||
|
Activity activity = (Activity) getTag("activity");
|
||||||
|
if (activity != null)
|
||||||
|
activity.finish();
|
||||||
super.forceStop();
|
super.forceStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ public class ScriptEngineProxy<S extends ScriptSource> implements ScriptEngine<S
|
|||||||
mScriptEngine = scriptEngine;
|
mScriptEngine = scriptEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ScriptEngine<S> getInner() {
|
||||||
|
return mScriptEngine;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void put(String name, Object value) {
|
public void put(String name, Object value) {
|
||||||
mScriptEngine.put(name, value);
|
mScriptEngine.put(name, value);
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
private void prepare() {
|
private void prepare() {
|
||||||
mScriptEngine.put("activity", this);
|
mScriptEngine.put("activity", this);
|
||||||
|
mScriptEngine.setTag("activity", this);
|
||||||
mScriptEngine.setTag(ScriptEngine.TAG_ENV_PATH, mScriptExecution.getConfig().getRequirePath());
|
mScriptEngine.setTag(ScriptEngine.TAG_ENV_PATH, mScriptExecution.getConfig().getRequirePath());
|
||||||
mScriptEngine.setTag(ScriptEngine.TAG_EXECUTE_PATH, mScriptExecution.getConfig().getExecutePath());
|
mScriptEngine.setTag(ScriptEngine.TAG_EXECUTE_PATH, mScriptExecution.getConfig().getExecutePath());
|
||||||
mScriptEngine.init();
|
mScriptEngine.init();
|
||||||
@@ -121,6 +122,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
|
|||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
mScriptEngine.put("activity", null);
|
mScriptEngine.put("activity", null);
|
||||||
|
mScriptEngine.setTag("activity", null);
|
||||||
mScriptEngine.destroy();
|
mScriptEngine.destroy();
|
||||||
mScriptExecution = null;
|
mScriptExecution = null;
|
||||||
}
|
}
|
||||||
@@ -149,13 +151,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
|
|||||||
if (mScriptEngine != null) {
|
if (mScriptEngine != null) {
|
||||||
mScriptEngine.forceStop();
|
mScriptEngine.forceStop();
|
||||||
}
|
}
|
||||||
mScriptEngine = new ScriptEngineProxy(mScriptEngineManager.createEngineOfSourceOrThrow(getSource())) {
|
mScriptEngine = mScriptEngineManager.createEngineOfSourceOrThrow(getSource());
|
||||||
@Override
|
|
||||||
public void forceStop() {
|
|
||||||
super.forceStop();
|
|
||||||
activity.finish();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return mScriptEngine;
|
return mScriptEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user