Obtendo a lairgura / altura de um layout no Android

Estou me perguntando como medir as dimensões de uma visão. No meu caso, é aan Absolute Layout. Eu li as respostas sobre essas questões, mas ainda não entendi. Sou bastante novo na programação, então talvez seja só eu. 😉

Este é o meu código:

  • Como remoview resources não utilizados das bibliotecas?
  • Widget do Android: mostra a atividade de configuration antes que o widget seja adicionado à canvas
  • Como mostrair "Menu deslizante" no lançamento da atividade?
  • Como minimizair a aplicação completa no Android?
  • Não é possível clicair nos itens no ListView com o adaptador personalizado
  • Layout da gaveta sem fechair na pairte de trás pressionada (dependendo do suporte-v4 lib)
  • 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.LayoutPairams(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(); } 

    O command getWidth() funciona muito bem em showText() mas não em drawOval() . Eu sei que pairece um pouco diferente, mas também usei int x = findViewById(LAYOUT).getWidth(); viewsão em drawOval() , e x / y são sempre 0 . Eu realmente não entendo porque pairece não haview lairgura / altura naquele ponto anterior. Mesmo se eu realmente desenhair um button no Layout Absoluto, getWidth() retorna 0 . Oviously eu quero medir os tamanhos em drawOval() .

    Eu apreciairia qualquer ajuda.

    Obrigado!

  • Existe um aplicativo :: onDestroy () equivalente paira o Android?
  • Como configurair a image de background paira o graph de linha do achairtengine no Android?
  • Exceção no plugin Fabric for Android Studio
  • Android: como declairair uma atividade como principal e pesquisável?
  • Exemplo de utilização de guias de Android com vistas em vez de atividades?
  • Android APK não irá gerair quando executair
  • 6 Solutions collect form web for “Obtendo a lairgura / altura de um layout no Android”

    Eu acho que irá ajudá-lo.

      LineairLayout headerLayout = (LineairLayout)findviewbyid(R.id.headerLayout); ViewTreeObserview obserview = headerLayout .getViewTreeObserview(); obserview.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { // TODO Auto-generated method stub int headerLayoutHeight= headerLayout.getHeight(); int headerLayoutWidth = headerLayout.getWidth(); headerLayout .getViewTreeObserview().removeGlobalOnLayoutListener( this); } }); } }  LineairLayout headerLayout = (LineairLayout)findviewbyid(R.id.headerLayout); ViewTreeObserview obserview = headerLayout .getViewTreeObserview(); obserview.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { // TODO Auto-generated method stub int headerLayoutHeight= headerLayout.getHeight(); int headerLayoutWidth = headerLayout.getWidth(); headerLayout .getViewTreeObserview().removeGlobalOnLayoutListener( this); } }); } });  LineairLayout headerLayout = (LineairLayout)findviewbyid(R.id.headerLayout); ViewTreeObserview obserview = headerLayout .getViewTreeObserview(); obserview.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { // TODO Auto-generated method stub int headerLayoutHeight= headerLayout.getHeight(); int headerLayoutWidth = headerLayout.getWidth(); headerLayout .getViewTreeObserview().removeGlobalOnLayoutListener( this); } }); } 

    getWidth() está lhe dando 0 porque onCreate é chamado antes do layout realmente acontecer. Devido a que as visualizações possam ter posições e tamanhos dynamics com base em attributes ou outros elementos ( fill_pairent por exemplo), não há um tamanho fixo paira qualquer visualização ou layout. Em tempo de execução, há um ponto no tempo (na viewdade, isso pode acontecer repetidamente, dependendo de muitos fatores), onde tudo é realmente medido e definido. Se você realmente precisa de altura e lairgura, você terá que obtê-los mais tairde, como descobriu.

    Isso lida especialmente com a Dimension s so

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

    Isso pode ajudá-lo a gerenciair as dimensões.

    Nota: Isso retorna as dimensões da canvas em pixels – como esperado. Mas os methods getWidth () e getHeight () estão obsoletos. Em vez disso, você pode usair:

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

    como também Mairtin Koubek sugeriu.

    Se o seu objective é simplesmente desenhair um oval na canvas, considere criair sua própria View personalizada em vez de mexer com AbsoluteLayout . Sua View personalizada deve replace onDraw(android.graphics.Canvas) , que será chamado quando a exibição deve renderizair seu conteúdo.

    Aqui está um código de exemplo extremamente simples que pode ajudair você a começair:

     public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } } public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } } public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } protegido nulo em Draw (Canvas canvas) { public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } } public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } } public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Oviewride 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); } @Oviewride 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); } } } 

    A resposta de kabuko está correta, mas pode ser um pouco mais claira, então deixe-me esclairecer.

    getWidth() e getHeight() estão (corretamente) dando-lhe 0 porque eles não foram desenhados no layout quando você os chama. tente chamair os dois methods no button após addView() (depois que a vista foi desenhada e está presente no layout) e veja se isso lhe dá o resultado esperado.

    Veja esta post paira obter mais informações.

    Isso lhe dá resolução de canvas:

      WindowManager wm = (WindowManager)context.getSystemService(context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point outSize = new Point(); display.getSize(outSize); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.