Androidでサブビューの位置を設定するにはどうすればよいですか?
onLayout() で少し設定することができましたが、特定の値にしか設定できません。その後、サブビューは表示されません。トリミングされていると思いますが、トリミングされる理由と適切に行う方法がわかりません。
画像は次のとおりです。
Candy Crush アイコンを右に 10 ずつ移動することができました。これ以上移動すると、すべてが表示されなくなります... :(
コードは次のとおりです。
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
// Do nothing. Do not call the superclass method--that would start a layout pass
// on this view's children. PieChart lays out its children in onSizeChanged().
// super.onLayout(changed, l, t, r, b);
Log.e(LOG_TAG, LOG_TAG + ".onLayout: " + this + ": "+ l + ", " + t + ", " + r + ", " + b);
// // this is successful
// RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) this.getLayoutParams();//new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT );
// lp.setMargins( lp.leftMargin + 5, lp.topMargin + 5, lp.rightMargin + 5, lp.bottomMargin + 5);
// setLayoutParams( lp );
// this.requestLayout();
int iChildCount = this.getChildCount();
for ( int i = 0; i < iChildCount; i++ ) {
int iLeft = i * getIconSize(); // cannot be more than 10, otherwise nothing will show
View pChild = this.getChildAt(i);
// Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " size: " + l + ", " + t + ", " + r + ", " + b);
Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " size: " + pChild.getMeasuredWidth() + ", " + pChild.getMeasuredHeight() + " :: " + pChild.getWidth() + ", " + pChild.getHeight());
Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " boundary: " + pChild.getLeft() + ", " + pChild.getTop() + ", " + pChild.getRight() + ", " + pChild.getBottom());
pChild.layout(iLeft, 0, iLeft + pChild.getMeasuredWidth(), pChild.getMeasuredHeight());
// pChild.layout(l, t, pChild.getMeasuredWidth(), pChild.getMeasuredHeight());
// LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) pChild.getLayoutParams();
// lp.setMargins(iLeft, 0, 0, 0);
// pChild.setLayoutParams(lp);
// pChild.requestLayout();
}
}
ヘルプ、サンプル、チュートリアル、説明は大歓迎です...それに関するリソースが見つからないため、試行錯誤で何週間も無駄にしています.onMeasureとonLayoutは文書化されておらず、言われたとおりに機能していません、これは非常にイライラします:
public void layout (int l, int t, int r, int b)
Assign a size and position to a view and all of its descendants
This is the second phase of the layout mechanism. (The first is measuring). In this phase, each parent calls layout on all of its children to position them. This is typically done using the child measurements that were stored in the measure pass().
Derived classes should not override this method. Derived classes with children should override onLayout. In that method, they should call layout on each of their children.
Parameters
l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent
編集:
答えを明確にする
@ Ben75 が指摘したように、問題は pChild.layout(iTop, iLeft, iRight, iBottom); の設定が間違っていることが原因です。値。ただし、pChild.layout はビューの onLayout によって呼び出されるものではなく、親の onLayout によって呼び出されるものです。親の onLayout はすべての子を繰り返し処理し、そのレイアウト (iTop,iLeft,iRight,iBottom) を呼び出します。子のレイアウトを (0,0,iWidth,iHeight) に設定しているため、クリッピングが発生します。