Blocco n.7

27/11/14 Slide Grafica 144 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco •  Un’immagine può essere disegnata in –  un oggeJo View •  grafica semplice, senza necessità di cambiamenO –  un oggeto Canvas •  grafica complessa, aggiornamenO frequenO •  Classe Drawable –  rappresenta un oggeJo che può essere disegnato •  un’immagine, ma anche un colore, una forma, etc •  ShapeDrawable – una forma •  BitmapDrawable – una matrice di pixels •  ColorDrawable – un colore (uniforme) Grafica Android Mobile Programming – Prof. R. De Prisco Slide 145 Università di Salerno -­‐ a.a. 2013-­‐2014 •  L’oggeJo Drawable deve essere inserito nell’oggeJo View –  direJamente nel file XML –  in modo programmaOco •  View.setImageDrawable() GraficaSimpleImg
1 27/11/14 Slide Animazioni 146 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco •  Android permeJe di definire delle animazioni da applicare alle immagini •  DescriJe con file XML –  rotazione –  traslazione –  scaling (dimensione) –  trasparenza –  con controllo di vari parametri •  es., punto di pivot, velocità, etc. Slide Animazioni 147 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco •  Class AnimaOon •  permeJe di –  leggere le animazioni dai file XML –  applicarle alle ImageView GraficaImgAnim
2 27/11/14 Slide Custom Views 148 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco •  Android ha molO widget –  PulsanO, Liste, ImageView, etc, etc. •  Per esigenze parOcolare possiamo definire dei widget personalizzaO •  PermeJono un maggiore controllo sulla grafica –  ovviamente sono più complicaO da usare Slide Albero delle View 149 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco LinearLayout Frame LinearLayout ImageView BuJon RelaOveLayout BuJon ImageView EditText BuJon public class View { … public void onMeasure(…) public void onLayout(…) … } 3 27/11/14 Meccanismo di layout Android Mobile Programming – Prof. R. De Prisco Slide 150 Università di Salerno -­‐ a.a. 2013-­‐2014 •  “Container Views” –  RelaOveLayout –  LinearLayout •  Il meccanismo di layout inizia quando viene chiamato il metodo requestLayout su una View dell’albero –  solitamente un widget chiama requestLayout quando ha bisogno di altro spazio •  requestLayout meJe un evento nella coda degli evenO UI –  Quando l’evento viene processato, ogni container view ha la possibilità di interagire con i figli Meccanismo di layout Android Mobile Programming – Prof. R. De Prisco Slide 151 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Il processo ha due fasi 1.  misura delle views contenuto nel container 2.  posizionamento delle views all’interno del container •  TuJe le view devono implementare la fase 1 •  Sole le view container devono avere anche la fase 2 4 27/11/14 Misura Android Mobile Programming – Prof. R. De Prisco Slide 152 Università di Salerno -­‐ a.a. 2013-­‐2014 •  La fase di misura offre la possibilità alle views di chiedere lo spazio di cui hanno bisogno •  Android inizia il processo chiamando il metodo measure sulla radice dell’albero –  a parOre dalla radice ogni container view chiede ai figli lo spazio di cui hanno bisogno –  la richiesta si propaga ricorsivamente •  Mesaure è un metodo “final” che non può essere riscriJo –  onMeasure invece sì, viene chiamato da measure onMeasure() Android Mobile Programming – Prof. R. De Prisco Slide 153 Università di Salerno -­‐ a.a. 2013-­‐2014 public class MyView extends Views{ MyView(Context context) { super(context); } … @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension( getSuggestedMinimumWidth(), getSuggestedMinimumHeigh()); } …. } •  onMeasure potrebbe essere chiamata varie volte! •  gli “int” contengono anche dei bit addizionali 5 27/11/14 MeasureSpec Android Mobile Programming – Prof. R. De Prisco Slide 154 Università di Salerno -­‐ a.a. 2013-­‐2014 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec);} •  width e heigth –  in pixels •  widthMode e heigthMode –  MeasureSpec.EXACTLY –  MeasureSpec.AT_MOST –  MeasureSpec.UNSPECIFIED Layout Android Mobile Programming – Prof. R. De Prisco Slide 155 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Nella fase di Layout i view container comunicano la posizione effevva ad ogni view figlio public class MyView extends Views{ … @Override public void onLayout (int x1, int y1, int x2, int y2) { Log.d("DEBUG","onLayout”); Log.d("DEBUG","coordinate x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2); int smw = getSuggestedMinimumWidth(); int smh = getSuggestedMinimumHeight(); Log.d("DEBUG","onLayout smw="+smw+" smh="+smh); setMeasuredDimension(smw,smh); } …. } 6 27/11/14 Disegnare nel canvas Android Mobile Programming – Prof. R. De Prisco Slide 156 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Quando la view è stata posizionata verrà disegnata –  metodo onDraw •  OggeJo Paint e metodi dell’oggeJo Canvas public class MyView extends Views{ … @Override public void onDraw (Canvas canvas) { //Codice per disegnare la view } …. } Esempi Android Mobile Programming – Prof. R. De Prisco GraficaCustomWidget
Slide 157 Università di Salerno -­‐ a.a. 2013-­‐2014 GraficaCanvas
7