2012-01-16 17 views
9

Mi chiedo come misurare le dimensioni di una vista. Nel mio caso è aan Absolute Layout. Ho letto le risposte relative a queste domande, ma continuo a non capirlo. Sono abbastanza nuovo alla programmazione quindi forse sono solo io. ;)Come ottenere la larghezza/altezza di un layout in Android

Questo è il mio codice:

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();  


} 

Il comando getWidth() grandi opere in showText() ma lo fa non in drawOval(). So che sembra un po 'diverso, ma ho anche utilizzato la versione int x = findViewById(LAYOUT).getWidth(); in drawOval() e x/y sono sempre 0. Non capisco davvero perché non sembra esserci larghezza/altezza in quel punto precedente. Anche se effettivamente disegno un pulsante nel layout assoluto, getWidth() restituisce 0. Ovviamente voglio misurare le dimensioni in drawOval().

Apprezzerei qualsiasi aiuto.

Grazie!

+1

noti che 'AbsoluteLayout' è deprecato e non dovrebbe mai essere utilizzato. usa invece un layout indipendente dalla densità! –

+0

ciao, grazie. ma posso posizionare gli elementi assolutamente in qualsiasi altro tipo di Layout? – mayhem

+0

No, ma progettare qualcosa in modo assolutamente essenziale significa che si sta progettando per una dimensione/densità dello schermo. Dovresti essere in grado di ottenere il risultato desiderato usando qualcosa come LinearLayout (per esempio) e valori unitari indipendenti dalla densità ("dp" o "sp" invece di "px"). –

risposta

7

getWidth() ti dà 0 perché onCreate viene chiamato prima che il layout avvenga effettivamente. A causa delle visualizzazioni che possono avere posizioni e dimensioni dinamiche basate su attributi o altri elementi (ad esempio fill_parent) non esiste una dimensione fissa per una determinata vista o layout. In fase di esecuzione c'è un punto nel tempo (in realtà può accadere più volte a seconda di molti fattori) in cui tutto è effettivamente misurato e disposto. Se hai davvero bisogno dell'altezza e della larghezza, dovrai recuperarli in seguito come hai scoperto.

1

La risposta di kabuko è corretta, ma potrebbe essere un po 'più chiara, quindi permettimi di chiarire.

getWidth() e getHeight() hanno (correttamente) dato 0 perché non sono stati disegnati nel layout quando li chiami. prova a chiamare i due metodi sul pulsante dopo addView() (dopo che la vista è stata disegnata ed è presente nel layout) e vedi se questo ti dà il risultato previsto.

Vedere questo post per ulteriori informazioni.

+1

come ho detto prima, tuttavia, suggerisco caldamente di utilizzare un layout diverso (come 'LinearLayout' o' RelativeLayout') poiché 'AbsoluteLayout' è ** non ** indipendente dalla densità e non funzionerà bene su più dimensioni dello schermo e densità. –

+0

... o se stai cercando di disegnare un ovale su una tela, basta riempire lo schermo con una visualizzazione personalizzata che può portare a termine il lavoro. vedi il mio codice nella mia seconda risposta :) –

2

Se il tuo obiettivo è semplicemente disegnare un ovale sullo schermo, prendi in considerazione la creazione della tua personalizzata View invece di fare scherzi con AbsoluteLayout. Il tuo numero di telefono personalizzato View deve ignorare lo onDraw(android.graphics.Canvas), che verrà chiamato quando la vista deve visualizzare il suo contenuto.

Ecco alcuni esempi di codice estremamente semplice che potrebbe aiutarti ad iniziare:

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); 
     } 
    } 
} 
+0

questo [** post **] (http://stackoverflow.com/questions/3616676/how-to-draw-a-line-in-android) fornisce anche qualche esempio codice su come disegnare una linea se è utile :) –

3

Questo accordo speciale con Dimension c'è di così

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

Questo può aiutare a gestire le dimensioni.

Nota: restituisce le dimensioni dello schermo in pixel, come previsto. Ma i metodi getWidth() e getHeight() sono deprecati. Invece è possibile utilizzare:

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

come suggerito anche da Martin Koubek.

10

Penso che ti aiuterà.

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); 
    } 
}); 


} 
+0

cosa è "l" nel tuo caso? l.getHeight() –

2

Questo darà Risoluzione dello schermo:

WindowManager wm = (WindowManager)context.getSystemService(context.WINDOW_SERVICE); 
Display display = wm.getDefaultDisplay(); 
Point outSize = new Point(); 
display.getSize(outSize); 
+0

int width = size.x; altezza int = dimensione.y; – CoolMind

Problemi correlati