Controale în Android (widget-uri)

În Android, un control (pentru care se utilizează și denumirea de widget) este de regulă derivat din clasa android.view.View, unde sunt definite câteva caracteristici de bază cu privire la dimensiuni și la modul de dispunere:

ATRIBUTTIP OBIECTDESCRIERE
layout_widthView / ViewGrouplățimea obiectului
layout_heightView / ViewGroupînălțimea obiectului
layout_marginTopView / ViewGroupspațiu suplimentar ce trebuie alocat în partea de sus a obiectului
layout_marginBottomView / ViewGroupspațiu suplimentar ce trebuie alocat în partea de jos a obiectului
layout_marginLeftView / ViewGroupspațiu suplimentar ce trebuie alocat în partea din stânga a obiectului
layout_marginRightView / ViewGroupspațiu suplimentar ce trebuie alocat în partea din dreapta a obiectului
layout_gravityViewmodul de poziționare a elementelor componente în cadrul unui container
layout_weightViewproporția pe care o are controlul, raportată la întregul conținut al containerului
layout_xView / ViewGrouppoziția pe coordonata x
layout_yView / ViewGrouppoziția pe coordonata y
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginBottom="16dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_gravity="center"
    android:layout_weight="1"
    android:layout_x="100dp"
    android:layout_y="100dp"
    android:text="Example TextView" />

Unele dintre aceste proprietăți pot fi specificate și pentru containerele în care sunt cuprinse controalele, derivate din clasa android.view.ViewGroup.

Valorile pe care le pot lua atributele layout_width și layout_height sunt:

  • match_parent - dacă se dorește ca obiectul să ocupe tot spațiul pe care îl pune la dispoziție containerul său;

  • wrap_content - dacă se dorește ca obiectul să fie restrâns la dimensiunile conținutului său.

În situația în care nu se specifică cel puțin valorile layout_width și layout_height pentru un anumit control, se va genera o excepție întrucât interfața grafică nu poate fi încărcată corespunzător.

De asemenea, pot fi specificate valori absolute, exprimate în una din unitățile de măsură:

  • dp - pixel independent de rezoluție

Se recomandă să se utilizeze această unitate de măsură în momentul în care se specifică dimensiunea unui control în cadrul unui container. Se asigură astfel faptul că se utilizează o proporție adecvată pentru un control, indiferent de rezoluția ecranului, Android scalându-i dimensiunea automat.

  • sp - pixel independent de scală, echivalent cu dp

Specificarea dimensiunii ecranului unui dispozitiv mobil se face prin indicarea numărului de pixeli pe orizontală și pe verticală. Pentru a obține densitatea (rezoluția) dispozitivului respectiv, se împarte dimensiunea exprimată în pixeli la dimensiunea exprimată în inchi. Se va compara valoarea obținută cu una dintre valorile standard definite pentru încadrarea dispozitivului mobil într-o anumită categorie de rezoluție:

  • 120 dpi - ldpi (Low Density)
  • 160 dpi - mdpi (Medium Density)
  • 240 dpi - hdpi (High Density)
  • 320 dpi - xhdpi (Extra High Density)
  • 480 dpi - xxhdpi (Extra Extra High Density)

Formula de conversie între pixeli (px) și pixeli independenți de rezoluție (dp) este:

px = dp * (resolution_category) / 160

Se observă că 1 px este echivalent cu 1 dp pe un ecran cu rezoluția 160 dpi, considerată drept referință în Android.

Dimensiunea (exprimată în pixeli) a unui control poate fi obținută apelând metodele getWidth(), respectiv getHeight().