local material3 = elgg.import("material3") context = material3:getContext() context.setTheme(0x7f090069) import "android.os.*" import "android.view.*" import "android.widget.*" import "android.graphics.PixelFormat" import "android.graphics.Color" import "android.graphics.drawable.GradientDrawable" import "android.graphics.drawable.StateListDrawable" import "com.google.android.material.materialswitch.MaterialSwitch" import "android.graphics.Color" import "android.content.res.ColorStateList" import "android.animation.LayoutTransition" import 'com.google.android.material.slider.Slider' import "android.animation.ObjectAnimator" import "android.animation.AnimatorSet" import "android.view.animation.DecelerateInterpolator" import "android.animation.LayoutTransition" import "android.animation.ValueAnimator" import "android.view.animation.LinearInterpolator" import "android.renderscript.*" import "android.graphics.Bitmap" import "android.graphics.Canvas" import "android.os.Handler" import "android.os.Looper" local window = activity.getSystemService("window") local QingXu = {} gg.setVisible(false) local HotPoint = luajava.bindClass("android.ext.HotPoint") local HP = HotPoint.getMethod("d") HotPoint = HotPoint.instance HotPoint.f() local function getVerticalBG(gtvb1, gtvb3, gtvb4, gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local colors = luajava.new(GradientDrawable) colors.setColor(gtvb1) colors.setCornerRadius(gtvb3) colors.setGradientType(GradientDrawable.LINEAR_GRADIENT) colors.setStroke(gtvb4, gtvb5) return colors end function miaobian(d, r, t, y) local drawable = GradientDrawable() drawable.setShape(GradientDrawable.RECTANGLE) drawable.setColor(t) -- 直接传入 0xAARRGGBB 格式的颜色值 drawable.setCornerRadii({r, r, r, r, r, r, r, r}) drawable.setStroke(d, y) -- 直接传入 0xAARRGGBB 格式的颜色值 return drawable end function getShepeBackground(color, radiu) local drawable = luajava.new(GradientDrawable) drawable.setShape(GradientDrawable.RECTANGLE) drawable.setColor(color) drawable.setCornerRadii({radiu, radiu, radiu, radiu, radiu, radiu, radiu, radiu}) return drawable end local function getButtonBG() local selector = StateListDrawable() local state = android.R.attr.state_pressed selector.addState({state}, getVerticalBG("0xffeeeeee", 15)) selector.addState({-state}, getVerticalBG("0xffeeeeee", 15)) return selector end local function getLayoutParams() local LayoutParams = WindowManager.LayoutParams local layoutParams = luajava.new(LayoutParams) layoutParams.type = Build.VERSION.SDK_INT >= 26 and LayoutParams.TYPE_APPLICATION_OVERLAY or LayoutParams.TYPE_PHONE layoutParams.format = PixelFormat.RGBA_8888 layoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_ALT_FOCUSABLE_IM layoutParams.gravity = Gravity.CENTER -- 位置居中 layoutParams.width = LayoutParams.WRAP_CONTENT layoutParams.height = LayoutParams.WRAP_CONTENT return layoutParams end -- 新开一个线程来执行功能 local function threadStart(runnable) local newRun = luajava.createProxy("java.lang.Runnable", runnable) local subThread = luajava.newInstance("java.lang.Thread", newRun) subThread:start() end -- 切换菜单 local change_menu -- 开关 QingXu.switch = function(name, func1, func2) local sw sw = loadlayout({ MaterialSwitch; text = " "..name; textColor = "#000000"; padding = "5dp"; layout_width = "match"; layout_height = "match"; onClick = function() local func = sw.checked and func1 or func2 threadStart({ run = function() pcall(func) end }) end }) local tmp = loadlayout({ LinearLayout, background = getButtonBG(), layout_width = 'fill_parent', layout_height = "40dp", layout_margin = "2dp", elevation="2dp", gravity = "center_vertical", padding = { "0dp", "0dp", "6dp", "0dp" }, }) local rest = loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "wrap_content", gravity = "center_vertical", }) tmp.addView(sw) rest.addView(tmp) return rest end QingXu.seek = function(name,bian,smin,smax,nows) local sw _ENV[bian] =nows smin=tonumber(smin) smax=tonumber(smax) if _ENV[bian] == nil then _ENV[bian] = 1.0 end if not name then name = "未设置" end sw = loadlayout({ Slider, thumbHeight='23dp', trackHeight='15dp', tickVisible=false, TrackActiveTintList=ColorStateList({{}},{"0xff".."000000"}), TrackInactiveTintList=ColorStateList({{}},{"0x55".."000000"}), ThumbTintList=ColorStateList({{}},{"0xff".."000000"}), layout_width = 'match_parent', id=luajava.newId(name.."seekbar"), valueFrom=smin, valueTo=smax, value=nows, stepSize=1.0, }) sw.addOnChangeListener({ onValueChange = function(slider, value, fromUser) _ENV[bian] = value end }) local tmp = loadlayout({ LinearLayout, background = getButtonBG(), layout_width = 'fill_parent', layout_height = "40dp", layout_marginLeft = '2dp', layout_marginRight = '2dp', layout_marginTop = '2dp', layout_marginBottom = '2dp', elevation="2dp", gravity = "center_vertical", padding = { "0dp", "0dp", "6dp", "0dp" },{TextView, padding={"5dp","10dp","0dp","10dp",}, gravity = "top", textColor='#000000', textSize='13sp', text = name, id = luajava.newId(names), layout_width = 'wrap_content', layout_marginLeft = "5dp",} }) local rest = loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "wrap_content", gravity = "center_vertical", }) tmp.addView(sw) rest.addView(tmp) return rest end -- 文字 QingXu.text = function(txt, color, size) local tmp = { TextView, text = txt or "未设置文字", textSize = size or "18sp", textColor = color or "#545454", layout_width = "wrap_content", } return loadlayout(tmp) end layoutTransition=LayoutTransition() function visi (tid , ttid) local tview = luajava.getIdView (tid) local ttview = luajava.getIdView (ttid) if not tview then return 0 end if tonumber (tostring (tview : getVisibility ())) == 8.0 then tview.setVisibility (View.VISIBLE) else tview.setVisibility (View.GONE) end end -- 初始化 colorvs 变量 local colorvs = {} boxes={} boxpic={} function visi(tid, ttid) local tview = luajava.getIdView(tid) local arrowView = luajava.getIdView(tid.."_arrow") -- 获取箭头图标视图 if not tview then return 0 end if tonumber(tostring(tview:getVisibility())) == 8.0 then tview.setVisibility(View.VISIBLE) -- 展开时旋转箭头向下90度 local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 0, 90) anim.setDuration(300) anim.start() else tview.setVisibility(View.GONE) -- 收缩时旋转箭头回到0度 local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 90, 0) anim.setDuration(300) anim.start() end end function QingXu.box(views) local tid = "box"..string.randomUUID(true) colorvs[#colorvs+1] = {"box",tid} local arrowIcon = { ImageView, id = luajava.newId(tid.."_arrow"), layout_width="wrap_content", layout_height="wrap_content", src = "/storage/emulated/0/定制资源/heir.png", ColorFilter = "0xff515151" } local ttid = tid.."6" local firadio = { LinearLayout, layout_width='fill_parent', background = getShepeBackground(0xffeeeeee, 15), elevation="2dp", layout_height="wrap_content", layout_margin="4dp", orientation="vertical", LayoutTransition = LayoutTransition() } if type(views[1]) == "string" or type(views[1]) == "number" then firadio[#firadio + 1] = { LinearLayout, layout_width='fill_parent', layout_height="40dp", gravity="center_vertical", onClick = function() visi(tid,ttid) end, { LinearLayout, layout_width='fill_parent', layout_height="30dp", layout_marginRight="4dp", layout_marginLeft="4dp", gravity="center_vertical", background = getShepeBackground(0xffeeeeee, 15), { TextView, gravity="center_vertical", text=views[1], textColor="0xff010101", textSize="15sp", layout_weight=1, layout_marginLeft="15dp", layout_marginRight="20dp", layout_width='fill_parent', }, { LinearLayout, padding={"0dp","0dp","15dp","0dp"}, layout_width="30dp", layout_height="30dp", gravity="center", arrowIcon } } } else gg.alert("QingXu.box 的 table 内第一个元素必须是 string") os.exit() end local contentLayout = { LinearLayout, layout_marginLeft="10dp", layout_marginRight="10dp", layout_marginBottom="10dp", orientation="vertical", visibility="gone", id=luajava.newId(tid), layout_width='fill_parent', } for i=2,#views do table.insert(contentLayout, views[i]) end local finalLayout = loadlayout(firadio) local contentView = loadlayout(contentLayout) finalLayout.addView(contentView) boxes[tid] = contentView return finalLayout end QingXu.button = function(name,func) local btn1 = { RelativeLayout, layout_width = "match", layout_height = "40dp", elevation="2dp", layout_margin = "2dp", layout_marginLeft = "5dp", -- 左侧外边距 5dp layout_marginRight = "5dp", -- 右侧外边距 5dp background = getButtonBG(), { TextView, text = name, textColor = "0xff010101", layout_margin = "5dp", layout_marginLeft = "14dp", layout_width = "wrap", layout_height = "match", gravity = "center", layout_alignParentLeft = true, -- 固定在左侧 }, { ImageView, layout_width = "15dp", layout_height = "15dp", layout_margin = "10dp", layout_marginRight = "20dp", -- 右侧外边距 5dp ColorFilter = "0xff010101", src = "/storage/emulated/0/定制资源/heir.png", layout_alignParentRight = true, -- 固定在右侧 layout_centerVertical = true, -- 垂直居中 }, } local btn1 = loadlayout(btn1) btn1.onClick = function() if eooeis == 1 then eooeis = 2 else threadStart({ run = function() pcall(func) end, }) end end return btn1 end QingXu.checkbox = function(views) if #views == 0 then return end -- 创建主垂直布局 local mainLayout = loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = 'wrap_content', orientation = 'vertical' }) -- 创建横向滑动布局 local scrollView = loadlayout({ HorizontalScrollView, layout_width = 'fill_parent', layout_height = 'wrap_content', { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'vertical', id = 'rows_container' } }) mainLayout.addView(scrollView) -- 计算每行最多3个复选框 local buttonsPerRow = 4 local currentRow = nil local buttonsInCurrentRow = 0 for i, v in ipairs(views) do -- 每行开始时创建新的水平布局 if buttonsInCurrentRow % buttonsPerRow == 0 then currentRow = loadlayout({ LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', id = 'row_'..math.ceil(i/buttonsPerRow) }) rows_container.addView(currentRow) end local func1, func2 = v[2], v[3] local sw = loadlayout({ CheckBox; layout_width = 'wrap_content', layout_height = '32dp', buttonTintList=ColorStateList({{android.R.attr.state_checked},{-android.R.attr.state_checked}},{0xFf000000,0xff000000},{0xff000000,0xff000000}), onClick = function(view) local isChecked = view.isChecked() -- print("复选框"..i.."状态:", isChecked) threadStart({ run = function() if isChecked and v[2] then pcall(v[2]) -- 选中状态回调 elseif not isChecked and v[3] then pcall(v[3]) -- 取消选中状态回调 end end }) end }) local buju = loadlayout({ LinearLayout, layout_width = '70dp', layout_height = "70dp", { CardView; layout_width='match_parent', layout_height="match_parent", layout_margin = "5dp", elevation = "2dp"; background = getVerticalBG(0xffeeeeee,15,5,0xffeeeeee), {RelativeLayout, { ImageView, padding="10dp", layout_margin="2dp", layout_width='match_parent', layout_height="match_parent", src = views[i]["图片"], }, { TextView, layout_width = "wrap", layout_height = "wrap", textSize="10sp", layout_margin="2dp", layout_alignParentBottom="true", layout_alignParentRight="true", text = v[1], textColor = "#000000"; }, sw } } }) -- 添加到当前行 currentRow.addView(buju) buttonsInCurrentRow = buttonsInCurrentRow + 1 end return mainLayout end QingXu.menu = function(icon, title, menu) local layout = { -- 功能部分 LinearLayout; layout_height = "wrap_content"; layout_width = "wrap_content"; id = "windows"; { CardView; layout_height = UI高度; layout_width = UI宽度; id = "ooo"; background = getShepeBackground(0xffffffff, 25), { -- 功能部分 LinearLayout; layout_height = "match_parent"; layout_width = "match_parent"; { -- 功能部分 LinearLayout; layout_height = "match_parent"; background = getShepeBackground(0xffeeeeee, 15), layout_width = "110dp"; orientation = "vertical"; gravity = "center", { CircleImageView, layout_width = "40dp", layout_margin = "5dp"; clickable = true, focusable = true, id="yddd", src = "/storage/emulated/0/定制资源/opoback.png", layout_height = "40dp", }, { TextView, layout_width = "match", layout_height = "30dp", gravity = "center", text = "心有余 力不足", textColor="0xff010101", }, { -- 侧边栏 菜单按钮 ScrollView; layout_height = "match_parent"; layout_width = "match_parent"; layout_margin = "5dp"; { LinearLayout; layout_height = "wrap"; gravity = "center"; layout_width = "match_parent"; orientation = "vertical"; id = "menu_list", }; }; }; -- 下面是按钮,用代码添加 { LinearLayout; layout_height = "match_parent"; background = getShepeBackground(0x00F9EDF1, 25), id = "main", layout_width = "match_parent"; orientation = "vertical"; { LinearLayout, layout_height = "30dp", layout_width = "match", {RelativeLayout, layout_width = "match", layout_height = "30dp", { TextView, id = "current_page_title", -- 添加ID layout_width = "80dp", layout_height = "30dp", layout_margin = "5dp", text = "", -- 默认文本 textColor = "0xff010101", textSize="18sp", layout_marginLeft = "20dp", }, { ImageView, layout_width = "30dp", layout_height = "30dp", layout_margin = "5dp", src ='/storage/emulated/0/定制资源/heix.png', id = 'window_exit', layout_alignParentRight="true", layout_marginRight = "40dp", }, { ImageView, layout_width = "30dp", layout_height = "30dp", layout_margin = "5dp", src = '/storage/emulated/0/定制资源/a006152028.png', id = 'lessen', layout_alignParentRight="true", }, }, }, }; } }, }; local ball = { LinearLayout; layout_height = "fill", layout_width = "fill", { LinearLayout; layout_width = "50dp"; { ImageView, layout_width = "40dp", id = "suspended_ball", --icon = icon, src = icon, --background = icon, layout_height = "40dp", } } } ball = loadlayout(ball) local window_layout = loadlayout(layout) local menu_layout = {} local icon_list = {} -- 由于写布局的id会写出变量,这边就直接写个列表来记录菜单的图标 (为了切换菜单 改变颜色) -- 第一步 添加侧边按钮 for i, v in ipairs(menu) do local item = loadlayout { LinearLayout, layout_width = "match_parent", -- 修正:使用match_parent替代match layout_margin = "2dp", layout_height = "wrap", background = miaobian(0,25,"0x00CCE8EA","0xdfCCE8EA"), gravity = "center", onClick = function() change_menu(i) end, { ImageView, layout_width = "30dp", layout_height = "30dp", layout_margin = "3dp", src = v.icon or icon -- 使用菜单项的图标或默认图标 }, { LinearLayout, layout_width = "match_parent", layout_height = "wrap", layout_margin = "1dp", orientation = "vertical", { TextView, text = v.name, textColor = "0xff010101", textSize = "12sp", layout_width = "wrap", layout_height = "wrap", }, { TextView, text = v.desc or "测试文本xxxxxxx", -- 可选的描述文本 textColor = "0xff515151", textSize = "8sp", layout_width = "wrap", layout_height = "wrap", }, } } local func_layout = { -- 这个是每个菜单的布局 LinearLayout; layout_height = "match_parent"; layout_width = "match_parent"; orientation = "vertical"; { ScrollView; fillViewport = "true"; layout_width = "match_parent"; layout_height = "match_parent"; { LinearLayout; layout_width = "match_parent"; layout_marginLeft = "5dp"; id = "layout_func" .. i; layout_marginRight = "5dp"; gravity = "center_horizontal"; orientation = "vertical"; }; }; } table.insert(icon_list,item) menu_layout[i] = loadlayout(func_layout) menu_list.addView(item) -- 给右侧菜单加功能 for _, k in ipairs(v) do _ENV['layout_func' .. i].addView(k) end end local mainLayoutParams = getLayoutParams() do local last change_menu = function(i) if last then icon_list[last].setBackground(miaobian(0,25,"0x00CCE8EA","0xdfCCE8EA")) main.removeView(menu_layout[last]) end icon_list[i].setBackground(miaobian(0, 25, "0xffffffff", "0xff006970")) last = i main.addView(menu_layout[i]) current_page_title.setText(menu[i].name) end change_menu(1) end -- 退出按钮 window_exit.onClick = function() HP.invoke(HotPoint,nil) window.removeView(window_layout, mainLayoutParams) --clearSnowAnimation() Looper.myLooper().quitSafely() end do -- 这是创建两个悬浮窗缩小放大的按钮, 还有移动事件 local t = { {suspended_ball, ball, window_layout}, {lessen, window_layout, ball} } local tt = { {yddd, window_layout}, {suspended_ball, ball} } for i, v in ipairs(t) do v[1].onClick = function() -- 悬浮球点击 if v[1] == suspended_ball then window.removeView(v[2], mainLayoutParams) window.addView(v[3], mainLayoutParams) elseif v[1] == lessen then window.removeView(v[2], mainLayoutParams) window.addView(v[3], mainLayoutParams) end end local x, y, RawX, RawY = 0, 0, 0, 0 tt[i][1].onTouch = function (_, event) local Action = event.getAction() if Action == MotionEvent.ACTION_DOWN then RawX, RawY = event.getRawX(), event.getRawY() x, y = mainLayoutParams.x, mainLayoutParams.y elseif Action == MotionEvent.ACTION_MOVE then mainLayoutParams.x = tonumber(x) + (event.getRawX() - RawX) mainLayoutParams.y = tonumber(y) + (event.getRawY() - RawY) window.updateViewLayout(tt[i][2], mainLayoutParams) end end end end Handler(Looper.getMainLooper()) Looper.prepare() window.addView(ball, mainLayoutParams) Looper.loop() end UI高度 =820 UI宽度 =1080 --getPic('http://wp.qimoyanzheng.com/static/logo.png') local icon = '/storage/emulated/0/定制资源/opoback.png' -- 悬浮窗图标, 写链接 local menu = { { name = '首页公告', desc = '条条大路通罗马', icon = '/storage/emulated/0/定制资源/f6b17d.png', QingXu.button('选择进程',function() gg.setProcessX() end), QingXu.button('大厅初始化',function() qx() end), QingXu.button('清除冻结列表',function() gg.setProcessX() end), QingXu.button('框架防闪',function() qx() end), }, { name = '', desc = '秒刷新美化', icon = '/storage/emulated/0/定制资源/d16ff7.png', QingXu.seek("seek","ltlz",1,100,1),--名字,变量名字,最小,最大,初始 QingXu.switch('开关', function() local Y = gg.makeRequest("https://v1.hitokoto.cn/").content local text = string.match(Y, 'hitokoto(.+)type') text = string.gsub(text, '"[:,]"', "") gg.alert("今日语录:\n\n" .. text) end, function() gg.alert('开关关闭') end), }, { name = '参数配置', desc = '美化参数配置', icon = '/storage/emulated/0/定制资源/d4aefc.png', QingXu.switch('开关', function() gg.alert('开关开启') end, function() gg.alert('开关关闭') end), }, { name = 'DIY人物', desc = '自定义人物美化', icon = '/storage/emulated/0/定制资源/d02be8.png', QingXu.switch('开关', function() gg.alert('开关开启') end, function() gg.alert('开关关闭') end), }, { name = 'DIY枪械', desc = '自定义枪械美化', icon = '/storage/emulated/0/定制资源/b0088b.png', QingXu.switch('开关', function() gg.alert('开关开启') end, function() gg.alert('开关关闭') end), }, { name = 'DIY功能', desc = '自定义游戏功能', icon = '/storage/emulated/0/定制资源/b4e557.png', }, } -- 图标,标题,菜单 QingXu.menu(icon, title, menu)