Получение ширины / высоты макета в Android - PullRequest
9 голосов
/ 17 января 2012

Мне интересно, как измерить размеры вида.В моем случае это абсолютный макет.Я прочитал ответы на эти вопросы, но все еще не получил его.

Это мой код:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);      

    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);       

    drawOval(); 

}
public void drawOval(){ //, int screenWidth, int screenHeight){ 
    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);     

    int screenWidth = layoutbase.getWidth();
    int screenHeight = layoutbase.getHeight();
    Log.i("MyActivity", "screenWidth: " + screenWidth + ", screenHeight: " +screenHeight);

    Coordinates c = new Coordinates(BUTTONSIZE,screenWidth,screenHeight);

    ...some code ...

    ((ViewGroup) layoutbase ).addView(mybutton, new AbsoluteLayout.LayoutParams(BUTTONSIZE, BUTTONSIZE, c.mX, c.mY));


    mybutton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showText(mybutton);
        }
    });
}

public void showText(View button){      

    int x = findViewById(LAYOUT).getWidth();
    int y = findViewById(LAYOUT).getHeight(); 

    Toast message = Toast.makeText(this, "x: " + x , Toast.LENGTH_SHORT);       
    message.show();     


}

Команда getWidth() прекрасно работает в showText(), но не в drawOval().Я знаю, что это выглядит немного по-другому, но я также использовал int x = findViewById(LAYOUT).getWidth(); версию в drawOval(), и x / y всегда 0.Я не очень понимаю, почему в этой более ранней точке, кажется, нет ширины / высоты.Даже если я на самом деле нарисую кнопку на абсолютном макете, getWidth() вернет 0.Очевидно, я хочу измерить размеры в drawOval().

Ответы [ 6 ]

10 голосов
/ 08 апреля 2014

Я думаю, что поможет вам.

   LinearLayout headerLayout = (LinearLayout)findviewbyid(R.id.headerLayout);
    ViewTreeObserver observer = headerLayout .getViewTreeObserver();
            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // TODO Auto-generated method stub
            int headerLayoutHeight= headerLayout.getHeight();
        int headerLayoutWidth = headerLayout.getWidth();
        headerLayout .getViewTreeObserver().removeGlobalOnLayoutListener(
                this);
    }
});


}  
7 голосов
/ 17 января 2012

getWidth() дает вам 0, потому что onCreate вызывается до того, как на самом деле произойдет макет. Из-за того, что представления могут иметь динамические позиции и размеры на основе атрибутов или других элементов (например, fill_parent), не существует фиксированного размера для любого данного вида или макета. Во время выполнения существует момент времени (на самом деле это может происходить многократно в зависимости от многих факторов), когда все фактически измеряется и выкладывается. Если вам действительно нужны высота и ширина, вам придется получить их позже, как вы обнаружили.

3 голосов
/ 17 января 2012

Это особенно касается Dimension s, поэтому

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight();

Это может помочь вам в управлении размерами.

Примечание. Возвращает размеры дисплея в пикселях - как и ожидалось.Но методы getWidth () и getHeight () устарели.Вместо этого вы можете использовать:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

, как также предложил Мартин Кубек.

2 голосов
/ 18 ноября 2014

Это даст вам разрешение экрана:

 WindowManager wm = (WindowManager)context.getSystemService(context.WINDOW_SERVICE);
 Display display = wm.getDefaultDisplay();
 Point outSize = new Point();
 display.getSize(outSize);
2 голосов
/ 17 января 2012

Если ваша цель - просто нарисовать овал на экране, тогда подумайте о создании своего собственного View вместо того, чтобы возиться с AbsoluteLayout. Ваш пользовательский View должен переопределить onDraw(android.graphics.Canvas), который будет вызываться, когда представление должно отображать его содержимое.

Вот очень простой пример кода, который может помочь вам начать:

public class MainActivity extends Activity {

    private final Paint mPaint = new Paint();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }

    // create a nested custom view class that can draw an oval. if the
    // "SampleView" is not specific to the Activity, put the class in 
    // a new file called "SampleView.java" and make the class public 
    // and non-static so that other Activities can use it. 
    private static class SampleView extends View {
        public SampleView(Context context) {
            super(context);
            setFocusable(true);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.CYAN);

            // smoothen edges
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.RED);
            mPaint.setStyle(Paint.Style.STROKE); 
            mPaint.setStrokeWidth(4.5f);

            // set alpha value (opacity)
            mPaint.setAlpha(0x80);

            // draw oval on canvas
            canvas.drawOval(new RectF(50, 50, 20, 40), mPaint);
        }
    }
}
1 голос
/ 17 января 2012

Кабуко ответ правильный, но может быть немного более ясным, поэтому позвольте мне уточнить.

getWidth() и getHeight() (правильно) дают вам 0, потому что они не были нарисованы в макете, когда вы их вызываете. попробуйте вызвать два метода для кнопки после addView() (после того, как представление было нарисовано и присутствует в макете) и посмотрите, дает ли это ожидаемый результат.

См. post для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...