3

タイプフィールドを含むMyLayout拡張クラスがあります。オブジェクトは xml レイアウト ファイルで作成されるため、すべてのプロパティがそこに設定されます。親のサイズに依存するフィールドのサイズをプログラムで設定する必要があります( )。RelativeLayoutViewMyLayoutViewMyLayout

コンストラクタで設定しようとしたのですが、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);
    }
}
4

1 に答える 1

1

MyLayout クラスで、onSizeChanged() をオーバーライドします。

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
     lp.height = (int)(getHeight() * 0.198);
     lp.width = (int)(getWidth() * 0.198);

};
于 2013-01-28T12:47:54.820 に答える