2

正常に動作するアプリ用のカスタム ImageView (Android) を作成しました。いくつかの目的で、ビュー座標 (クリックの座標など) を画像座標 (画像内でクリックが発生した場所) にマップする必要があります。これは、画像をズームおよびスクロールできるためです。これまでのところ、以下の方法はうまくいくように見えました:

private PointF viewPointToImgPointF(PointF viewPoint) {
    final float[] coords = new float[] { viewPoint.x, viewPoint.y };
    Matrix matrix = new Matrix();
    getImageMatrix().invert(matrix);
    matrix.mapPoints(coords); // --> PointF in image as scaled originally
    if (coords != null && coords.length > 1) {
        return new PointF(coords[0] * inSampleSize,coords[1] * inSampleSize);
    } else {
        return null;
    }
}

private PointF imgPointToViewPointF(PointF imgPoint) {
    final float[] coords = new float[] { imgPoint.x / inSampleSize, imgPoint.y / inSampleSize };
    getImageMatrix().mapPoints(coords);
    if (coords != null && coords.length > 1) {
        return new PointF(coords[0], coords[1]);
    } else {
        return null;
    }
}

ほとんどの場合、これらの方法を問題なく使用できますが、次のことを試してみたところ、100% 正確ではないことに気付きました。

            PointF a = new PointF(100,100);
        PointF b = imgPointToViewPointF(a);
        PointF a2 = viewPointToImgPointF(b);
        PointF b2 = imgPointToViewPointF(a2);
        PointF a3 = viewPointToImgPointF(b2);

これらの値を取得しました:

a: Point(100, 100)
b: Point(56, 569)
a2: Point(99, 99)
b2: Point(55, 568)
a3: Point(97, 97)

すべてが正しく機能していれば、すべての a- 値とすべての b- 値は同じままであるはずです。

また、この小さな差が画像の中心に向かって減少していることもわかりました。(100, 100) が画像の中心である場合、メソッドは正しい結果を提供します!

誰かが似たようなことを経験したことがありますか?おそらく解決策がありますか? それとも私は何か間違ったことをしていますか?

(私がテストした画像の inSampleSize は == 1 です。これは、メモリを節約するために画像のサイズが変更された要因を表します)

4

2 に答える 2

1

私はこの正確なシナリオをチェックしていませんが、float を int に繰り返しキャストし、2 回目の繰り返しでその値を float として使用することが問題のようです。キャストの詳細の損失は毎回悪化します。

于 2013-11-14T12:46:00.060 に答える
0

わかりました、それは本当に Android < 4.4 のバグだったようです。

更新されたデバイスで動作するようになりましたが、4.3 以前のデバイスでも引き続き発生します。したがって、古いデバイスでそれを回避するためにできることはあまりないと思います(行列計算全体を自分で行うことを除いて。私は絶対にしません...)

于 2013-12-11T16:06:21.520 に答える