如何编程实现如图所示的触摸屏测试APP?求开发指南及GitHub链接
触摸屏测试应用开发指南与参考项目
核心功能实现逻辑
- 触摸事件捕获:针对目标平台调用对应的触摸API,获取每个触摸点的唯一ID、坐标、压力值等参数(比如Android用
MotionEvent,iOS用UITouch,桌面端Qt用QTouchEvent)。 - 触摸点可视化:在画布上实时绘制触摸点,用不同颜色区分不同触摸ID,同时显示坐标信息。
- 多点触摸管理:维护触摸点集合,处理触摸点的按下、移动、抬起/取消事件,保证每个触摸点的状态实时更新。
- 辅助控制:添加清除触摸点、退出测试等功能按钮,提升测试体验。
参考开源项目
- TouchTest:Android平台轻量触摸测试工具,支持多点触摸显示,能展示触摸坐标、压力值,代码结构简单,适合入门学习。
- MultiTouch-Tester:基于Qt的跨平台项目,支持Windows、Linux、Android系统,实现了触摸点可视化与基础触摸事件处理。
- AndroidTouchScreenTest:专注Android设备的触摸屏测试应用,包含单点/多点触摸测试模块,可记录触摸轨迹并展示详细参数。
快速实现示例(Android平台)
- 自定义触摸显示View
继承View类,重写触摸事件处理与绘制方法:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.view.MotionEvent; import android.view.View; import java.util.HashMap; import java.util.Map; public class TouchTestView extends View { private final HashMap<Integer, PointF> mTouchPoints = new HashMap<>(); private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); public TouchTestView(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getActionMasked(); int pointerId = event.getPointerId(event.getActionIndex()); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: mTouchPoints.put(pointerId, new PointF(event.getX(event.getActionIndex()), event.getY(event.getActionIndex()))); break; case MotionEvent.ACTION_MOVE: for (int i = 0; i < event.getPointerCount(); i++) { int id = event.getPointerId(i); mTouchPoints.put(id, new PointF(event.getX(i), event.getY(i))); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_CANCEL: mTouchPoints.remove(pointerId); break; } invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (Map.Entry<Integer, PointF> entry : mTouchPoints.entrySet()) { int id = entry.getKey(); PointF point = entry.getValue(); // 设置触摸点颜色(按ID区分色调) mPaint.setColor(Color.HSVToColor(new float[]{id * 60f, 1f, 1f})); // 绘制触摸点圆圈 canvas.drawCircle(point.x, point.y, 50, mPaint); // 绘制触摸ID与坐标 mPaint.setColor(Color.WHITE); mPaint.setTextSize(32); String text = String.format("ID:%d (%d,%d)", id, (int)point.x, (int)point.y); canvas.drawText(text, point.x - 80, point.y, mPaint); } } }
- 集成到布局并添加辅助按钮
在Activity布局中添加该自定义View,再添加清除按钮,点击时清空触摸点集合:
// 清空触摸点按钮点击事件 clearBtn.setOnClickListener(v -> { mTouchTestView.mTouchPoints.clear(); mTouchTestView.invalidate(); });
内容的提问来源于stack exchange,提问作者zeeshan kamboh
相关产品推荐
相关产品推荐

