7.2 AndroidStudio配置Luaj案例2(添加View)
7.2.1 简介
此案例是整合Luaj提供的Android案例,Lua生成View显示在Activity中;
7.2.2 拷贝luaj的jar到项目中
解压下载压缩包,拷贝lib文件夹下的luaj-jse-3.0.1.jar到AdroidStudio项目模块的libs目录下,然后添加jar引用到gradle,
implementation files('libs/luaj-jse-3.0.1.jar')
7.2.3 创建一个View类并实现ResourceFinder接口
应提供专门的Globals.finder来查找用于加载的脚本和数据。
可以参考:Luaj的Android项目中的LuajView类
public class LuajView extends View implements ResourceFinder {
public final Globals globals;
public LuajView(Context context) {
super(context);
this.globals = JsePlatform.standardGlobals();
this.globals.finder = this;
}
// Implement a finder that loads from the assets directory.
public InputStream findResource(String name) {
try {
return getContext().getAssets().open(name);
} catch (java.io.IOException ioe) {
return null;
}
}
public void draw(Canvas canvas) {
LuaValue f = globals.get("draw");
if (!f.isnil())
try {
f.call(CoerceJavaToLua.coerce(canvas));
} catch (Exception e) {
e.printStackTrace();
}
else
super.draw(canvas);
}
public boolean f(int keyCode, KeyEvent event) {
LuaValue f = globals.get("onKeyDown");
if (!f.isnil())
try {
return f.call(CoerceJavaToLua.coerce(keyCode),
CoerceJavaToLua.coerce(event)).toboolean();
} catch (Exception e) {
e.printStackTrace();
return true;
}
else
return super.onKeyDown(keyCode, event);
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
LuaValue f = globals.get("onKeyUp");
if (!f.isnil())
try {
return f.call(CoerceJavaToLua.coerce(keyCode),
CoerceJavaToLua.coerce(event)).toboolean();
} catch (Exception e) {
e.printStackTrace();
return true;
}
else
return super.onKeyUp(keyCode, event);
}
public boolean onTouchEvent(MotionEvent event) {
LuaValue f = globals.get("onTouchEvent");
if (!f.isnil())
try {
return f.call(CoerceJavaToLua.coerce(event)).toboolean();
} catch (Exception e) {
e.printStackTrace();
return true;
}
else
return super.onTouchEvent(event);
}
public boolean onTrackballEvent(MotionEvent event) {
LuaValue f = globals.get("onTrackballEvent");
if (!f.isnil())
try {
return f.call(CoerceJavaToLua.coerce(event)).toboolean();
} catch (Exception e) {
e.printStackTrace();
return true;
}
else
return super.onTrackballEvent(event);
}
public void onWindowFocusChanged(boolean hasWindowFocus) {
LuaValue f = globals.get("onWindowFocusChanged");
if (!f.isnil())
try {
f.call(CoerceJavaToLua.coerce(hasWindowFocus));
} catch (Exception e) {
e.printStackTrace();
}
}
public void onWindowSystemUiVisibilityChanged(int visible) {
LuaValue f = globals.get("onWindowSystemUiVisibilityChanged");
if (!f.isnil())
try {
f.call(CoerceJavaToLua.coerce(visible));
} catch (Exception e) {
e.printStackTrace();
}
}
7.2.4 创建LuajView对象
ll_main = (LinearLayout)findViewById(R.id.ll_main);
luajView = new LuajView(MainActivity.this);
7.2.5 拷贝activity.lua文件
拷贝Luaj项目中的activity.lua文件到assets中;
7.2.6 加载activity.lua文件并调用函数
try {
//添加View到Activity界面
ll_main.addView(luajView);
//Activity和View转换,作为参数进行传达
LuaValue activityVal = CoerceJavaToLua.coerce(MainActivity.this);
LuaValue viewObj = CoerceJavaToLua.coerce(luajView);
luajView.globals.loadfile("activity.lua").call(activityVal, viewObj);
} catch (Exception ioe) {
ioe.toString();
}
运行结果: