09.02.2017 Views

creez-des-applications-pour-android

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

3 Création d’interfaces graphiques<br />

}<br />

init(attrs);<br />

// idem<br />

public ChessBoardView(Context context, AttributeSet attrs) {<br />

super(context, attrs);<br />

init(attrs);<br />

}<br />

private void init(AttributeSet attrs) {<br />

// Je récupère mon tableau d'attributs depuis le paramètre que m'a donné le construct<br />

TypedArray attr = getContext().obtainStyledAttributes(attrs, R.styleable.ChessBoardVi<br />

// Il s'agit d'un TypedArray qu'on sait déjà utiliser, je récupère la valeur de la co<br />

int tmpOne = attr.getColor(R.styleable.ChessBoardView_colorOne, -1);<br />

// Je récupère la valeur de la couleur, 2 ou -1 si on ne la trouve pas<br />

int tmpTwo = attr.getColor(R.styleable.ChessBoardView_colorTwo, -1);<br />

init(tmpOne, tmpTwo);<br />

}<br />

3.8.4.3 onMeasure<br />

La taille par défaut de 100 pixels est ridicule et ne conviendra jamais à un échiquier. Je vais faire<br />

en sorte que, si l’application me l’autorise, je puisse exploiter le carré le plus grand possible, et<br />

je vais faire en sorte qu’au pire notre vue prenne au moins la moitié de l’écran.<br />

Pour cela, j’ai écrit une méthode qui calcule la dimension la plus grande entre la taille que me<br />

demande de prendre le layout et la taille qui correspond à la moitié de l’écran. Puis je compare en<br />

largeur et en hauteur quelle est la plus petite taille accordée, et mon échiquier s’accorde à cette<br />

taille.<br />

[[information]] | Il existe plusieurs métho<strong>des</strong> <strong>pour</strong> calculer la taille de l’écran. De mon côté,<br />

j’ai fait en sorte de l’intercepter depuis les ressources avec la méthode DisplayMetrics<br />

getDisplayMetrics (). Je récupère ensuite l’attribut heightPixels <strong>pour</strong> avoir la hauteur<br />

de l’écran et widthPixels <strong>pour</strong> sa largeur.<br />

/**<br />

* Calcule la bonne mesure sur un axe uniquement<br />

* @param spec - Mesure sur un axe<br />

* @param screenDim - Dimension de l'écran sur cet axe<br />

* @return la bonne taille sur cet axe<br />

*/<br />

private int singleMeasure(int spec, int screenDim) {<br />

int mode = MeasureSpec.getMode(spec);<br />

int size = MeasureSpec.getSize(spec);<br />

// Si le layout n'a pas précisé de dimensions, la vue prendra la moitié de l'écran<br />

if(mode == MeasureSpec.UNSPECIFIED)<br />

return screenDim/2 ;<br />

else<br />

// Sinon, elle prendra la taille demandée par le layout<br />

232

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!