You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编程实现如图所示的触摸屏测试APP?求开发指南及GitHub链接

触摸屏测试应用开发指南与参考项目

核心功能实现逻辑

  • 触摸事件捕获:针对目标平台调用对应的触摸API,获取每个触摸点的唯一ID、坐标、压力值等参数(比如Android用MotionEvent,iOS用UITouch,桌面端Qt用QTouchEvent)。
  • 触摸点可视化:在画布上实时绘制触摸点,用不同颜色区分不同触摸ID,同时显示坐标信息。
  • 多点触摸管理:维护触摸点集合,处理触摸点的按下、移动、抬起/取消事件,保证每个触摸点的状态实时更新。
  • 辅助控制:添加清除触摸点、退出测试等功能按钮,提升测试体验。

参考开源项目

  • TouchTest:Android平台轻量触摸测试工具,支持多点触摸显示,能展示触摸坐标、压力值,代码结构简单,适合入门学习。
  • MultiTouch-Tester:基于Qt的跨平台项目,支持Windows、Linux、Android系统,实现了触摸点可视化与基础触摸事件处理。
  • AndroidTouchScreenTest:专注Android设备的触摸屏测试应用,包含单点/多点触摸测试模块,可记录触摸轨迹并展示详细参数。

快速实现示例(Android平台)

  1. 自定义触摸显示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);
        }
    }
}
  1. 集成到布局并添加辅助按钮
    在Activity布局中添加该自定义View,再添加清除按钮,点击时清空触摸点集合:
// 清空触摸点按钮点击事件
clearBtn.setOnClickListener(v -> {
    mTouchTestView.mTouchPoints.clear();
    mTouchTestView.invalidate();
});

内容的提问来源于stack exchange,提问作者zeeshan kamboh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:50:26