タイプフィールドを含むMyLayout
拡張クラスがあります。オブジェクトは xml レイアウト ファイルで作成されるため、すべてのプロパティがそこに設定されます。親のサイズに依存するフィールドのサイズをプログラムで設定する必要があります( )。RelativeLayout
View
MyLayout
View
MyLayout
コンストラクタで設定しようとしたのですが、getWidth()
メソッドを使おうとすると0が返ってくるので、コンストラクタ内でまだサイズが設定されていないのだと思います。私もonDraw()
メソッドで設定しようとしていましたが、アプリケーションを実行すると、この内部View
はデフォルトのサイズで数秒間表示され、その後は適切なサイズにスケーリングされます。それからメソッド内に入れてみましonMeasure()
たが、これは数回呼び出されるので、やはり効率が悪いようです。
では、それを設定するのに最適な場所はどこでしょうか?
これは私のクラスです:
public class MyLayout extends RelativeLayout {
private View pointer;
public MyLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyLayout(Context context) {
super(context);
init(context);
}
private void init(Context c) {
pointer = new View(c);
pointer.setBackgroundResource(R.drawable.pointer);
addView(pointer);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
lp.height = (int)(getHeight() * 0.198);
lp.width = (int)(getWidth() * 0.198);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}