优化多点点击

This commit is contained in:
lihongwei 2025-04-28 15:04:42 +08:00
parent 3e546ef48a
commit a3fed6ced8
4 changed files with 261 additions and 257 deletions

View File

@ -22,27 +22,66 @@ public class AutoClickService extends AccessibilityService {
private static final String TAG = "AutoClickService";
private static AutoClickService instance;
private final List<Point> moreClickPositions = new ArrayList<>();
private int currentClickIndex = 0;
private static final long MIN_CLICK_INTERVAL = 40;
private static final long MAX_CLICK_INTERVAL = 10000;
private static final int MIN_CLICK_DURATION = 50;
private static final int MAX_CLICK_DURATION = 1000;
private static final int MIN_SLIDE_DURATION = 100;
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 Handler handler = new Handler(Looper.getMainLooper());
private boolean isClicking = false;
private boolean isRunning = false;
private int clickX = 500;
private int clickY = 500;
private long clickInterval = 1000;
private int clickDuration = 200;
private int slideDuration = 500;
private int screenWidth;
private int screenHeight;
private final List<Slide> slideEvents = new ArrayList<>();
private int currentEventIndex = 0;
private int slideDuration = 500; // 新增滑动时长
@Override
public void onCreate() {
@ -72,22 +111,48 @@ public class AutoClickService extends AccessibilityService {
public void setClickPosition(float x, float y) {
Point constrained = ViewUtils.constrainToScreen(x, y, screenWidth, screenHeight);
this.moreClickPositions.clear();
this.clickX = constrained.x;
this.clickY = constrained.y;
logDebug("设置单点点击位置: 原始 (" + x + ", " + y + ") -> 修正 (" + clickX + ", " + clickY + ")");
clearEvents();
eventQueue.add(new ClickEvent(constrained.x, constrained.y, -1));
logDebug("设置单点点击位置: 原始 (" + x + ", " + y + ") -> 修正 (" + constrained.x + ", " + constrained.y + ")");
}
public void setMoreClickPositions(List<Point> positions) {
this.moreClickPositions.clear();
this.moreClickPositions.addAll(positions);
logDebug("设置多点点击位置: " + positions.size() + " 个点");
public void clearEvents() {
eventQueue.clear();
logDebug("清除所有事件");
}
public void setSlideEvents(List<Slide> slides) {
this.slideEvents.clear();
this.slideEvents.addAll(slides);
logDebug("设置滑动事件: " + slides.size() + "");
public void addClickEvent(int x, int y, int index) {
Point constrained = ViewUtils.constrainToScreen(x, y, screenWidth, screenHeight);
eventQueue.add(new ClickEvent(constrained.x, constrained.y, index));
logDebug("添加点击事件 #" + index + ": (" + constrained.x + ", " + constrained.y + ")");
}
public void addMultipleClickEvents(List<Point> positions) {
clearEvents();
for (int i = 0; i < positions.size(); i++) {
Point p = positions.get(i);
addClickEvent(p.x, p.y, i);
}
logDebug("设置多点点击事件: " + positions.size() + " 个点");
}
public void addSlideEvent(int startX, int startY, int endX, int endY) {
Point constrainedStart = ViewUtils.constrainToScreen(startX, startY, screenWidth, screenHeight);
Point constrainedEnd = ViewUtils.constrainToScreen(endX, endY, screenWidth, screenHeight);
eventQueue.add(new SlideEvent(
constrainedStart.x, constrainedStart.y,
constrainedEnd.x, constrainedEnd.y));
logDebug("添加滑动事件: 从 (" + constrainedStart.x + ", " + constrainedStart.y +
") 到 (" + constrainedEnd.x + ", " + constrainedEnd.y + ")");
}
public void addMultipleSlideEvents(List<Slide> slides) {
for (Slide slide : slides) {
addSlideEvent((int) slide.startX, (int) slide.startY, (int) slide.endX, (int) slide.endY);
}
logDebug("添加多个滑动事件: " + slides.size() + "");
}
public void setClickInterval(long interval) {
@ -108,33 +173,55 @@ public class AutoClickService extends AccessibilityService {
logDebug("设置点击时长: " + duration + "ms");
}
public void setSlideDuration(int duration) {
if (duration < MIN_SLIDE_DURATION || duration > MAX_SLIDE_DURATION) {
Log.w(TAG, "滑动时长超出范围: " + duration + "ms");
return;
}
this.slideDuration = duration;
logDebug("设置滑动时长: " + duration + "ms");
}
public void startClicking() {
if (!isClicking) {
if (moreClickPositions.isEmpty() && slideEvents.isEmpty() && (clickX == 0 && clickY == 0)) {
Log.w(TAG, "无有效点击或滑动事件,忽略开始");
if (!isRunning) {
if (eventQueue.isEmpty()) {
Log.w(TAG, "事件队列,忽略开始");
return;
}
isClicking = true;
isRunning = true;
currentEventIndex = 0;
logDebug("开始自动点击/滑动");
performEvent();
logDebug("开始执行事件队列 - 共 " + eventQueue.size() + " 个事件");
executeNextEvent();
}
}
public void stopClicking() {
if (isClicking) {
isClicking = false;
if (isRunning) {
isRunning = false;
handler.removeCallbacksAndMessages(null);
logDebug("停止自动点击/滑动");
logDebug("停止执行事件");
}
}
public boolean isClicking() {
return isClicking;
return isRunning;
}
private void performClick(Point clickPoint, int index) {
private void executeNextEvent() {
if (!isRunning || eventQueue.isEmpty()) {
logDebug("跳过执行:服务未运行或事件队列为空");
return;
}
Event event = eventQueue.get(currentEventIndex);
event.perform();
// 准备下一个事件
currentEventIndex = (currentEventIndex + 1) % eventQueue.size();
}
private void performSingleClick(Point clickPoint, int index) {
logDebug("执行点击: (" + clickPoint.x + ", " + clickPoint.y + ")");
flashTouchFeedback(index);
@ -149,63 +236,24 @@ public class AutoClickService extends AccessibilityService {
@Override
public void onCompleted(GestureDescription gestureDescription) {
logDebug("点击完成");
if (isClicking) {
handler.postDelayed(() -> performEvent(), clickInterval);
if (isRunning) {
handler.postDelayed(() -> executeNextEvent(), clickInterval);
}
}
@Override
public void onCancelled(GestureDescription gestureDescription) {
Log.e(TAG, "点击被取消");
if (isClicking) {
handler.postDelayed(() -> performEvent(), clickInterval + 300);
if (isRunning) {
handler.postDelayed(() -> executeNextEvent(), clickInterval + 300);
}
}
}, null);
}
private void performEvent() {
if (!isClicking) {
logDebug("跳过事件:服务未处于运行中");
return;
}
if (moreClickPositions.isEmpty() && slideEvents.isEmpty()) {
if (clickX != 0 || clickY != 0) {
// 单点模式
performClick(new Point(clickX, clickY), -1);
return;
}
stopClicking();
return;
}
// 多点模式按事件队列顺序执行
int pointIndex = 0;
int slideIndex = 0;
for (int i = 0; i <= currentEventIndex; i++) {
if (pointIndex < moreClickPositions.size() && i == pointIndex) {
pointIndex++;
} else if (slideIndex < slideEvents.size()) {
slideIndex++;
}
}
if (pointIndex > currentEventIndex) {
// 执行点击
Point clickPoint = moreClickPositions.get(pointIndex - 1);
performClick(clickPoint, pointIndex - 1);
} else if (slideIndex > currentEventIndex) {
// 执行滑动
Slide slide = slideEvents.get(slideIndex - 1);
performSlide(slide);
}
currentEventIndex = (currentEventIndex + 1) % (moreClickPositions.size() + slideEvents.size());
}
private void performSlide(Slide slide) {
logDebug("执行滑动: 从 (" + slide.startX + ", " + slide.startY + ") 到 (" + slide.endX + ", " + slide.endY + ")");
private void performSingleSlide(SlideEvent slide) {
logDebug("执行滑动: 从 (" + slide.startX + ", " + slide.startY +
") 到 (" + slide.endX + ", " + slide.endY + ")");
Path path = new Path();
path.moveTo(slide.startX, slide.startY);
@ -219,16 +267,16 @@ public class AutoClickService extends AccessibilityService {
@Override
public void onCompleted(GestureDescription gestureDescription) {
logDebug("滑动完成");
if (isClicking) {
handler.postDelayed(() -> performEvent(), clickInterval);
if (isRunning) {
handler.postDelayed(() -> executeNextEvent(), clickInterval);
}
}
@Override
public void onCancelled(GestureDescription gestureDescription) {
Log.e(TAG, "滑动被取消");
if (isClicking) {
handler.postDelayed(() -> performEvent(), clickInterval + 300);
if (isRunning) {
handler.postDelayed(() -> executeNextEvent(), clickInterval + 300);
}
}
}, null);
@ -236,12 +284,13 @@ public class AutoClickService extends AccessibilityService {
private void flashTouchFeedback(int index) {
Intent intent = new Intent("com.auto.autoclicker.FLASH_TOUCH_POINT");
intent.putExtra("index", index); // 带上当前点击点的index
intent.putExtra("index", index);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// 不需要处理辅助功能事件
}
private void logDebug(String message) {

View File

@ -20,8 +20,10 @@ import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
@ -43,10 +45,12 @@ public class FloatingViewManager {
private final WindowManager windowManager;
private final List<View> moreTouchPointViews = new ArrayList<>();
private int touchPointNumber = 1; // 默认数字
private final List<TextView> moreTouchPointViews = new ArrayList<>();
private final List<WindowManager.LayoutParams> moreTouchPointParams = new ArrayList<>();
private View singleTouchPointView;
private TextView singleTouchPointView;
private WindowManager.LayoutParams singleTouchPointParams;
private LinearLayout singleControlBarView;
@ -122,9 +126,16 @@ public class FloatingViewManager {
logDebug("悬浮窗已添加,模式 = " + mode);
}
@SuppressLint("ClickableViewAccessibility")
private void initSingleTouchPointView() {
singleTouchPointView = new View(context);
singleTouchPointView = new TextView(context);
singleTouchPointView.setBackgroundResource(R.drawable.un_touch_point);
singleTouchPointView.setGravity(Gravity.CENTER); // 文字居中
singleTouchPointView.setText("1"); // 设置初始数字
singleTouchPointView.setTextColor(Color.BLACK); // 数字颜色
singleTouchPointView.setTextSize(16); // 数字大小可调整
singleTouchPointParams = new WindowManager.LayoutParams(
100, 100,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
@ -134,6 +145,7 @@ public class FloatingViewManager {
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT
);
singleTouchPointParams.gravity = Gravity.TOP | Gravity.START;
singleTouchPointParams.x = (int) touchPointX;
singleTouchPointParams.y = (int) touchPointY;
@ -144,6 +156,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -172,6 +193,7 @@ public class FloatingViewManager {
moreTouchPointParams.clear();
eventQueue.clear(); // 清空事件队列
eventIdCounter = 1; // 重置编号
touchPointNumber = 1;
}
@SuppressLint("ClickableViewAccessibility")
@ -197,6 +219,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -249,6 +280,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isMoreClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -340,37 +380,6 @@ public class FloatingViewManager {
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
// private void toggleMoreClicking() {
// if (isDebounced()) return;
//
// AutoClickService service = AutoClickService.getInstance();
// if (service == null) {
// Log.e(TAG, "AutoClickService 未初始化");
// Toast.makeText(context, "请在设置中启用无障碍服务", Toast.LENGTH_LONG).show();
// Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(intent);
// return;
// }
//
// if (moreTouchPointViews.isEmpty()) {
// Toast.makeText(context, "请先添加触摸点", Toast.LENGTH_SHORT).show();
// return;
// }
//
// if (isMoreClicking) {
// service.stopClicking();
// Toast.makeText(context, "停止多点点击", Toast.LENGTH_SHORT).show();
// } else {
// service.setMoreClickPositions(getMoreTouchPositions());
// service.startClicking();
// Toast.makeText(context, "开始多点点击", Toast.LENGTH_SHORT).show();
// }
//
// isMoreClicking = !isMoreClicking;
// logDebug("多点服务是否点击中: " + service.isClicking());
// }
private void toggleMoreClicking() {
if (isDebounced()) return;
@ -396,92 +405,35 @@ public class FloatingViewManager {
point.setBackgroundResource(R.drawable.un_touch_point);
}
} else {
service.setMoreClickPositions(getMoreTouchPositions());
service.setSlideEvents(getSlideEvents());
service.addMultipleClickEvents(getMoreTouchPositions());
service.addMultipleSlideEvents(getSlideEvents());
service.startClicking();
Toast.makeText(context, "开始多点点击", Toast.LENGTH_SHORT).show();
for (View point : moreTouchPointViews) {
point.setBackgroundResource(R.drawable.touch_point);
}
}
isMoreClicking = !isMoreClicking;
logDebug("多点服务是否点击中: " + service.isClicking());
}
private void addMoreTouchPoint() {
View point = new View(context);
point.setBackgroundResource(R.drawable.un_touch_point);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
100, 100,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.START;
params.x = screenWidth / 2 - 50;
params.y = screenHeight / 2 - 50;
point.setOnTouchListener(new View.OnTouchListener() {
private float lastX, lastY;
private float paramX, paramY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int index = moreTouchPointViews.indexOf(v); // 获取当前触摸点索引
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
lastY = event.getRawY();
paramX = params.x;
paramY = params.y;
return true;
case MotionEvent.ACTION_MOVE:
float dx = event.getRawX() - lastX;
float dy = event.getRawY() - lastY;
Point constrainedPoint = ViewUtils.constrainToScreen(
paramX + dx, paramY + dy,
screenWidth - point.getWidth(), screenHeight - point.getHeight());
params.x = constrainedPoint.x;
params.y = constrainedPoint.y;
windowManager.updateViewLayout(point, params);
// 更新 moreTouchPointParams
if (index >= 0 && index < moreTouchPointParams.size()) {
moreTouchPointParams.set(index, params);
}
// 收集所有触摸点位置
List<Point> points = new ArrayList<>();
for (WindowManager.LayoutParams p : moreTouchPointParams) {
points.add(new Point(p.x, p.y));
}
// 更新 AutoClickService moreClickPositions
AutoClickService service = AutoClickService.getInstance();
if (service != null) {
service.setMoreClickPositions(points);
}
return true;
case MotionEvent.ACTION_UP:
v.performClick();
return true;
}
return false;
}
});
windowManager.addView(point, params);
moreTouchPointViews.add(point);
moreTouchPointParams.add(params);
}
@SuppressLint("ClickableViewAccessibility")
private void addPointEvent() {
View point = new View(context);
if (isMoreClicking) {
Toast.makeText(context, "请先停止点击", Toast.LENGTH_SHORT).show();
return;
}
TextView point = new TextView(context);
point.setBackgroundResource(R.drawable.un_touch_point);
point.setGravity(Gravity.CENTER); // 文字居中
point.setText(String.valueOf(touchPointNumber)); // 设置初始数字
point.setTextColor(Color.BLACK); // 数字颜色
point.setTextSize(16); // 数字大小可调整
touchPointNumber++;
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
100, 100,
@ -507,6 +459,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isMoreClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -539,10 +500,22 @@ public class FloatingViewManager {
updateServicePositions();
}
@SuppressLint("ClickableViewAccessibility")
private void addSlideEvent() {
if (isMoreClicking) {
Toast.makeText(context, "请先停止点击", Toast.LENGTH_SHORT).show();
return;
}
// 起点
View startPoint = new View(context);
TextView startPoint = new TextView(context);
startPoint.setBackgroundResource(R.drawable.un_touch_point);
startPoint.setGravity(Gravity.CENTER); // 文字居中
startPoint.setText(String.valueOf(touchPointNumber)); // 设置初始数字
startPoint.setTextColor(Color.BLACK); // 数字颜色
startPoint.setTextSize(16); // 数字大小可调整
WindowManager.LayoutParams startParams = new WindowManager.LayoutParams(
100, 100,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
@ -558,8 +531,16 @@ public class FloatingViewManager {
PointEvent startPointEvent = new PointEvent(eventIdCounter++, startParams.x, startParams.y, startPoint, startParams);
// 终点
View endPoint = new View(context);
TextView endPoint = new TextView(context);
endPoint.setBackgroundResource(R.drawable.un_touch_point);
endPoint.setGravity(Gravity.CENTER); // 文字居中
endPoint.setText(String.valueOf(touchPointNumber)); // 设置初始数字
endPoint.setTextColor(Color.BLACK); // 数字颜色
endPoint.setTextSize(16); // 数字大小可调整
touchPointNumber++;
WindowManager.LayoutParams endParams = new WindowManager.LayoutParams(
100, 100,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
@ -605,6 +586,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isMoreClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -643,6 +633,15 @@ public class FloatingViewManager {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isMoreClicking) {
// 拖动禁用时仅处理点击
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
@ -701,51 +700,20 @@ public class FloatingViewManager {
lineView.setPoints(startCenterX, startCenterY, endCenterX, endCenterY);
}
private void updateLineView(SlideEvent slideEvent) {
WindowManager.LayoutParams lineParams = slideEvent.lineParams;
PointEvent start = slideEvent.startPoint;
PointEvent end = slideEvent.endPoint;
View lineView = slideEvent.lineView;
// 计算两点中心位置
float startCenterX = start.x + 50; // 假设点的宽度为100中心点坐标为x+50
float startCenterY = start.y + 50; // 假设点的高度为100中心点坐标为y+50
float endCenterX = end.x + 50;
float endCenterY = end.y + 50;
// 计算两点之间的距离和角度
float deltaX = endCenterX - startCenterX;
float deltaY = endCenterY - startCenterY;
float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY);
float angle = (float) Math.toDegrees(Math.atan2(deltaY, deltaX));
// 设置连接线的宽度为两点之间的距离
lineParams.width = (int) distance;
lineParams.height = 5; // 固定高度
// 设置连接线的起始位置为起始点的中心
lineParams.x = (int) startCenterX;
lineParams.y = (int) startCenterY - lineParams.height / 2; // 垂直居中
// 由于线条是从左到右绘制的我们需要设置旋转中心点
lineView.setPivotX(0); // 设置旋转中心为线条的起点
lineView.setPivotY(lineParams.height / 2); // 设置旋转中心为线条高度的一半
// 设置连接线的旋转角度
lineView.setRotation(angle);
// 更新连接线的布局
windowManager.updateViewLayout(lineView, lineParams);
}
// 新增移除最后一个事件
private void removeLastEvent() {
if (isMoreClicking) {
Toast.makeText(context, "请先停止点击", Toast.LENGTH_SHORT).show();
return;
}
if (eventQueue.isEmpty()) {
Toast.makeText(context, "没有更多事件可以删除", Toast.LENGTH_SHORT).show();
return;
}
Event lastEvent = eventQueue.remove(eventQueue.size() - 1);
if (lastEvent instanceof PointEvent) {
PointEvent pointEvent = (PointEvent) lastEvent;
try {
@ -769,6 +737,9 @@ public class FloatingViewManager {
moreTouchPointParams.remove(slideEvent.startPoint.params);
moreTouchPointParams.remove(slideEvent.endPoint.params);
}
touchPointNumber--;
updateServicePositions();
}
@ -787,23 +758,8 @@ public class FloatingViewManager {
}
AutoClickService service = AutoClickService.getInstance();
if (service != null) {
service.setMoreClickPositions(points);
service.setSlideEvents(slides);
}
}
private void removeMoreTouchPoint() {
if (!moreTouchPointViews.isEmpty()) {
View lastPoint = moreTouchPointViews.get(moreTouchPointViews.size() - 1);
try {
windowManager.removeView(lastPoint);
} catch (Exception e) {
Log.w(TAG, "移除 touchPoint 失败", e);
}
moreTouchPointViews.remove(moreTouchPointViews.size() - 1);
moreTouchPointParams.remove(moreTouchPointParams.size() - 1);
} else {
Toast.makeText(context, "没有更多触摸点可以删除", Toast.LENGTH_SHORT).show();
service.addMultipleClickEvents(points);
service.addMultipleSlideEvents(slides);
}
}

View File

@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M502.7,448a56,56 0,1 0,0 112,56 56,0 0,0 0,-112zM502.7,96C277.3,96 94.6,278.7 94.6,504S277.3,912 502.6,912C728,912 910.7,729.3 910.7,504S728,96 502.7,96zM544,829.3L544,688h-80v141.3C320,811.1 195.5,688 177.3,544L320,544v-80h-142.7C195.5,320 320,196.8 464,178.7L464,320h80v-141.3C688,196.8 809.8,320 828,464L688,464v80h140C809.8,688 688,811.2 544,829.3z"
android:fillColor="#565D64"/>
android:width="47dp"
android:height="47dp"
android:viewportWidth="47"
android:viewportHeight="47">
<path
android:pathData="M23.5,0C10.522,0 0,10.522 0,23.5C0,36.478 10.522,47 23.5,47C36.478,47 47,36.478 47,23.5C47,10.522 36.478,0 23.5,0ZM23.743,44.908C23.743,44.908 23.788,44.786 23.788,44.726V40.177C23.788,39.601 23.318,39.146 22.757,39.146C22.196,39.146 21.726,39.617 21.726,40.177V44.726C21.726,44.726 21.741,44.802 21.741,44.832C11.098,43.953 2.653,35.265 2.138,24.531H6.08C6.656,24.531 7.111,24.061 7.111,23.5C7.111,22.939 6.641,22.469 6.08,22.469H2.123C2.638,11.72 11.083,3.047 21.726,2.168C21.726,2.214 21.711,2.244 21.711,2.274V6.823C21.711,7.399 22.181,7.854 22.742,7.854C23.303,7.854 23.773,7.384 23.773,6.823V2.274C23.773,2.274 23.743,2.153 23.727,2.092C35.083,2.214 44.317,11.219 44.862,22.469H40.92C40.344,22.469 39.889,22.939 39.889,23.5C39.889,24.061 40.359,24.531 40.92,24.531H44.862C44.317,35.781 35.083,44.786 23.727,44.908H23.743Z"
android:fillColor="#0BC4FC"/>
</vector>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_background"