优化实现多点点击

This commit is contained in:
lihongwei 2025-04-29 14:11:12 +08:00
parent a3fed6ced8
commit 9643d74864
10 changed files with 567 additions and 558 deletions

View File

@ -29,49 +29,6 @@ public class AutoClickService extends AccessibilityService {
private static final int MIN_SLIDE_DURATION = 100; private static final int MIN_SLIDE_DURATION = 100;
private static final int MAX_SLIDE_DURATION = 2000; private static final int MAX_SLIDE_DURATION = 2000;
// 事件基类
public abstract static class Event {
public abstract void perform();
}
// 点击事件
public class ClickEvent extends Event {
public int x;
public int y;
public int index; // 用于闪烁反馈
public ClickEvent(int x, int y, int index) {
this.x = x;
this.y = y;
this.index = index;
}
@Override
public void perform() {
performSingleClick(new Point(x, y), index);
}
}
// 滑动事件
public class SlideEvent extends Event {
public int startX;
public int startY;
public int endX;
public int endY;
public SlideEvent(int startX, int startY, int endX, int endY) {
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
}
@Override
public void perform() {
performSingleSlide(this);
}
}
private final List<Event> eventQueue = new ArrayList<>(); private final List<Event> eventQueue = new ArrayList<>();
private final Handler handler = new Handler(Looper.getMainLooper()); private final Handler handler = new Handler(Looper.getMainLooper());
private boolean isRunning = false; private boolean isRunning = false;
@ -140,7 +97,7 @@ public class AutoClickService extends AccessibilityService {
Point constrainedStart = ViewUtils.constrainToScreen(startX, startY, screenWidth, screenHeight); Point constrainedStart = ViewUtils.constrainToScreen(startX, startY, screenWidth, screenHeight);
Point constrainedEnd = ViewUtils.constrainToScreen(endX, endY, screenWidth, screenHeight); Point constrainedEnd = ViewUtils.constrainToScreen(endX, endY, screenWidth, screenHeight);
eventQueue.add(new SlideEvent( eventQueue.add(new SlideMultipleEvent(
constrainedStart.x, constrainedStart.y, constrainedStart.x, constrainedStart.y,
constrainedEnd.x, constrainedEnd.y)); constrainedEnd.x, constrainedEnd.y));
@ -150,7 +107,7 @@ public class AutoClickService extends AccessibilityService {
public void addMultipleSlideEvents(List<Slide> slides) { public void addMultipleSlideEvents(List<Slide> slides) {
for (Slide slide : slides) { for (Slide slide : slides) {
addSlideEvent((int) slide.startX, (int) slide.startY, (int) slide.endX, (int) slide.endY); addSlideEvent(slide.startX, slide.startY, slide.endX, slide.endY);
} }
logDebug("添加多个滑动事件: " + slides.size() + ""); logDebug("添加多个滑动事件: " + slides.size() + "");
} }
@ -215,7 +172,29 @@ public class AutoClickService extends AccessibilityService {
} }
Event event = eventQueue.get(currentEventIndex); Event event = eventQueue.get(currentEventIndex);
event.perform();
if (event instanceof ClickEvent) {
ClickEvent clickEvent = (ClickEvent) event;
logDebug("即将执行点击事件: (" + clickEvent.getX() + ", " + clickEvent.getY() + "), index=" + clickEvent.getAdditionalInfo());
} else if (event instanceof SlideMultipleEvent) {
SlideMultipleEvent slideMultipleEvent = (SlideMultipleEvent) event;
logDebug("即将执行滑动事件: 从 (" + slideMultipleEvent.startX + ", " + slideMultipleEvent.startY + ") 到 (" + slideMultipleEvent.endX + ", " + slideMultipleEvent.endY + ")");
} else {
logDebug("未知事件类型: " + event.getClass().getSimpleName());
}
if (event instanceof ClickEvent) {
ClickEvent clickEvent = (ClickEvent) event;
Point clickPoint = new Point(clickEvent.getX(), clickEvent.getY());
performSingleClick(clickPoint, clickEvent.getAdditionalInfo());
} else if (event instanceof SlideMultipleEvent) {
SlideMultipleEvent slideMultipleEvent = (SlideMultipleEvent) event;
performSlide(slideMultipleEvent);
} else {
logDebug("未知事件类型,跳过执行: " + event.getClass().getSimpleName());
// 也可以选择继续执行下一个
handler.postDelayed(this::executeNextEvent, clickInterval);
}
// 准备下一个事件 // 准备下一个事件
currentEventIndex = (currentEventIndex + 1) % eventQueue.size(); currentEventIndex = (currentEventIndex + 1) % eventQueue.size();
@ -223,7 +202,6 @@ public class AutoClickService extends AccessibilityService {
private void performSingleClick(Point clickPoint, int index) { private void performSingleClick(Point clickPoint, int index) {
logDebug("执行点击: (" + clickPoint.x + ", " + clickPoint.y + ")"); logDebug("执行点击: (" + clickPoint.x + ", " + clickPoint.y + ")");
flashTouchFeedback(index);
Path path = new Path(); Path path = new Path();
path.moveTo(clickPoint.x, clickPoint.y); path.moveTo(clickPoint.x, clickPoint.y);
@ -238,6 +216,7 @@ public class AutoClickService extends AccessibilityService {
logDebug("点击完成"); logDebug("点击完成");
if (isRunning) { if (isRunning) {
handler.postDelayed(() -> executeNextEvent(), clickInterval); handler.postDelayed(() -> executeNextEvent(), clickInterval);
flashTouchFeedback(index);
} }
} }
@ -251,7 +230,7 @@ public class AutoClickService extends AccessibilityService {
}, null); }, null);
} }
private void performSingleSlide(SlideEvent slide) { private void performSlide(SlideMultipleEvent slide) {
logDebug("执行滑动: 从 (" + slide.startX + ", " + slide.startY + logDebug("执行滑动: 从 (" + slide.startX + ", " + slide.startY +
") 到 (" + slide.endX + ", " + slide.endY + ")"); ") 到 (" + slide.endX + ", " + slide.endY + ")");
@ -290,7 +269,6 @@ public class AutoClickService extends AccessibilityService {
@Override @Override
public void onAccessibilityEvent(AccessibilityEvent event) { public void onAccessibilityEvent(AccessibilityEvent event) {
// 不需要处理辅助功能事件
} }
private void logDebug(String message) { private void logDebug(String message) {

View File

@ -0,0 +1,19 @@
package com.auto.autoclicker;
public class ClickEvent extends Event {
private int additionalInfo;
public ClickEvent(int x, int y, int additionalInfo) {
super(additionalInfo, x, y);
this.additionalInfo = additionalInfo;
}
public int getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(int additionalInfo) {
this.additionalInfo = additionalInfo;
}
}

View File

@ -8,7 +8,7 @@ import android.view.View;
public class ConnectingLineView extends View { public class ConnectingLineView extends View {
private float startX, startY, endX, endY; private float startX, startY, endX, endY;
private Paint paint; private final Paint paint;
public ConnectingLineView(Context context) { public ConnectingLineView(Context context) {
super(context); super(context);

View File

@ -1,5 +1,26 @@
package com.auto.autoclicker; package com.auto.autoclicker;
public interface Event { public class Event {
int getId(); protected int id;
protected int x;
protected int y;
public Event(int id, int x, int y) {
this.id = id;
this.x = x;
this.y = y;
}
// Getter 方法
public int getId() {
return id;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
} }

View File

@ -1,24 +1,31 @@
package com.auto.autoclicker; package com.auto.autoclicker;
import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.TextView;
public class PointEvent implements Event { public class PointEvent extends Event {
int id; private TextView view;
float x, y; private WindowManager.LayoutParams params;
View view;
WindowManager.LayoutParams params;
PointEvent(int id, float x, float y, View view, WindowManager.LayoutParams params) { public PointEvent(int id, int x, int y, TextView view, WindowManager.LayoutParams params) {
this.id = id; super(id, x, y);
this.x = x;
this.y = y;
this.view = view; this.view = view;
this.params = params; this.params = params;
} }
@Override public TextView getView() {
public int getId() { return view;
return id;
} }
}
public WindowManager.LayoutParams getParams() {
return params;
}
public void setView(TextView view) {
this.view = view;
}
public void setParams(WindowManager.LayoutParams params) {
this.params = params;
}
}

View File

@ -1,12 +1,16 @@
package com.auto.autoclicker; package com.auto.autoclicker;
public class Slide { public class Slide {
float startX, startY, endX, endY; public final int startX;
public final int startY;
public final int endX;
public final int endY;
Slide(float startX, float startY, float endX, float endY) { public Slide(int startX, int startY, int endX, int endY) {
this.startX = startX; this.startX = startX;
this.startY = startY; this.startY = startY;
this.endX = endX; this.endX = endX;
this.endY = endY; this.endY = endY;
} }
} }

View File

@ -1,25 +1,52 @@
package com.auto.autoclicker; package com.auto.autoclicker;
import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
public class SlideEvent implements Event { public class SlideEvent extends Event {
int id; private PointEvent startPoint;
PointEvent startPoint; private PointEvent endPoint;
PointEvent endPoint; private ConnectingLineView lineView;
View lineView; private WindowManager.LayoutParams lineParams;
WindowManager.LayoutParams lineParams;
SlideEvent(int id, PointEvent startPoint, PointEvent endPoint, View lineView, WindowManager.LayoutParams lineParams) { public SlideEvent(int id, PointEvent startPoint, PointEvent endPoint,
this.id = id; ConnectingLineView lineView, WindowManager.LayoutParams lineParams) {
super(id, 0, 0);
this.startPoint = startPoint; this.startPoint = startPoint;
this.endPoint = endPoint; this.endPoint = endPoint;
this.lineView = lineView; this.lineView = lineView;
this.lineParams = lineParams; this.lineParams = lineParams;
} }
@Override public PointEvent getStartPoint() {
public int getId() { return startPoint;
return id; }
public PointEvent getEndPoint() {
return endPoint;
}
public ConnectingLineView getLineView() {
return lineView;
}
public WindowManager.LayoutParams getLineParams() {
return lineParams;
}
public void setStartPoint(PointEvent startPoint) {
this.startPoint = startPoint;
}
public void setEndPoint(PointEvent endPoint) {
this.endPoint = endPoint;
}
public void setLineView(ConnectingLineView lineView) {
this.lineView = lineView;
}
public void setLineParams(WindowManager.LayoutParams lineParams) {
this.lineParams = lineParams;
} }
} }

View File

@ -0,0 +1,26 @@
package com.auto.autoclicker;
public class SlideMultipleEvent extends Event {
public int startX;
public int startY;
public int endX;
public int endY;
public SlideMultipleEvent(int startX, int startY, int endX, int endY) {
super(-1, startX, startY);
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
}
public SlideMultipleEvent(int id, int startX, int startY, int endX, int endY) {
super(id, startX, startY);
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
}
}