iPhoneのアプリをAndroidに移植する作業をしています。
iPhoneのUIは基本的に位置をドット単位(厳密には違うが)で指定するため、AbsoluteLayout亡き今、Androidではなかなか任意の位置にViewを配置するのは難しい。
とりあえずよくある手法は、LayoutParamsでサイズと位置を設定するもの。こんな感じ。
public void setViewFrame(View view, Rect rect) { Rect newRect = convertVirtualRectToRealRect(rect); //iOSでの座標指定からAndroidの現解像度にあうよう座標変換する FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(newRect.width(), newRect.height()); params.setMargins(newRect.left, newRect.top, 0, 0); view.setLayoutParams(params); }
しかし、何故かこれではうまくいかない。
色々試行錯誤した結果、以下のように、
public void setViewFrame(View view, Rect rect) { Rect newRect = convertVirtualRectToRealRect(rect); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(newRect.width(), newRect.height()); params.gravity = Gravity.NO_GRAVITY; // <--必須! params.setMargins(newRect.left, newRect.top, 0, 0); view.setLayoutParams(params); }
LayoutParamsのインスタンスのgravityプロパティにGravity.NO_GRAVITYを設定する事で解決。
なお、これは2.xくらいでの話で、4.0ではこの処置をしなくても問題無かった。でもやっておいたほうが良かろう。