Java 如何绘制方向路径并检测是否跟踪-Android

Java 如何绘制方向路径并检测是否跟踪-Android,java,android,Java,Android,我正在开发一个应用程序,它在画布上绘制字母,并检测用户是否以正确的形式跟踪字母。我尝试了不同的技巧,似乎找不到覆盖所有信件的最佳方法。字母是漫画式的无字体,由于f和s的形式,这是相当困难的。这是小写字母由于在这里发布了这个答案,我多次尝试最终得到了我需要的答案: 这就是我为完成任务所做的: 获取路径的起点 然后我创建了一个单独的路径,当用户触摸接近起始点时,该路径从该点开始(我们称之为轨迹路径) 最后,我继续计算路径的点,该点稍微超前于用户轨迹路径,并查看触摸点和预期点之间的差异是否相当接近 下

我正在开发一个应用程序,它在画布上绘制字母,并检测用户是否以正确的形式跟踪字母。我尝试了不同的技巧,似乎找不到覆盖所有信件的最佳方法。字母是漫画式的无字体,由于f和s的形式,这是相当困难的。这是小写字母

由于在这里发布了这个答案,我多次尝试最终得到了我需要的答案:

这就是我为完成任务所做的:

  • 获取路径的起点

  • 然后我创建了一个单独的路径,当用户触摸接近起始点时,该路径从该点开始(我们称之为轨迹路径)

  • 最后,我继续计算路径的点,该点稍微超前于用户轨迹路径,并查看触摸点和预期点之间的差异是否相当接近

  • 下面是一些代码

        Path Measure pm = new PathMeasure(myPath, false);
        pm.getPosTan(0, floatPoints, null);
    
        //This functions says whether the offset from path was too great to accept
        private boolean isMajorOffset(float point1, float point2, int tolerance){
                    float difference = Math.abs(point1 - point2);
                    return tolerance < Math.floor(difference) && tolerance < Math.ceil(difference);
                }
    
    private void touch_start(float x, float y){
            //get point as float
            float floatPoints[] = {0f, 0f};
            //get current start point
            pm.getPosTan(0, floatPoints, null);
    
            Point startPoint = new Point((int)floatPoints[0], (int)floatPoints[1]);
    
            //if startPoint is selected then set path as started
            if((startPoint.x >= x - TOUCH_TOLERANCE && startPoint.x <= x + TOUCH_TOLERANCE)
                    && (startPoint.y >= y - TOUCH_TOLERANCE && startPoint.y <= y + TOUCH_TOLERANCE))
            {
                PathStarted = true;
                Toast.makeText(this.getContext(), "Started", Toast.LENGTH_SHORT).show();
    
                //move trail path to this point
                trailPath.moveTo(startPoint.x, startPoint.y);
            }
        }
    
    private void touch_move(float x, float y){
            if(PathStarted==false){
                return;
            }
            //get lenght of trail path
            PathMeasure tm = new PathMeasure(trailPath, false);
    
            //get point as float
            float floatPoints[] = {0f, 0f};
            //get current start point
            pm.getPosTan(tm.getLength() + 1, floatPoints, null);
    
            Point point = new Point((int)floatPoints[0], (int)floatPoints[1]);
    
            //if offset is ok continue with trail path
            if(!isMajorOffset(point.x, x, TOUCH_TOLERANCE) && !isMajorOffset(point.y, y, TOUCH_TOLERANCE))
            {
                //move current path to this point
                trailPath.lineTo(point.x, point.y);
            }
            else {
                PathStarted = false;
                Toast.makeText(this.getContext(), "Ended", Toast.LENGTH_SHORT).show();
    
            }
        }
    
    Path-Measure pm=new-pathmasure(myPath,false);
    pm.getPosTan(0,浮点,空);
    //此函数表示与路径的偏移是否太大而无法接受
    专用布尔isMajorOffset(浮点1、浮点2、整数容差){
    浮点差=数学绝对值(点1-点2);
    返回公差<数学下限(差异)&公差<数学上限(差异);
    }
    专用无效触摸启动(浮动x、浮动y){
    //以浮点形式获取点
    浮点数[]={0f,0f};
    //获取当前起点
    pm.getPosTan(0,浮点,空);
    点开始点=新点((int)浮点点[0],(int)浮点点[1]);
    //如果选择了startPoint,则将路径设置为started
    
    如果((startPoint.x>=x-TOUCH\u-TOUCH\u-TOLERANCE&&startPoint.x=y-TOUCH\u-TOUCH\u-TOLERANCE&&startPoint.y,这里描述了如何使用手势。也许你会想使用他们宣传的解决方案:谢谢,但是手势无法工作,因为手势无法根据路径进行测量。这就是我试图实现的目标