B2BÍøÂçÈí¼þ

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á ÉóºËÍøÕ¾ºÅ:QQ:896757558
ËÑË÷
²é¿´: 2|»Ø¸´: 0
´òÓ¡ ÉÏÒ»Ö÷Ìâ ÏÂÒ»Ö÷Ìâ

Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ

[¸´ÖÆÁ´½Ó]

1175

Ö÷Ìâ

1180

Ìû×Ó

7977

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7977
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷
Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ
Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ B2BÍøÂçÈí¼þ

Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ B2BÍøÂçÈí¼þ

Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ B2BÍøÂçÈí¼þ

Ðü¸¡´°¿ØÖÆÌ¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ B2BÍøÂçÈí¼þ

  1. /* =============================================================================
  2.    AIWROK ¼¼ÇÉÏîÄ¿ 04 ¡ª¡ª Ðü¸¡´°¿ØÖÆÌ¨£¨floatUI ¿ÉÍ϶¯Ðü¸¡´° + °´Å¥¿ØÖÆ£©

  3.    ×÷ÓÃ
  4.    ©¤©¤©¤©¤
  5.    Ò»¸öÄÜÍ϶¯¡¢Äܵ㰴ťµÄÐü¸¡Ð¡´°£¬Æ®ÔÚÆÁÄ»×îÉϲ㣺
  6.    ▶Æô¶¯ / ⏸ÔÝÍ£ / ▶»Ö¸´ / ⏹Í£Ö¹ / ÊÕÆðÕ¹¿ª / ✖¹Ø±Õ£¬
  7.    ºǫ́Òì²½ÅܶàÏß³ÌÈÎÎñ£¬´°¿ÚʵʱÏÔʾ״̬¡£

  8.    Õâ¸öÏîÄ¿ÑÝʾµÄÌØÊâ¼¼ÇÉ
  9.    ©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤
  10.    1. floatUI Ðü¸¡´°£ºloadXML ¼ÓÔØ²¼¾Ö¡¢findViewById Äÿؼþ¡¢setPosition ¶¨Î»
  11.    2. Í϶¯ÊÖÊÆ£º¸ø±êÌâÀ¸¹Ò OnTouchListener£¬Óà MotionEvent µÄ ACTION_DOWN/MOVE/UP
  12.       + getRawX/getRawY ËãÎ»ÒÆ
  13.       ⚠ Õæ»úʵ²â¿Ó£ºÖ±½Óд new View.OnTouchListener(...) »á´òÓ¡"µ±Ç°»·¾³²»Ö§³ÖÍÏ×§"£¬
  14.         ÒòΪ¶ÌÀàÃû View / MotionEvent ²¢²»ÊÇÈ«¾Ö¿ÉÓõġ£
  15.         Õýȷд·¨£ºÏÈ importClass(android.view.View) / importClass(android.view.MotionEvent)£¬
  16.         »òÓÃÈ«ÀàÃû android.view.View.OnTouchListener¡¢android.view.MotionEvent.ACTION_MOVE¡£
  17.         ±¾½Å±¾Á½Õß¶¼×öÁË£¨resolveView / resolveMotionEvent£©£¬Íϲ»¶¯Ê±»¹ÄÜ"µã±êÌâÀ¸»»Î»"¶µµ×¡£
  18.    3. °´Å¥»Øµ÷£º¿Ø¼þ.setOnClickListener(function(){...})
  19.    4. ÕÛµþ£ºView.GONE / View.VISIBLE ¿ØÖÆÖ÷ÌåÏÔÒþ£¨»·¾³²»Ö§³Öʱ»á×Ô¶¯½µ¼¶£©
  20.    5. ¹Ø±Õ£ºui.close()£¬Í¬Ê±°ÑÏß³ÌÍ£µô£¬²»Áôºǫ́ҰÏß³Ì
  21.    6. µã»÷È¥ÖØ£ºÕæ»úÉÏÒ»´Îµã»÷¿ÉÄܱ»ÅÉ·¢¶à´Î£¨ÈÕÖ¾ÀïË¢ 3 Ìõ"⏹ ÒÑÍ£Ö¹"¾ÍÊÇÕâ¸öÔ­Òò£©£¬
  22.       ËùÒÔÃüÁîÒª ¢Ù 300ms ͬÃüÁîÈ¥ÖØ ¢Ú ³ØÄÚ·½·¨×ÔÉíÃݵȣ¬Ë«±£ÏÕ¡£

  23.    ×¢Òâ
  24.    ©¤©¤©¤©¤
  25.    ±¾ÏîÄ¿µÄÐü¸¡´°¾ÍÊÇ"¿ØÖÆÌ¨"±¾Éí£¬²»ÊÇ×Ô¶¯µ¯³öÀ´Ë¢ÆÁµÄÈÕÖ¾´°¡£
  26.    ½Å±¾ÀïûÓжîÍⵯÈÕÖ¾´°£¬È«²¿ÈÕÖ¾×ß printl Êä³öµ½ IDE¡£
  27.    ============================================================================= */
  28. new floatUI().hideSystemFloat();//Òþ²Øaiworkϵͳ×Ô´øµÄÐü¸¡Í¼±ê
  29. var CFG = {
  30.     workerCount: 3,
  31.     taskCount: 15,           // ÿÂÖÈÎÎñÊý£¨ÖØÆôʱ×Ô¶¯ÖØÐÂ×°Ì
  32.     posX: 40, posY: 220,     // Ðü¸¡´°³õʼλÖÃ
  33.     cmdDebounce: 300         // ͬһÃüÁî 300ms ÄÚµÄÖØ¸´µã»÷Ö±½ÓºöÂÔ
  34. };

  35. // ============================== Java ÀർÈ루ÍÏ×§±ØÐ裩 ==============================
  36. // ¿Ó£ºÖ±½Óд new View.OnTouchListener(...) »á±¨"²»Ö§³ÖÍÏ×§"£¬
  37. // ÒòΪ¶ÌÀàÃû View / MotionEvent ²¢²»ÊÇÈ«¾Ö¿ÉÓõ쬱ØÐëÏÈ importClass¡£
  38. try { importClass(android.view.View); } catch (e) {}
  39. try { importClass(android.view.MotionEvent); } catch (e) {}

  40. /** È¡ View Àࣺ¶ÌÃû ¡ú È«ÀàÃû ¡ú null */
  41. function resolveView() {
  42.     if (typeof View !== 'undefined' && View) return View;
  43.     try { if (android && android.view && android.view.View) return android.view.View; } catch (e) {}
  44.     return null;
  45. }

  46. /** È¡ MotionEvent Àࣺ¶ÌÃû ¡ú È«ÀàÃû ¡ú null */
  47. function resolveMotionEvent() {
  48.     if (typeof MotionEvent !== 'undefined' && MotionEvent) return MotionEvent;
  49.     try { if (android && android.view && android.view.MotionEvent) return android.view.MotionEvent; } catch (e) {}
  50.     return null;
  51. }

  52. var ui = null;               // floatUI ʵÀý
  53. var ctrls = {};              // ¿Ø¼þÒýÓÃ
  54. var screenW = 1080, screenH = 1920;
  55. var dragLastX = 0, dragLastY = 0, dragging = false;
  56. var expanded = true;
  57. var winX = CFG.posX, winY = CFG.posY;
  58. var dragEnabled = false;     // ÍÏ×§ÊÇ·ñÕæµÄ°óÉÏÁË
  59. var lastCmd = { name: '', t: 0 };

  60. // ============================== ¹¤¾ß ==============================

  61. function log(m) { try { printl(m); } catch (e) {} }
  62. function sleepMs(ms) { try { java.lang.Thread.sleep(ms); } catch (e) {} }
  63. function nowMs() { return java.lang.System.currentTimeMillis(); }

  64. function getScreenSize() {
  65.     try {
  66.         var m = context.getResources().getDisplayMetrics();
  67.         if (m && m.widthPixels) { screenW = m.widthPixels; screenH = m.heightPixels; }
  68.     } catch (e) {
  69.         try { screenW = screen.getScreenWidth(); screenH = screen.getScreenHeight(); } catch (e2) {}
  70.     }
  71.     log('ÆÁÄ»³ß´ç: ' + screenW + ' x ' + screenH);
  72. }

  73. // ============================== ºǫ́ÈÎÎñ³Ø£¨¾«¼ò°æ£© ==============================

  74. function MiniPool(workerCount) {
  75.     var workerN = workerCount || 3;
  76.     var workers = [], queue = [], lock = false;
  77.     var running = false, paused = false, accepting = true;
  78.     var active = 0, total = 0, done = 0, failed = 0;
  79.     var exited = 0;            // ÒÑ×ÔÈ»Í˳öµÄÏß³ÌÊý

  80.     function section(fn) {
  81.         var g = 0;
  82.         while (lock && g < 3000) { sleepMs(2); g++; }
  83.         lock = true;
  84.         try { return fn(); } finally { lock = false; }
  85.     }

  86.     function take() {
  87.         var t = null;
  88.         section(function () { if (queue.length > 0) { t = queue.shift(); active++; } });
  89.         return t;
  90.     }

  91.     function loop(idx) {
  92.         while (running) {
  93.             if (paused) { sleepMs(120); continue; }
  94.             var task = take();
  95.             if (task == null) {
  96.                 if (!accepting && queue.length === 0) break;
  97.                 sleepMs(60);
  98.                 continue;
  99.             }
  100.             var ok = true, err = '';
  101.             try { task.fn('T' + idx); } catch (e) { ok = false; err = String(e); }
  102.             section(function () { active--; if (ok) done++; else failed++; });
  103.             consoleLog((ok ? '✔ ' : '✘ ') + 'T' + idx + ' ' + task.name + (ok ? '' : ' ' + err));
  104.         }
  105.         // ¹Ø¼ü£ºÏß³Ì×ÔÈ»ÅÜÍêÍ˳öʱ£¬Òª°Ñ³Ø×Ó״̬¹éλ£»
  106.         // ·ñÔò running Ò»Ö±ÊÇ true£¬ÈÎÎñÅÜÍêºóÔٵ㡾Æô¶¯¡¿»á±»µ±³É"ÒÑÔÚÔËÐÐ"¶ø¿Õת¡£
  107.         section(function () {
  108.             exited++;
  109.             if (exited >= workerN) { running = false; paused = false; accepting = true; }
  110.         });
  111.     }

  112.     this.add = function (name, fn) { section(function () { queue.push({ name: name, fn: fn }); total++; }); return this; };

  113.     /** ±¾ÂÖÊÇ·ñÒÑÅÜÍê */
  114.     this.isFinished = function () { return total > 0 && (done + failed) >= total; };

  115.     /** Çå¿Õ¶ÓÁÐÓë¼ÆÊý£¨Ö»ÄÜÔÚûÓÐÏß³ÌÔËÐÐʱµ÷Óã© */
  116.     this.reset = function () {
  117.         if (running || active > 0) return false;
  118.         section(function () {
  119.             queue = []; total = 0; done = 0; failed = 0; exited = 0; accepting = true; paused = false;
  120.         });
  121.         return true;
  122.     };

  123.     // ËùÓпØÖÆ·½·¨¶¼ÒªÃݵȣºÖظ´µã»÷Ö»Ìáʾ¡¢²»Öظ´Ö´ÐС¢²»Öظ´´òÈÕÖ¾
  124.     this.start = function () {
  125.         if (running) { consoleLog('¡¤ ÒѾ­ÔÚÔËÐÐÁË'); return false; }
  126.         if (queue.length === 0) { consoleLog('¡¤ ¶ÓÁÐÊǿյģ¬ÏÈ×°ÈÎÎñ'); return false; }
  127.         running = true; paused = false; accepting = true; exited = 0;
  128.         for (var i = 0; i < workerN; i++) {
  129.             var th = new thread();
  130.             workers.push(th);
  131.             (function (n) { th.runJsCode(function () { loop(n); }, 'Ðü¸¡Ì¨Ïß³Ì' + n); })(i + 1);
  132.             sleepMs(140);
  133.         }
  134.         consoleLog('▶ ÒÑÆô¶¯ ' + workerN + ' ¸öÏß³Ì');
  135.         return true;
  136.     };

  137.     this.pause = function () {
  138.         if (!running) { consoleLog('¡¤ ûÔÚÔËÐУ¬²»ÓÃÔÝÍ£'); return false; }
  139.         if (paused) { consoleLog('¡¤ ÒѾ­ÊÇÔÝͣ״̬'); return false; }
  140.         paused = true;
  141.         consoleLog('⏸ ÒÑÔÝÍ£');
  142.         return true;
  143.     };

  144.     this.resume = function () {
  145.         if (!paused) { consoleLog('¡¤ µ±Ç°²»ÊÇÔÝͣ״̬'); return false; }
  146.         paused = false;
  147.         consoleLog('▶ Òѻָ´');
  148.         return true;
  149.     };

  150.     this.stop = function () {
  151.         // ÃݵȣºÈ·ÊµÃ»¶«Î÷ÔÚÅܾÍʲô¶¼²»×ö£¨"⏹ ÒÑÍ£Ö¹"Ë¢ 3 Ìõ¾ÍÊÇÕâôÀ´µÄ£©
  152.         var inf = this.info();
  153.         if (!inf.running && inf.alive === 0 && inf.active === 0) {
  154.             consoleLog('¡¤ ÒѾ­Í£Ö¹ÁË');
  155.             return false;
  156.         }
  157.         accepting = false; running = false; paused = false;
  158.         for (var i = 0; i < workers.length; i++) {
  159.             try { if (workers[i].isAlive()) workers[i].stop(); } catch (e) {}
  160.         }
  161.         exited = 0;
  162.         consoleLog('⏹ ÒÑÍ£Ö¹');
  163.         return true;
  164.     };

  165.     this.info = function () {
  166.         var a = 0;
  167.         for (var i = 0; i < workers.length; i++) { try { if (workers[i].isAlive()) a++; } catch (e) {} }
  168.         return { total: total, done: done, failed: failed, queue: queue.length, active: active, alive: a, paused: paused, running: running };
  169.     };
  170. }

  171. var pool = null;

  172. // ============================== ´°¿ÚÄÚµÄ״̬ÏÔʾ ==============================

  173. var consoleLines = [];

  174. function consoleLog(text) {
  175.     var n = new Date();
  176.     var t = ('0' + n.getHours()).slice(-2) + ':' + ('0' + n.getMinutes()).slice(-2) + ':' + ('0' + n.getSeconds()).slice(-2);
  177.     consoleLines.unshift('[' + t + '] ' + text);
  178.     if (consoleLines.length > 4) consoleLines = consoleLines.slice(0, 4);
  179.     log(text);
  180.     // ×¢Ò⣺ÕâÀï²»Ö±½ÓË¢¿Ø¼þ¡£¿Ø¼þ¸üÐÂͳһ·Åµ½Ö÷Ïß³ÌÐÄÌøÀï×ö£¬
  181.     // ±ÜÃ⹤×÷Ïß³ÌÖ±½Ó²Ù×÷ UI ´¥·¢ Android µÄ "only the original thread can touch its views" Òì³£¡£
  182. }

  183. function renderConsole() {
  184.     try {
  185.         if (ctrls.log) ctrls.log.setText(consoleLines.join('\n'));
  186.     } catch (e) {}
  187. }

  188. function refreshStatus() {
  189.     if (!pool) return;
  190.     var i = pool.info();
  191.     var pct = i.total > 0 ? Math.floor((i.done + i.failed) * 100 / i.total) : 0;
  192.     var txt = '½ø¶È ' + pct + '%   ✔' + i.done + '  ✘' + i.failed +
  193.               '  ¶ÓÁÐ' + i.queue + '  Ïß³Ì' + i.alive;
  194.     try { if (ctrls.status) ctrls.status.setText(txt); } catch (e) {}
  195. }

  196. // ============================== ¸¡¶¯´°¿Ú ==============================

  197. function buildXml() {
  198.     return '' +
  199.     '<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ' +
  200.     '  android:id="box" android:layout_width="230dp" android:layout_height="wrap_content" ' +
  201.     '  android:orientation="vertical" android:background="#E6111A2B" android:padding="6dp">' +

  202.     '  <LinearLayout android:id="title" android:layout_width="match_parent" ' +
  203.     '    android:layout_height="34dp" android:orientation="horizontal" android:gravity="center_vertical" ' +
  204.     '    android:background="#1F2A44">' +
  205.     '    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" ' +
  206.     '      android:text="✥" android:textColor="#8FA3C8" android:textSize="15sp" android:paddingLeft="6dp" android:paddingRight="6dp"/>' +
  207.     '    <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" ' +
  208.     '      android:text="AIWROK ¿ØÖÆÌ¨" android:textColor="#FFFFFF" android:textSize="13sp"/>' +
  209.     '    <Button android:id="btnFold" android:layout_width="34dp" android:layout_height="28dp" ' +
  210.     '      android:text="£­" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#334155" android:padding="0dp"/>' +
  211.     '    <Button android:id="btnClose" android:layout_width="34dp" android:layout_height="28dp" ' +
  212.     '      android:text="✕" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#EF4444" android:padding="0dp"/>' +
  213.     '  </LinearLayout>' +

  214.     '  <LinearLayout android:id="body" android:layout_width="match_parent" ' +
  215.     '    android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="6dp">' +

  216.     '    <TextView android:id="status" android:layout_width="match_parent" android:layout_height="wrap_content" ' +
  217.     '      android:text="½ø¶È 0%   ✔0  ✘0  ¶ÓÁÐ0  Ïß³Ì0" android:textColor="#60A5FA" android:textSize="11sp" android:paddingBottom="6dp"/>' +

  218.     '    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" ' +
  219.     '      android:orientation="horizontal">' +
  220.     '      <Button android:id="btnStart" android:layout_width="0dp" android:layout_weight="1" ' +
  221.     '        android:layout_height="36dp" android:text="▶ Æô¶¯" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#16A34A" android:padding="0dp"/>' +
  222.     '      <Button android:id="btnPause" android:layout_width="0dp" android:layout_weight="1" ' +
  223.     '        android:layout_height="36dp" android:text="⏸ ÔÝÍ£" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#D97706" android:padding="0dp"/>' +
  224.     '    </LinearLayout>' +

  225.     '    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" ' +
  226.     '      android:orientation="horizontal" android:paddingTop="4dp">' +
  227.     '      <Button android:id="btnResume" android:layout_width="0dp" android:layout_weight="1" ' +
  228.     '        android:layout_height="36dp" android:text="▶ »Ö¸´" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#2563EB" android:padding="0dp"/>' +
  229.     '      <Button android:id="btnStop" android:layout_width="0dp" android:layout_weight="1" ' +
  230.     '        android:layout_height="36dp" android:text="⏹ Í£Ö¹" android:textColor="#FFFFFF" android:textSize="12sp" android:background="#B91C1C" android:padding="0dp"/>' +
  231.     '    </LinearLayout>' +

  232.     '    <TextView android:id="log" android:layout_width="match_parent" android:layout_height="wrap_content" ' +
  233.     '      android:text="" android:textColor="#86EFAC" android:textSize="10sp" android:paddingTop="6dp"/>' +
  234.     '  </LinearLayout>' +
  235.     '</LinearLayout>';
  236. }

  237. function moveTo(x, y) {
  238.     if (x < 0) x = 0;
  239.     if (y < 0) y = 0;
  240.     if (x > screenW - 120) x = screenW - 120;
  241.     if (y > screenH - 80) y = screenH - 80;
  242.     winX = x; winY = y;
  243.     try { ui.setPosition(x, y); } catch (e) {}
  244. }

  245. /** °ó¶¨ÍÏ×§¡£É豸ʵ²â£º¶ÌÀàÃû View/MotionEvent ²»´æÔÚ ¡ú ±ØÐëÓà importClass ºóµÄÀà */
  246. function setupDrag() {
  247.     var V = resolveView();
  248.     var M = resolveMotionEvent();
  249.     if (!V || !M || !ctrls.title || !ctrls.title.setOnTouchListener) {
  250.         log('⚠ ÍÏ×§²»¿ÉÓã¨È± ' + (V ? '' : 'View ') + (M ? '' : 'MotionEvent') + '£©£¬¸ÄÓá¾µã±êÌâÀ¸»»Î»¡¿');
  251.         bindTitleTapToMove();
  252.         return false;
  253.     }
  254.     try {
  255.         ctrls.title.setOnTouchListener(new V.OnTouchListener({
  256.             onTouch: function (view, event) {
  257.                 try {
  258.                     switch (event.getAction()) {
  259.                         case M.ACTION_DOWN:
  260.                             dragging = true;
  261.                             dragLastX = event.getRawX();
  262.                             dragLastY = event.getRawY();
  263.                             break;
  264.                         case M.ACTION_MOVE:
  265.                             if (dragging) {
  266.                                 var dx = event.getRawX() - dragLastX;
  267.                                 var dy = event.getRawY() - dragLastY;
  268.                                 moveTo(winX + dx, winY + dy);
  269.                                 dragLastX = event.getRawX();
  270.                                 dragLastY = event.getRawY();
  271.                             }
  272.                             break;
  273.                         case M.ACTION_UP:
  274.                             dragging = false;
  275.                             break;
  276.                     }
  277.                     return true;
  278.                 } catch (e2) { return false; }
  279.             }
  280.         }));
  281.         dragEnabled = true;
  282.         log('✔ ÍÏ×§ÒѰ󶨣º°´×¡±êÌâÀ¸¿ÉÒÆ¶¯´°¿Ú');
  283.         return true;
  284.     } catch (e) {
  285.         log('⚠ ÍÏ×§°ó¶¨Ê§°Ü: ' + e);
  286.         bindTitleTapToMove();
  287.         return false;
  288.     }
  289. }

  290. /** ÍÏ×§²»¿ÉÓÃʱµÄ¶µµ×£ºµãһϱêÌâÀ¸£¬ÔÚ¼¸¸öÔ¤ÉèλÖüäÑ­»· */
  291. var presetIdx = -1;
  292. function bindTitleTapToMove() {
  293.     if (!ctrls.title || !ctrls.title.setOnClickListener) return;
  294.     try {
  295.         ctrls.title.setOnClickListener(function () {
  296.             var presets = [
  297.                 [20, 160], [Math.floor(screenW * 0.5) - 115, 160],
  298.                 [screenW - 250, 160], [screenW - 250, Math.floor(screenH * 0.5)],
  299.                 [20, Math.floor(screenH * 0.6)]
  300.             ];
  301.             presetIdx = (presetIdx + 1) % presets.length;
  302.             moveTo(presets[presetIdx][0], presets[presetIdx][1]);
  303.             log('↔ ´°¿ÚÒÑ»»Î»µ½µÚ ' + (presetIdx + 1) + ' ¸öλÖÃ');
  304.         });
  305.     } catch (e) {}
  306. }

  307. function toggleFold() {
  308.     expanded = !expanded;
  309.     var V = resolveView();
  310.     try {
  311.         if (V && V.GONE !== undefined && ctrls.body && ctrls.body.setVisibility) {
  312.             ctrls.body.setVisibility(expanded ? V.VISIBLE : V.GONE);
  313.             log(expanded ? '&#128316; ÒÑÕ¹¿ª' : '&#128317; ÒÑÊÕÆð');
  314.             return true;
  315.         }
  316.     } catch (e) {}
  317.     expanded = true;
  318.     log('⚠ µ±Ç°»·¾³²»Ö§³ÖÕÛµþ£¬´°¿Ú±£³ÖÕ¹¿ª');
  319.     return false;
  320. }

  321. function closeConsole() {
  322.     log('✖ ¹Ø±Õ¿ØÖÆÌ¨');
  323.     try { pool.stop(); } catch (e) {}
  324.     try { ui.close(); } catch (e) { log('¹Ø±ÕÐü¸¡´°Ê§°Ü: ' + e); }
  325.     alive = false;
  326. }

  327. // ============================== ÃüÁî·Ö·¢£¨È¥ÖØ + Á¢¼´Ë¢½çÃæ£© ==============================
  328. // ʵ²â·¢ÏÖ£ºÒ»´Îµã»÷¿ÉÄܱ»ÅÉ·¢¶à´Î£¨3 ÌõһģһÑùµÄ"ÒÑÍ£Ö¹"¾ÍÊÇÕâôÀ´µÄ£©¡£
  329. // Ë«±£ÏÕ£º¢Ù ͬһÃüÁî 300ms ÄÚÖ»ÈϵÚÒ»´Î£»¢Ú MiniPool ÄÚ²¿¸÷·½·¨±¾ÉíÃݵȡ£

  330. function onceCmd(name) {
  331.     var t = nowMs();
  332.     if (name === lastCmd.name && t - lastCmd.t < CFG.cmdDebounce) return false;
  333.     lastCmd = { name: name, t: t };
  334.     return true;
  335. }

  336. /** °´Å¥»Øµ÷ÅÜÔÚ UI Ị̈߳¬ÕâÀïÖ±½ÓË¢¿Ø¼þÊǰ²È«µÄ£¬µãÍêÁ¢¿ÌÄÜ¿´µ½±ä»¯ */
  337. function afterCmd() {
  338.     refreshStatus();
  339.     renderConsole();
  340. }

  341. function cmdStart() {
  342.     if (!onceCmd('start')) return;
  343.     if (pool.isFinished()) {                 // ÉÏÒ»ÂÖÒÑÅÜÍê ¡ú ×Ô¶¯ÖØÐÂ×°Ì±ÜÃâ"ÖØÆô¿ÕÅÜ"
  344.         pool.reset();
  345.         refillTasks();
  346.         consoleLog('&#128260; ÒÑÖØÐÂ×°Ìî ' + CFG.taskCount + ' ¸öÈÎÎñ');
  347.     }
  348.     pool.start();
  349.     afterCmd();
  350. }

  351. function cmdPause()  { if (!onceCmd('pause'))  return; pool.pause();  afterCmd(); }
  352. function cmdResume() { if (!onceCmd('resume')) return; pool.resume(); afterCmd(); }
  353. function cmdStop()   { if (!onceCmd('stop'))   return; pool.stop();   afterCmd(); }
  354. function cmdFold()   { if (!onceCmd('fold'))   return; toggleFold();  afterCmd(); }
  355. function cmdClose()  { if (!onceCmd('close'))  return; closeConsole(); }

  356. // ============================== ½çÃæ×°Åä ==============================

  357. var alive = true;

  358. function createConsole() {
  359.     getScreenSize();
  360.     ui = new floatUI();
  361.     ui.loadXML(buildXml());

  362.     ctrls.title     = ui.findViewById('title');
  363.     ctrls.body      = ui.findViewById('body');
  364.     ctrls.status    = ui.findViewById('status');
  365.     ctrls.log       = ui.findViewById('log');
  366.     ctrls.btnStart  = ui.findViewById('btnStart');
  367.     ctrls.btnPause  = ui.findViewById('btnPause');
  368.     ctrls.btnResume = ui.findViewById('btnResume');
  369.     ctrls.btnStop   = ui.findViewById('btnStop');
  370.     ctrls.btnFold   = ui.findViewById('btnFold');
  371.     ctrls.btnClose  = ui.findViewById('btnClose');

  372.     if (!ctrls.btnStart) { log('✘ Ðü¸¡´°¿Ø¼þδȡµ½£¬É豸¿ÉÄܲ»Ö§³Ö floatUI'); return false; }

  373.     // °´Å¥Ê¼þ£¨Í³Ò»×ß cmd* ·Ö·¢Æ÷£º´øÈ¥ÖØ + ÃÝµÈ + Á¢¼´Ë¢½çÃæ£©
  374.     ctrls.btnStart.setOnClickListener(function () { try { cmdStart(); } catch (e) { log('Æô¶¯Ê§°Ü: ' + e); } });
  375.     ctrls.btnPause.setOnClickListener(function () { try { cmdPause(); } catch (e) {} });
  376.     ctrls.btnResume.setOnClickListener(function () { try { cmdResume(); } catch (e) {} });
  377.     ctrls.btnStop.setOnClickListener(function () { try { cmdStop(); } catch (e) {} });
  378.     ctrls.btnFold.setOnClickListener(function () { try { cmdFold(); } catch (e) {} });
  379.     ctrls.btnClose.setOnClickListener(function () { try { cmdClose(); } catch (e) {} });

  380.     setupDrag();
  381.     moveTo(CFG.posX, CFG.posY);
  382.     consoleLog('¿ØÖÆÌ¨¾ÍÐ÷£¬µã¡¾▶ Æô¶¯¡¿ÅÜÈÎÎñ');
  383.     return true;
  384. }

  385. // ============================== ÈÎÎñÓëÐÄÌø ==============================

  386. function buildTask(idx) {
  387.     return function (tag) {
  388.         sleepMs(rand.randNumber(400, 1200));
  389.         if (idx % 8 === 0) throw new Error('µÚ' + idx + '¸öÈÎÎñÒì³£');
  390.     };
  391. }

  392. /** ×°ÌîÒ»ÂÖÈÎÎñ */
  393. function refillTasks() {
  394.     for (var i = 1; i <= CFG.taskCount; i++) pool.add('ÈÎÎñ' + i, buildTask(i));
  395. }

  396. /** ÐÄÌø£¨ÅÜÔÚÖ÷Ị̈߳©£ºË¢Ð´°¿Ú״̬ + ¸øÖ÷Ï̱߳£»î */
  397. function heartbeat() {
  398.     if (!alive) { log('ÐÄÌø½áÊø£¬Ö÷Ïß³ÌÍ˳ö'); return; }
  399.     refreshStatus();
  400.     renderConsole();
  401.     runTime.setTimeout(heartbeat, 1000);
  402. }

  403. // ============================== Èë¿Ú ==============================

  404. function main() {
  405.     log('¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T');
  406.     log('  Ðü¸¡´°¿ØÖÆÌ¨£¨floatUI£©');
  407.     log('¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T');

  408.     pool = new MiniPool(CFG.workerCount);
  409.     refillTasks();

  410.     if (!createConsole()) return;

  411.     heartbeat();
  412.     log(dragEnabled ? '&#128073; °´×¡±êÌâÀ¸Í϶¯´°¿Ú' : '&#128073; µã±êÌâÀ¸¿ÉÑ­»·»»Î»');
  413.     log('   ¡¾▶ Æô¶¯¡¿ÅÜÈÎÎñ  ¡¾⏸ ÔÝÍ£¡¿/¡¾▶ »Ö¸´¡¿  ¡¾⏹ Í£Ö¹¡¿  ¡¾£­¡¿ÊÕÆð  ¡¾✕¡¿¹Ø±Õ');
  414.     log('   ÈÎÎñÅÜÍêºóÔٵ㡾▶ Æô¶¯¡¿»á×Ô¶¯ÖØÐÂ×°ÌîÒ»ÂÖ');
  415. }

  416. main();
