ほんとうは、仕組みが解明できてから公開したかったのですが、もったいぶるメリットもないので、しょうもない内容なの承知でわかっている範囲だけ公開。
といっても、わかってるのは・・・
同じマルチタッチイベントを与えているにもかかわらず、SBrowserは中心軸がずれずに拡大縮小がされる!
以上。・・・分かり次第ちょびちょび付け足しで書いていきます…。
どんなタッチイベントを送ったか
マルチタッチと、その中心軸の遷移
点の座標をログに出してMatplotlibで可視化すると、こんなかんじで中心軸がぶれています。
そもそもAndroidってどうやってマルチタッチを解釈しているのか(書いてる途中・・・)
ScaleGestureDetectorというコンポーネントがAndroidのフレームワークに有ります。マルチタッチズームの基本をちらっと図解します。
ScaleGestureDetectorのキモは3つです。
・[ScaleStart] 親指と人差指の間の距離をSpanといい、その距離が初期距離から16dp以上ずれるとズームを開始
・[ScaleBy] ズームの中心は、親指と人差指の中点(リアルタイムに更新)。倍率は、16ms前のSpanと現在のSpanの比率(リアルタイムに更新)
・[ScaleEnd] 指が2点じゃなくなるとズーム終了
中心の座標は、開始時のもの固定ではなくてリアルタイムにタッチの点の中心座標に更新するのがAndroid標準です。なので、冒頭で書いたとおりChromeはバカ正直にタッチの中心座標を更新するため、マルチタッチの中心軸がブレブレになって見えたりするのです。
SBrowserはこのようなタッチ中心の座標ブレブレ問題を解決しているようです。
SBrowserの工夫とは・・・(まだわからず)
オープンソースでその実装箇所を探ってる最中です。分かり次第続報をお届けします。と、長く時間が空きましたが、結局実装箇所はわかりませんでした。
Zoomのジェスチャを判別する部分は、他の機種との差分は(ゼロではないですが)多分ない。 で、気になってSBrowser.apkを引っこ抜いて、
org/chromium/content/browser/ZoomManager.smaliとかを見る限りだとAndroid標準のScaleGestureDetector使ってるし、 多分、MultiTabPinchUtilのperformPinchZoomあたりでなにかゴニョっとやってるんだろうなぁと思いつつ…
若干悔しいながら、今回はこれまで。。
Android標準のScaleGestureDetectorの動作とカスタマイズポイントが見えたくらいでよしとしておきましょう。完全に自己満足ですが。