优化实现多点点击
This commit is contained in:
parent
a3fed6ced8
commit
9643d74864
@ -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) {
|
||||||
|
|||||||
19
app/src/main/java/com/auto/autoclicker/ClickEvent.java
Normal file
19
app/src/main/java/com/auto/autoclicker/ClickEvent.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user