¸´ÖÆ´úÂë


»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

QQ|»ÓªÏúÈí¼þ×ÛºÏÌÖÂÛ|»ÓªÏúÈí¼þÓÐÎʱشð|»ÓªÏúÈí¼þ½Ì³Ì×¨Çø|»ÓªÏúÈí¼þPOST½Å±¾·ÖÏí|»ÓªÏúÈí¼þÆÕͨ½Å±¾·ÖÏí|»ÓªÏúÈí¼þÈí¼þ×ÊѶ|»ÓªÏúÈí¼þ¾«Æ·Èí¼þ|»ÓªÏúÈí¼þ¸üй«¸æ|ÓªÏúÈí¼þ|B2BÈí¼þ|B2BÍøÂçÈí¼þ ( ¾©ICP±¸09078825ºÅ )±¾ÍøÕ¾¿ª·¢µÄÓªÏúÈí¼þÊÇÒ»¿îеÄÍøÂçÓªÏúÈí¼þ£¬Õâ¿îÓªÏú¿ÉÒÔÈ¥ÍøÕ¾Èí¼þ£¬²©¿ÍÈí¼þ£¬B2BÈí¼þ£¬·ÖÀàÐÅÏ¢Íø·¢Ìù£¬¿ÉÒÔÇÀɳ·¢£¬¿ÉÒÔµ½°Ù¶ÈÎÄ¿âÉÏ´«WORDÎĵµ£¬¿ÉÒÔµ½Ò»Ð©ÊÇÏà²áÍøÕ¾×Ô¶¯ÉÏ´«Í¼Æ¬£¬Õâ¸ö×Ô¶¯·¢ÌûÈí¼þ×Ô´øÔÆÖ©Ö룬¼Ó¿ìÊÕ¼£¬ÓÐ6ÖÖ¶Ô½Ó´òÂë½Ó¿Ú£¬·½±ã£¬Ð§Âʸߣ¬Ëٶȿ죬¶øÇÒ¶ÔÍ϶¯µÄÑéÖ¤ÂëÈ«ÍøµÚÒ»¼Ò¶À¼ÒÖ§³Ö£¬È«²¿Ô­´´¼¼Êõ£¬¶À¼ÒÑз¢£¬Õý°æÔ­´´´ø°æÈ¨Èí¼þ¡£Ñ¡ÔñÍòÄÜÓªÏúÈí¼þ£¬¾ÍÑ¡ÔñÁËÒ»ÖÖ׬ǮµÄЧÂÊ£¬´ÓûÓб»³¬Ô½¹ý£¬Ò»Ö±ÔÚŬÁ¦Ñз¢Ð¼¼Êõ¡£·Å·ÉÃÎÏ룬½â·ÅË«ÊÖ£¬À´µã´´Ò⣬³É¾ÍÄãµÄÃÎÏ룬¾ÍÔÚÍòÄÜÓªÏúÈí¼þ¿ªÊ¼

map2

GMT+8, 2026-9-14 07:38 , Processed in 0.106814 second(s), 33 queries .

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí