3

子ビューが ViewGroup に存在します。ピンチで子供を拡大縮小(ズーム)したいです。子をスケーリングするために setScaleX/Y() を使用しています。スケールは、OnTouch() で 2 つのポインター間の距離から計算されます。しかし、子のスケールを設定すると、motionEvent.getX() に一貫性がなくなり、スケールが一貫しなくなります。

case MotionEvent.ACTION_MOVE:
    p1.set(ev.getX(firstPointerIndex), v.getY(firstPointerIndex));
    Log.d(TAG,"Touch xy: " + ev.getX(firstPointerIndex) + "," +  ev.getY(firstPointerIndex));
    this.setScaleX(scale);
    this.setScaleY(scale);
    break;

出力

これは、1 つのポインターの出力です。

12-09 11:55:14.828: D/IconItem(14408): Touch xy:54.622437, 135.79865
12-09 11:55:14.843: D/IconItem(14408): Touch xy:35.761047, 192.07361
12-09 11:55:14.863: D/IconItem(14408): Touch xy:54.669342, 135.65869
12-09 11:55:14.878: D/IconItem(14408): Touch xy:35.85121, 191.8046
12-09 11:55:14.898: D/IconItem(14408): Touch xy:54.715958, 135.51959
12-09 11:55:14.898: D/IconItem(14408): Touch xy:35.94078, 191.53735
12-09 11:55:14.913: D/IconItem(14408): Touch xy:54.776947, 135.33765

質問

問題は、x 座標で 35 ~ 54、または y 座標で 135 ~ 191 のジャンプです。これらのジャンプがどこから来ているのか理解できません。setScaleX/Y() を使用しない場合、ev.getX/T() は一貫しており、ジャンプはありません。誰か私を照らしてくれませんか?これらのスケール方法を使用すべきではありませんか? それらは ev.getX/Y() に影響しますか? ビューのズーム(ピンチ付き)を別の方法で実装するにはどうすればよいですか?

4

1 に答える 1

2

はい、各モーション イベントは、ビューのマトリックス (スケールを含む) を考慮して、ビューの座標で指定されます。Making Sense of Multitouch のcanvas.scale()ように、ビューをスケーリングする代わりにスケーリングを試みるか、スケーリング操作を受けていない別のビューで MotionEvents をキャッチすることができます。

于 2013-01-07T03:05:20.613 に答える