5 大帅哥隋昊航 11小时前 54次点击
此代码由隋昊航本人亲手制作。
隋昊航自己给自己赞助播出。
这个呢,代码是这样的,我的手是这样的,左右滑动可以切换上一项和下一项。
然后呢?单指上滑确定,单指下滑返回。
然后修改了一系列的 bug。
下面请看正文。
require "import"
import "android.widget.*"
import "android.view.*"
function 取触摸动作(e)
return e.getAction()
end
function 取关联按键(e)
return e.getActionButton()
end
function 取触摸点ID(e,i)
return e.getPointerId(i)
end
function 取坐标(e,i)
return e.getX(i),e.getY(i)
end
function 取工具类型(e,i)
return e.getToolType(i)
end
function 取外接按键状态(e)
return e.getButtonState()
end
function 取触摸分类(e)
return e.getClassification()
end
function 取辅助键状态(e)
return e.getMetaState()
end
function 取系统标志(e)
return e.getFlags()
end
function 取边缘标志(e)
return e.getEdgeFlags()
end
function 取触摸点数量(e)
return e.getPointerCount()
end
function 取历史事件数(e)
return e.getHistorySize()
end
function 取事件时间(e)
return e.getEventTime()
end
function 取按下时间(e)
return e.getDownTime()
end
function 取设备ID(e)
return e.getDeviceId()
end
function 取事件来源(e)
return e.getSource()
end
function 取屏幕ID(e)
return e.getDisplayId()
end
--vv:要挂载触摸的view控件
--func回调表:
-- 左=选中上一项,右=选中下一项,上=确定,下=取消
-- 上2,下2,左2,右2 双指;上3,下3,左3,右3 三指
function 初始化(vv,func)
func=func or {
上=function()end,
下=function()end,
左=function()end,
右=function()end,
上2=function()end,
下2=function()end,
左2=function()end,
右2=function()end,
上3=function()end,
下3=function()end,
左3=function()end,
右3=function()end
}
local 上=func["上"] --单指上滑:确定
local 下=func["下"] --单指下滑:取消
local 左=func["左"] --单指左滑:上一个项目
local 右=func["右"] --单指右滑:下一个项目
local 上2=func["上2"]
local 下2=func["下2"]
local 左2=func["左2"]
local 右2=func["右2"]
local 上3=func["上3"]
local 下3=func["下3"]
local 左3=func["左3"]
local 右3=func["右3"]
local 灵敏度=45
local 冷却=200
local 状态=1 --1允许触发,0冷却锁定
local 数据={}
for i=0,9 do
data["cx"..i]=0
data["cy"..i]=0
data["x"..i]=0
data["y"..i]=0
end
--修复:局部状态锁
local function 状态锁()
if 状态==1 then
状态=0
task(冷却,function()
if 状态==0 then
状态=1
end
end)
end
end
--修复:计算方向内置,能访问灵敏度,补齐全部角度条件
local function 计算方向(bx,by,滑动阈值)
滑动阈值=滑动阈值 or 灵敏度
local 横向偏移有效=math.abs(bx)>=滑动阈值
local 纵向偏移有效=math.abs(by)>=滑动阈值
if not 横向偏移有效 and not 纵向偏移有效 then
return false
end
local 角度=math.deg(math.atan2(by,bx))
if 角度 > -45 and 角度 <= 45 then
return 1 --右
elseif 角度 > 45 and 角度 <=135 then
return 2 --下
elseif 角度 >135 or 角度 <= -135 then
return -1 --左
else
return 0 --上
end
end
vv.onTouch=function(k,v)
local 动作=取触摸动作(v)
local 点=取触摸点数量(v)
--按下,记录各个触点原始坐标
for i=0,点-1 do
if 数据["cx"..i]==0 and 数据["cy"..i]==0 then
数据["cx"..i],数据["cy"..i]=取坐标(v,i)
end
end
--手指全部抬起,清空全部触点,恢复状态
if 动作==1 then
for i=0,9 do
数据["cx"..i]=0
数据["cy"..i]=0
数据["x"..i]=0
数据["y"..i]=0
end
状态=1
return true
end
--更新实时触点坐标
for i=0,点-1 do
数据["x"..i],数据["y"..i]=取坐标(v,i)
end
-- =========单指手势:你的界面交互逻辑=========
if 动作==2 and 点==1 and 状态==1 then
local dir=计算方向(数据.x0-数据.cx0,数据.y0-数据.cy0)
if dir==0 then
状态锁()
上() --上滑=确定
elseif dir==2 then
状态锁()
下() --下滑=取消
elseif dir==-1 then
状态锁()
左() --左滑,上一项
elseif dir==1 then
状态锁()
右() --右滑,下一项
end
end
-- =========双指手势,全部加状态锁,修复旧bug=========
if 动作==2 and 点==2 and 状态==1 then
local d0=计算方向(数据.x0-数据.cx0,数据.y0-数据.cy0)
local d1=计算方向(数据.x1-数据.cx1,数据.y1-数据.cy1)
if d0==-1 and d1==-1 then
状态锁()
左2()
elseif d0==1 and d1==1 then
状态锁()
右2()
elseif d0==0 and d1==0 then
状态锁()
上2()
elseif d0==2 and d1==2 then
状态锁()
下2()
end
end
-- =========三指手势,全部加状态锁=========
if 动作==2 and 点==3 and 状态==1 then
local d0=计算方向(数据.x0-数据.cx0,数据.y0-数据.cy0)
local d1=计算方向(数据.x1-数据.cx1,数据.y1-数据.cy1)
local d2=计算方向(数据.x2-数据.cx2,数据.y2-数据.cy2)
if d0==0 and d1==0 and d2==0 then
状态锁()
上3()
elseif d0==2 and d1==2 and d2==2 then
状态锁()
下3()
elseif d0==-1 and d1==-1 and d2==-1 then
状态锁()
左3()
elseif d0==1 and d1==1 and d2==1 then
状态锁()
右3()
end
end
return true
end
end
--===============调用示例================
-- local 视图=LinearLayout(context)
-- 初始化(视图,{
-- 左=function() print("上一个项目") end,
-- 右=function() print("下一个项目") end,
-- 上=function() print("确定") end,
-- 下=function() print("取消") end,
-- 上2=function() print("双指上滑")end,
-- 下2=function() print("双指下滑")end,
-- 左2=function() print("双指左滑")end,
-- 右2=function() print("双指右滑")end,
-- 上3=function() print("三指上滑")end,
-- 下3=function() print("三指下滑")end,
-- 左3=function() print("三指左滑")end,
-- 右3=function() print("三指右滑")end
-- })
不会看不懂,不会写代码。