lua android 点击,让 Android 开发像 Web 开发一样爽

原标题:让 Android 开发像 Web 开发一样爽

作者:hanks

链接:https://juejin.im/post/5bf12c8751882511a8527ed4

做移动端开发,最蛋疼的就是不能动态发版,不能像 web 那样发版立即全部用户生效,然而 lua语言 为其提供了可能性。lua 是一种脚本语言,使用 lua 来构建跨平台原生应用有许多好处,比如 lua 语言简洁高效,可移植性好, Lua虚拟机极为轻量,仅占用200到300k的内存空间,且速度极快。

演示

写一个简单的代码演示一下。新建一个 lua 文件,叫做 view.lua, 放在手机的 sdcard 上,文件目录为 /sdcard/view.lua

require"import"

import "android.widget.*"

import "android.content.*"

functiongetView()

locallayout = {

LinearLayout,

orientation = "vertical",

layout_width = "fill",

layout_height = "fill",

{

Button,

id = "btn",

layout_marginTop= "8dp",

layout_width = "fill",

layout_height = "50dp",

text = "click"

},

}

localview = loadlayout(layout)

returnview

end

运行一下,

aa17ff4f3dc264e653bb46f9ec37f3f0.gif

屏幕中上半部分是 Android 的 xml 布局中写好的代码,当点击运行按钮时,加载 lua 脚本,返回一个 View 对象,然后添加到布局中。一个简单的 lua 脚本编写的视图就写好了。

接下来修改一下,设置个点击事件。

require"import"

import "android.widget.*"

import "android.content.*"

functiongetView()

locallayout = {

LinearLayout,

orientation = "vertical",

layout_width = "fill",

layout_height = "fill",

{

Button,

id = "btn",

layout_marginTop= "8dp",

layout_width = "fill",

layout_height = "50dp",

text = "click"

},

}

localids = {} -- store ids to find view

localview = loadlayout(layout, ids)

ids.btn.onClick = function()

Toast.makeText(activity, "2333", 0).show()

end

returnview

end

运行效果

08a677f94727e1614431f706b16f4cd9.gif

再来个稍微复杂点的例子,写个列表,新建 list.lua 文件,放在手机的 sdcard/list.lua

require"import"

import "android.widget.*"

import "android.content.*"

import "android.view.View"

import "androlua.LuaHttp"

import "androlua.LuaAdapter"

import "androlua.LuaImageLoader"

localJSON = require( "cjson")

localuihelper = require( 'uihelper')

-- create view table

locallayout = {

LinearLayout,

orientation = "vertical",

layout_width = "fill",

layout_height = "fill",

{

ListView,

id = "listview",

dividerHeight = 0,

layout_width = "fill",

layout_height = "fill",

},

}

localitem_view = {

FrameLayout,

layout_width = "fill",

layout_height = "240dp",

{

ImageView,

id = "iv_image",

layout_width = "fill",

layout_height = "fill",

scaleType = "centerCrop",

},

{

TextView,

id = "tv_title",

background = "#66000000",

layout_width = "fill",

layout_height = "fill",

padding = "32dp",

gravity = "center",

maxLines = "5",

lineSpacingMultiplier = '1.2',

textSize = "14sp",

textColor = "#CCFFFFFF",

},

}

localdata = {

dailyList = {}

}

localadapter

localfunctiongetData()

-- http://baobab.kaiyanapp.com/api/v1/feed

localurl = data.nextPageUrl

ifurl == nilthenurl = 'http://baobab.kaiyanapp.com/api/v1/feed?udid=3e7ee30c6fc0004a773dc33b0597b5732b145c04'end

ifurl: find( 'udid=') == nilthenurl = url .. '&udid=3e7ee30c6fc0004a773dc33b0597b5732b145c04'end

print(url)

LuaHttp.request({ url = url }, function(error, code, body)

iferrororcode ~= 200then

print( 'fetch data error')

return

end

localstr = JSON.decode(body)

uihelper.runOnUiThread(activity, function()

data.nextPageUrl = str.nextPageUrl

locallist = str.dailyList[ 1].videoList

fori = 1, #list do

data.dailyList[#data.dailyList + 1] = list[i]

end

adapter.notifyDataSetChanged()

end)

end)

end

localfunctionlaunchDetail(item)

Toast.makeText(activity, item.title, 0).show()

end

functiongetView()

localview = loadlayout(layout)

adapter = LuaAdapter(luajava.createProxy( "androlua.LuaAdapter$AdapterCreator", {

getCount = function()return#data.dailyList end,

getItem = function(position)returnnilend,

getItemId = function(position)returnposition end,

getView = function(position, convertView, parent)

position = position + 1-- lua 索引从 1开始

ifposition == #data.dailyList then

getData()

end

ifconvertView == nilthen

localviews = {} -- store views

convertView = loadlayout(item_view, views, ListView)

ifparent then

localparams = convertView.getLayoutParams()

params.width = parent.getWidth()

end

convertView.setTag(views)

end

localviews = convertView.getTag()

localitem = data.dailyList[position]

ifitem then

LuaImageLoader. load(views.iv_image, item.coverForFeed)

views.tv_title.setText(item.title)

end

returnconvertView

end

}))

listview.setAdapter(adapter)

listview.setOnItemClickListener(luajava.createProxy( "android.widget.AdapterView$OnItemClickListener", {

onItemClick = function(adapter, view, position, id)

launchDetail(data.dailyList[position + 1])

end,

}))

getData()

returnview

end

复制代码创建 listView , 设置 adapter ,网络请求,刷新列表。看下效果吧。

9b9e05389ecdf99868100766b42c1a72.png

代码放到了github:https://github.com/hanks-zyh/luaDevAndroid

原理图

e2f896958ca8f9add5e18778800d5edd.png

写了几篇文章比较详细的介绍了原理,想了解的可以看一下

Android 与 Lua:https://juejin.im/post/5beeeb7cf265da616c6530f8

探究 lua 在 Android 中的应用:https://juejin.im/post/5beeeaa651882546150a954f

Lua 嵌入 Android 原理:https://hanks.pub/2017/09/28/lua-into-android/

支持 iOS 吗?

Lua 是用 c 语言开发的,可移植性比较好,想支持 iOS 的话,原理时一样的,不过参考目前已有的跨平台技术。关于跨平台方面的一些个人见解,目前已有的跨平台技术每当涉及到不同平台的特性时,事情就比较蛋疼了,需要单独去适配,还有建立一堆连接库,比如选取本地图片,不同平台的数据库,平台特有 api,真是一份代码到处运行终是梦,一份儿代码到处采坑才是真。

Android 开发能支持到什么程度?

看到了上面的原理图就可以知道,支持 Android SDK 几乎所有的 API。

●编号401,输入编号直达本文返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值