5

パスの x、y 座標点の追跡を必要とする Android アプリケーション (バージョン 2.1/2.2 をターゲット) を開発しようとしていますが、苦労しています。アプリの基本は FingerPaint と似ていますが、最初に別のスレッドが Path ドローアブルを使用してキャンバスにいくつかの線を描画し、次にユーザーがそれらの線を別の Paint および Path オブジェクトで完全に覆って描画しようとする点が異なります。ユーザーは、コンピューターよりも大きなペイント ブラシを使用します。最初の自動描画された線は、LunarLander サンプル アプリと同様の別のスレッドを使用します。線は単なる直線ではないため、次のことを行うためのアプローチを見つけるのに苦労しています。 1. 自動ポイント描画を追跡します。私は基本的なポイントを提供していることに気付きましたが、すべてのポイントを実際に把握するために path.lineToandpath.arcToとを使用しています。path.quadTo

  1. 自動パスが描画したすべてのポイントがわかったら、ユーザーがそれらすべてのポイントを描画してそのラウンドに「勝つ」ことを監視および検出します。

明らかに存在しない私の理想的な方法は次のようなもの autoPath.getDrawnPoints().coveredBy(userPath.getDrawnPoints()) == trueでしょうか?これについて何か助けていただければ幸いです。ありがとうございます。-ベン

4

1 に答える 1

2

私が言えるのは、PathはPath2dFloatに依存するJavaの GeneralPathに依存しているということだけです。

ソースコードを見ると、packageReadableが含まれているtransient float floatCoords[]; ので、渡された座標を取得する唯一の方法は、解決策というよりもハックです。とにかく、ここにあります:

public float[] getPointsFromPath(GeneralPath path){
    Class<?> clazz = path.getClass();
    while(true){
        clazz = clazz .getSuperclass();
        if (clazz ==  Path2D.Float.class){
            break;
        }
    }
    try {
        Field f = clazz.getDeclaredField("floatCoords");
        if (f != null){
            if (!f.isAccessible()){
                f.setAccessible(true);
            }
            Object o = f.get(path);
            if (o != null && o instanceof float[]){
                float[] drawnPoints = (float[])o;
                Log.d("TAG", drawnPoints);
                return drawnPoints;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } 
}
于 2011-10-07T00:43:25.983 に答える