diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java
index 58d7b7c..8709064 100644
--- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java
+++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java
@@ -364,6 +364,12 @@ public class MainActivity extends AppCompatActivity {
binding.single.setEnabled(isFloatingShown == FLOATING_NONE);
binding.multi.setEnabled(isFloatingShown == FLOATING_NONE);
+
+ if (isFloatingShown == FLOATING_NONE) {
+ setVideo(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bolangblue));
+ } else {
+ setVideo(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bolangred));
+ }
}
private void setStartButtonEnabled(boolean enabled) {
diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java
index 01b6f86..cc08bfb 100644
--- a/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java
+++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java
@@ -17,7 +17,6 @@ import androidx.fragment.app.Fragment;
import com.auto.clicker.autoclicker.R;
import com.auto.clicker.autoclicker.databinding.FragmentActionBinding;
-
public class ActionFragment extends Fragment {
private FragmentActionBinding binding;
diff --git a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java
new file mode 100644
index 0000000..88ec55e
--- /dev/null
+++ b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java
@@ -0,0 +1,410 @@
+package com.auto.clicker.autoclicker.view;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.InputType;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.appcompat.widget.SwitchCompat;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.auto.clicker.autoclicker.R;
+import com.auto.clicker.autoclicker.service.AutoClickService;
+
+public class FloatingSettingDialogManager {
+
+ private static final String TAG = "FloatingSettingDialogManager";
+ private final Context context;
+ private final WindowManager windowManager;
+ private ConstraintLayout floatingDialogView;
+ private WindowManager.LayoutParams floatingDialogParams;
+
+ private FloatingViewManager floatingViewManager;
+
+ private static final int TYPE_INTERVAL = 0;
+ private static final int TYPE_SWIPE_DURATION = 1;
+ private static final int TYPE_REPEAT = 2;
+
+ private LinearLayout intervalSelectorContainer;
+ private LinearLayout unitSelectorContainer;
+ private SwitchCompat repeatSwitch;
+ private LinearLayout repeatInput;
+ private LinearLayout repeatSelectorContainer;
+ private EditText etIntervalValue;
+ private TextView intervalSelectedUnit;
+ private EditText etDurationValue;
+ private TextView tvSelectedUnit;
+ private EditText etRepeatValue;
+ private TextView repeatSelectedUnit;
+
+ public FloatingSettingDialogManager(Context context) {
+ this.context = context;
+ this.windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ }
+
+ public void setFloatingViewManager(FloatingViewManager manager) {
+ this.floatingViewManager = manager;
+ }
+
+ public void showFloatingTabDialog() {
+ if (floatingDialogView != null) {
+ removeFloatingTabDialog();
+ }
+
+ Context themedContext = new ContextThemeWrapper(context, R.style.Theme_AutoClicker);
+
+ floatingDialogView = (ConstraintLayout) LayoutInflater.from(themedContext).inflate(R.layout.floating_setting_dialog, null);
+ floatingDialogParams = createFloatingDialogParams();
+
+ intervalSelectorContainer = floatingDialogView.findViewById(R.id.dialog_interval_selector_container);
+ unitSelectorContainer = floatingDialogView.findViewById(R.id.dialog_unit_selector_container);
+ repeatSwitch = floatingDialogView.findViewById(R.id.dialog_repeat_switch);
+ repeatInput = floatingDialogView.findViewById(R.id.dialog_repeat_input);
+ repeatSelectorContainer = floatingDialogView.findViewById(R.id.dialog_repeat_selector_container);
+ etIntervalValue = floatingDialogView.findViewById(R.id.dialog_et_interval_value);
+ intervalSelectedUnit = floatingDialogView.findViewById(R.id.dialog_interval_selected_unit);
+ etDurationValue = floatingDialogView.findViewById(R.id.dialog_et_duration_value);
+ tvSelectedUnit = floatingDialogView.findViewById(R.id.dialog_tv_selected_unit);
+ etRepeatValue = floatingDialogView.findViewById(R.id.dialog_et_repeat_value);
+ repeatSelectedUnit = floatingDialogView.findViewById(R.id.dialog_repeat_selected_unit);
+
+ intervalSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_INTERVAL));
+ unitSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_SWIPE_DURATION));
+
+ setupRepeatMode();
+
+ floatingDialogView.setOnTouchListener((v, event) -> {
+ if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ // 如果是外部点击事件,就关闭对话框
+ removeFloatingTabDialog();
+ Log.d(TAG, "检测到外部点击,浮动标签页弹窗已关闭。");
+ return true; // 消费此事件
+ }
+ return false; // 其他事件不处理
+ });
+
+ try {
+ windowManager.addView(floatingDialogView, floatingDialogParams);
+ Log.d(TAG, "浮动标签页弹窗已显示");
+ } catch (WindowManager.BadTokenException e) {
+ Log.e(TAG, "无法添加浮动标签页弹窗,可能是权限问题或上下文无效", e);
+ showToastOnUi(context, "显示弹窗失败,请检查权限。");
+ } catch (SecurityException e) {
+ Log.e(TAG, "需要悬浮窗权限才能显示浮动弹窗", e);
+ showToastOnUi(context, "请授予悬浮窗权限以便显示。");
+ }
+ }
+
+ public void removeFloatingTabDialog() {
+ if (floatingDialogView != null) {
+ try {
+ windowManager.removeView(floatingDialogView);
+ floatingDialogView = null;
+ intervalSelectorContainer = null;
+ unitSelectorContainer = null;
+ repeatSwitch = null;
+ repeatInput = null;
+ repeatSelectorContainer = null;
+ etIntervalValue = null;
+ intervalSelectedUnit = null;
+ etDurationValue = null;
+ tvSelectedUnit = null;
+ etRepeatValue = null;
+ repeatSelectedUnit = null;
+
+ Log.d(TAG, "浮动标签页弹窗已移除");
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "尝试移除不存在的视图", e);
+ }
+ }
+ }
+
+ private WindowManager.LayoutParams createFloatingDialogParams() {
+ int overlayType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
+ WindowManager.LayoutParams.TYPE_PHONE;
+
+ WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+ WindowManager.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.WRAP_CONTENT,
+ overlayType,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL // 允许将触摸事件传递到其下方窗口
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, // 监听外部触摸事件
+ PixelFormat.TRANSLUCENT
+ );
+ params.gravity = Gravity.CENTER;
+ return params;
+ }
+
+ private void setupRepeatMode() {
+ if (repeatSwitch == null || repeatInput == null || repeatSelectorContainer == null ||
+ repeatSelectedUnit == null || etRepeatValue == null) {
+ Log.e(TAG, "repeat mode UI components not found. Skipping setupRepeatMode.");
+ return;
+ }
+
+ repeatSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (isChecked) {
+ repeatInput.setVisibility(View.VISIBLE);
+ repeatSelectorContainer.setVisibility(View.VISIBLE);
+ repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(false);
+ etRepeatValue.setInputType(InputType.TYPE_NULL);
+ } else {
+ repeatInput.setVisibility(View.GONE);
+ repeatSelectorContainer.setVisibility(View.GONE);
+ }
+ });
+
+ // 根据初始状态设置可见性
+ if (!repeatSwitch.isChecked()) {
+ repeatInput.setVisibility(View.GONE);
+ repeatSelectorContainer.setVisibility(View.GONE);
+ } else {
+ repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(false);
+ etRepeatValue.setInputType(InputType.TYPE_NULL);
+ }
+
+ repeatSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_REPEAT));
+ }
+
+ private void showUnitSelection(View anchorView, int type) {
+ View popupView = LayoutInflater.from(context).inflate(R.layout.dialog_unit_selection, null);
+ PopupWindow popupWindow = new PopupWindow(
+ popupView,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ true
+ );
+
+ popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ popupWindow.setOutsideTouchable(true);
+
+ TextView tvMs = popupView.findViewById(R.id.tv_unit_ms);
+ TextView tvSec = popupView.findViewById(R.id.tv_unit_sec);
+ TextView tvMin = popupView.findViewById(R.id.tv_unit_min);
+ TextView tvInfinitely = popupView.findViewById(R.id.tv_unit_infinitely);
+ TextView tvDuration = popupView.findViewById(R.id.tv_unit_duration);
+ TextView tvCycle = popupView.findViewById(R.id.tv_unit_cycle);
+
+ switch (type) {
+ case TYPE_INTERVAL:
+ tvMs.setVisibility(View.VISIBLE);
+ tvSec.setVisibility(View.VISIBLE);
+ tvMin.setVisibility(View.VISIBLE);
+ tvInfinitely.setVisibility(View.GONE);
+ tvDuration.setVisibility(View.GONE);
+ tvCycle.setVisibility(View.GONE);
+ break;
+ case TYPE_SWIPE_DURATION:
+ tvMs.setVisibility(View.VISIBLE);
+ tvSec.setVisibility(View.VISIBLE);
+ tvMin.setVisibility(View.GONE);
+ tvInfinitely.setVisibility(View.GONE);
+ tvDuration.setVisibility(View.GONE);
+ tvCycle.setVisibility(View.GONE);
+ break;
+ case TYPE_REPEAT:
+ tvMs.setVisibility(View.GONE);
+ tvSec.setVisibility(View.GONE);
+ tvMin.setVisibility(View.GONE);
+ tvInfinitely.setVisibility(View.VISIBLE);
+ tvDuration.setVisibility(View.VISIBLE);
+ tvCycle.setVisibility(View.VISIBLE);
+ Log.d(TAG, "TYPE_REPEAT: infinitely, duration, cycle visible.");
+ break;
+ }
+
+ if (type == TYPE_INTERVAL || type == TYPE_SWIPE_DURATION) {
+ tvMs.setOnClickListener(v -> {
+ String unitText = context.getString(R.string.milliseconds_unit);
+ if (type == TYPE_INTERVAL) {
+ intervalSelectedUnit.setText(unitText);
+ showInputValue("Interval", etIntervalValue.getText().toString(), unitText);
+ } else {
+ tvSelectedUnit.setText(unitText);
+ showInputValue("Swipe Duration", etDurationValue.getText().toString(), unitText);
+ }
+ popupWindow.dismiss();
+ });
+
+ tvSec.setOnClickListener(v -> {
+ String unitText = context.getString(R.string.seconds_unit);
+ if (type == TYPE_INTERVAL) {
+ intervalSelectedUnit.setText(unitText);
+ showInputValue("Interval", etIntervalValue.getText().toString(), unitText);
+ } else {
+ tvSelectedUnit.setText(unitText);
+ showInputValue("Swipe Duration", etDurationValue.getText().toString(), unitText);
+ }
+ popupWindow.dismiss();
+ });
+
+ if (type == TYPE_INTERVAL) {
+ tvMin.setOnClickListener(v -> {
+ String unitText = context.getString(R.string.minutes_unit);
+ intervalSelectedUnit.setText(unitText);
+ popupWindow.dismiss();
+ showInputValue("Interval", etIntervalValue.getText().toString(), unitText);
+ });
+ }
+ }
+
+ if (type == TYPE_REPEAT) {
+ tvInfinitely.setOnClickListener(v -> {
+ repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(false);
+ etRepeatValue.setInputType(InputType.TYPE_NULL);
+ popupWindow.dismiss();
+ showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.infinitely_unit));
+ });
+
+ tvDuration.setOnClickListener(v -> {
+ repeatSelectedUnit.setText(context.getString(R.string.duration_unit));
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(true);
+ etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
+ popupWindow.dismiss();
+ showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.duration_unit));
+ });
+
+ tvCycle.setOnClickListener(v -> {
+ repeatSelectedUnit.setText(context.getString(R.string.cycle_unit));
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(true);
+ etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
+ popupWindow.dismiss();
+ showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.cycle_unit));
+ });
+ }
+
+ if (type == TYPE_REPEAT) {
+ popupWindow.showAsDropDown(anchorView, 0, -500);
+ } else {
+ popupWindow.showAsDropDown(anchorView);
+ }
+
+ }
+
+ private void showInputValue(String type, String value, String unit) {
+ String message = type + " 值: " + (value.isEmpty() ? "未输入" : value) + ", 单位: " + unit;
+ showToastOnUi(context, message);
+
+ AutoClickService service = AutoClickService.getInstance();
+
+ switch (type) {
+ case "Interval":
+ long intervalValue = 0;
+ if (!value.isEmpty()) {
+ try {
+ intervalValue = Long.parseLong(value);
+ // 根据 unit 进行单位转换
+ if (unit.equals(context.getString(R.string.seconds_unit))) {
+ intervalValue *= 1000; // 如果单位是秒,转换为毫秒
+ }
+ if (service != null) {
+ service.setClickInterval(intervalValue);
+ } else {
+ Log.e(TAG, "AutoClickService 实例为空,无法设置点击间隔。");
+ }
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "点击间隔值解析错误: " + value, e);
+ showToastOnUi(context, "点击间隔值无效,请输入有效数字。");
+ }
+ }
+ // 你可以在这里将 intervalValue 保存到你的数据模型或 SharedPreferences
+ break;
+
+ case "Swipe Duration":
+ int slideDurationValue = 0;
+ if (!value.isEmpty()) {
+ try {
+ slideDurationValue = Integer.parseInt(value);
+ if (unit.equals(context.getString(R.string.seconds_unit))) {
+ slideDurationValue *= 1000; // 如果单位是秒,转换为毫秒
+ }
+ if (service != null) {
+ service.setSlideDuration(slideDurationValue);
+ } else {
+ Log.e(TAG, "AutoClickService 实例为空,无法设置滑动时长。");
+ }
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "滑动时长值解析错误: " + value, e);
+ showToastOnUi(context, "滑动时长值无效,请输入有效数字。");
+ }
+ }
+ // 你可以在这里将 slideDurationValue 保存到你的数据模型或 SharedPreferences
+ break;
+
+ case "Repeat":
+ if (unit.equals(context.getString(R.string.infinitely_unit))) {
+ // Repeat 为无限次,不需要处理输入值
+ // 确保 etRepeatValue 是禁用的
+ etRepeatValue.setText("");
+ etRepeatValue.setEnabled(false);
+ etRepeatValue.setInputType(InputType.TYPE_NULL);
+ showToastOnUi(context, "重复模式: 无限次");
+ // AutoClickService 内部已是循环执行,无限次意味着一直运行直到用户停止。
+ // 如果需要更明确的无限次模式,可以在 AutoClickService 中设置一个标志位。
+ } else if (unit.equals(context.getString(R.string.duration_unit))) {
+ // Repeat 为时长,处理时间格式的输入 (例如 "HH:mm:ss" -> 毫秒)
+ String durationValueStr = value.isEmpty() ? "0" : value;
+ // TODO: 你需要在这里添加解析时间格式的逻辑,例如:
+ // long parsedDuration = parseDurationString(durationValueStr); // 自定义方法解析时间
+ // 如果 AutoClickService 需要总运行时间限制,你需要修改 AutoClickService 来支持。
+ // 否则,你可能需要在悬浮窗管理类中实现一个计时器,当达到设定时长时调用 service.stopClicking()。
+ etRepeatValue.setEnabled(true);
+ etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); // 这里暂时设置为数字,如果需要特定时间输入,需要更复杂的实现
+ showToastOnUi(context, "重复时长: " + durationValueStr);
+ } else if (unit.equals(context.getString(R.string.cycle_unit))) {
+ // Repeat 为次数,处理整数输入
+ int repeatCount = 0;
+ if (!value.isEmpty()) {
+ try {
+ repeatCount = Integer.parseInt(value);
+ // TODO: 如果 AutoClickService 需要总循环次数限制,你需要修改 AutoClickService 来支持。
+ // 可以在 AutoClickService 中添加一个变量来跟踪剩余循环次数,并在每次事件队列执行完毕后递减。
+ // 当次数为 0 时,调用 stopClicking()。
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "重复次数值解析错误: " + value, e);
+ showToastOnUi(context, "重复次数值无效,请输入有效数字。");
+ }
+ }
+ etRepeatValue.setEnabled(true);
+ etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
+ showToastOnUi(context, "重复次数: " + repeatCount);
+ }
+ break;
+ }
+ }
+
+ public static void showToastOnUi(Context context, String msg) {
+ new Handler(Looper.getMainLooper()).post(() ->
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java
index d4e09e8..e2e5e8e 100644
--- a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java
+++ b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java
@@ -1,6 +1,5 @@
package com.auto.clicker.autoclicker.view;
-import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -12,7 +11,6 @@ import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
-import android.text.InputType;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
@@ -21,15 +19,12 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.auto.clicker.autoclicker.R;
@@ -80,6 +75,7 @@ public class FloatingViewManager {
private boolean areEventsVisible = true;
private final FloatingTabDialogManager floatingTabDialogManager;
+ private final FloatingSettingDialogManager floatingSettingDialogManager;
private final EventRepository eventRepository;
@@ -97,7 +93,9 @@ public class FloatingViewManager {
this.screenWidth = screenSize.x;
this.screenHeight = screenSize.y;
this.floatingTabDialogManager = new FloatingTabDialogManager(context);
+ this.floatingSettingDialogManager = new FloatingSettingDialogManager(context);
this.floatingTabDialogManager.setFloatingViewManager(this);
+ this.floatingSettingDialogManager.setFloatingViewManager(this);
this.eventRepository = new EventRepository(context.getApplicationContext());
this.touchPointSize = 100;
@@ -238,6 +236,7 @@ public class FloatingViewManager {
addButton.setVisibility(View.GONE);
removeButton.setVisibility(View.GONE);
slideButton.setVisibility(View.GONE);
+ addPointEvent();
}
playButton.setOnClickListener(v -> toggleMultipleClicking());
@@ -259,7 +258,9 @@ public class FloatingViewManager {
}
});
- settingButton.setOnClickListener(v -> showInputDialog());
+ settingButton.setOnClickListener(v -> {
+ floatingSettingDialogManager.showFloatingTabDialog();
+ });
closeButton.setOnClickListener(v -> closeFloatingViews());
}
@@ -413,7 +414,7 @@ public class FloatingViewManager {
PrefUtils.setFloatingShown(context, 0);
Intent intent = new Intent("com.auto.clicker.autoclicker.FLOATING_WINDOW_STATE_CHANGED");
- intent.putExtra("isShown", false);
+ intent.putExtra("isShown", 0);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
@@ -459,6 +460,10 @@ public class FloatingViewManager {
floatingTabDialogManager.removeFloatingTabDialog();
}
+ if (floatingSettingDialogManager != null) {
+ floatingSettingDialogManager.removeFloatingTabDialog();
+ }
+
Log.d(TAG, "所有浮动视图(包括控制栏和事件)已移除");
}
@@ -535,55 +540,6 @@ public class FloatingViewManager {
}
}
- public void showInputDialog() {
- EditText input = new EditText(context);
- input.setInputType(InputType.TYPE_CLASS_NUMBER);
- input.setHint("输入点击间隔(ms)");
- input.setFocusableInTouchMode(true);
-
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle("设置点击间隔")
- .setView(input)
- .setPositiveButton("确定", (dialog, which) -> {
- String value = input.getText().toString();
- try {
- long interval = Long.parseLong(value);
- AutoClickService service = AutoClickService.getInstance();
- if (service != null) {
- service.setClickInterval(interval);
- } else {
- Log.w("InputDialog", "AutoClickService 未初始化");
- }
- } catch (NumberFormatException e) {
- Toast.makeText(context, "无效输入", Toast.LENGTH_SHORT).show();
- }
- dialog.dismiss();
- })
- .setNegativeButton("取消", (dialog, which) -> dialog.dismiss());
-
- AlertDialog dialog = builder.create();
-
- if (!(context instanceof Activity)) {
- if (dialog.getWindow() != null) {
- dialog.getWindow().setType(
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
- WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
- WindowManager.LayoutParams.TYPE_PHONE
- );
- }
- }
-
- dialog.show();
-
- input.requestFocus();
- input.post(() -> {
- InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
- if (imm != null) {
- imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
- }
- });
- }
-
public void flashTouchPoint(int index) {
if (index >= 0 && index < runtimeEvents.size()) {
Event event = runtimeEvents.get(index).getEvent();
diff --git a/app/src/main/res/drawable/green_ring.xml b/app/src/main/res/drawable/green_ring.xml
new file mode 100644
index 0000000..f985f17
--- /dev/null
+++ b/app/src/main/res/drawable/green_ring.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/touch_point.xml b/app/src/main/res/drawable/touch_point.xml
index 53630de..4e98262 100644
--- a/app/src/main/res/drawable/touch_point.xml
+++ b/app/src/main/res/drawable/touch_point.xml
@@ -1,9 +1,6 @@
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/floating_setting_dialog.xml b/app/src/main/res/layout/floating_setting_dialog.xml
new file mode 100644
index 0000000..6bb6769
--- /dev/null
+++ b/app/src/main/res/layout/floating_setting_dialog.xml
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file