Il principio è ingegnoso: abbiamo un unico database in cui per ogni record abbiamo i campi:
- ETICHETTA, che è quello che appare come didascalia dell'immagine;
- CATEGORIA, che è quello che identifica la foto come appartenente a una schermata;
- TIPO, che identifica se l'immagine è un link a un'altra schermata o un'immagine il cui click genera un suono;
- IMMAGINE, che è l'immagine reale;
- X, posizione sull'asse X;
- Y, posizione sull'asse Y.
ETICHETTA mi risulta abbastanza chiaro.
Al posto di CATEGORIA potrei usare SCHERMATA, che è più intuitivo riguardo allo scopo di questo campo.
TIPO potrebbe essere booleano anziché stringa, identificando come VERO quando si tratti di un'immagine normale e FALSO quando si tratti di un link a una categoria.
Le stesse immagini le potrei denominare "Immagine vera" o "Link a schermata".
Rivediamo un attimo il meccanismo della ScrollView, che non ricordo affatto...
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/superLayout"
android:background="@drawable/w3"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/leftTop"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:src="@drawable/chiave" />
<ImageView
android:id="@+id/rightTop"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:src="@drawable/chiave" />
<ImageView
android:id="@+id/leftBottom"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="0dp"
android:layout_marginBottom="0dp"
android:src="@drawable/lucchiuso" />
<ImageView
android:id="@+id/rightBottom"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
android:src="@drawable/lucchiuso" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="0dp"
android:layout_alignTop="@+id/leftTop"
android:layout_alignBottom="@+id/leftTop"
android:layout_toRightOf="@+id/leftTop"
android:layout_toLeftOf="@+id/button2"
android:background="#FFF"
android:text="" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/rightTop"
android:background="#0066ff"
android:text="Cancella" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="30dp"
android:id="@+id/scrollView" >
<RelativeLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
</RelativeLayout>
</ScrollView>
<Button
android:id="@+id/bttIndietro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/rightTop"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:visibility="invisible"
android:background="#aff"
android:text="<-" />
<Button
android:id="@+id/bttModifica"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentBottom="true"
android:layout_alignLeft="@+id/scrollView"
android:layout_marginLeft="200dp"
android:visibility="invisible"
android:background="#afa"
android:textSize="10sp"
android:text="MOD. IMMAGINE" />
<TextView
android:id="@+id/txtBarraCategoria"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentBottom="true"
android:layout_alignTop="@+id/leftBottom" />
<Button
android:id="@+id/bttCancellaImg"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/scrollView"
android:layout_marginRight="45dp"
android:background="#faa"
android:text="CANCELLA"
android:textSize="10sp"
android:visibility="invisible" />
</RelativeLayout>
Isoliamo la parte che ci interessa...
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="30dp"
android:id="@+id/scrollView" >
<RelativeLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
</RelativeLayout>
</ScrollView>
Praticamente c'è una ScrollView all'interno di un RelativeLayout.Sembra banale, ma il problema sta nelle proprietà della ScrollView.
Ho riprodotto la cosa con un copia-incolla:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.antonello.j_communicator.MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="30dp"
android:id="@+id/scrollView" >
<RelativeLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
</RelativeLayout>
</ScrollView>
</RelativeLayout>
Ma ottengo un rettangolo nero all'interno di un'activity bianca.Probabilmente il problema sta in quei "margin" che nell'app avevo messo in quanto non volevo la ScrollView a tutto schermo.
Tolgo i margini:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.antonello.j_communicator.MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:id="@+id/scrollView" >
<RelativeLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
</RelativeLayout>
</ScrollView>
</RelativeLayout>
Adesso la parte nera centrale è più ampia, ma resta pur sempre un bordino bianco.Forse devo agire sul RelativeLayout maggiore togliendo i padding...
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.antonello.j_communicator.MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:id="@+id/scrollView" >
<RelativeLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
</RelativeLayout>
</ScrollView>
</RelativeLayout>
Sì, adesso è ottimale: tutta la schermata nera.Ora inserisco qualcosa nel RelativeLayout centrale.
mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
scrollView=(ScrollView)findViewById(R.id.scrollView);
ImageView immagine1=new ImageView(this);
ImageView immagine2=new ImageView(this);
immagine1.setImageResource(R.drawable.bonazzacavallo);
immagine2.setImageResource(R.drawable.facciadaculo);
immagine1.setX(200);
immagine1.setY(0);
mainLayout.addView(immagine1);
immagine1.getLayoutParams().width=200;
immagine1.getLayoutParams().height=100;
Un po' di ripasso mi fa bene: ho individuato di nuovo gli attributi che si possono attribuire a un'immagine prima del caricamento sul Layout e quelli che invece funzionano soltanto dopo questo caricamento.La posizione, impostata con setX e setY, può essere stabilita anche quando l'oggetto non è stato caricato nel layout, mentre le dimensioni possono essere impostate soltanto successivamente.
Ora vediamo come fare se invece di un ImageView pongo una semplice View.
Ecco:
View view=new View(this);
mainLayout.addView(view);
view.setBackgroundColor(Color.GREEN);
view.getLayoutParams().height=100;
view.getLayoutParams().width=100;
E ottengo un quadratino in alto a sinistra.Provo a impostare anche la posizione...
View view=new View(this);
view.setX(100);
view.setY(200);
mainLayout.addView(view);
view.setBackgroundColor(Color.GREEN);
view.getLayoutParams().height=100;
view.getLayoutParams().width=100;
E ottengo il quadratino spostato come intendevo io.Ora provo a sperimentare la ScrollView...
Imposto semplicemente un'altezza esagerata per la mia view, e vedo se la schermata scorre fino a visualizzarla tutta:
View view=new View(this);
view.setX(100);
view.setY(200);
mainLayout.addView(view);
view.setBackgroundColor(Color.GREEN);
view.getLayoutParams().height=2000;
view.getLayoutParams().width=100;
Riuscito! La schermata scorre come prevedevo!
Prima di vedere come avevo agito in modo da spostare gli oggetti a schermata ferma, vorrei soffermarmi su una proprietà della ScrollView nell'XML.
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:id="@+id/scrollView" >
Che cosa era quel fillViewport?Provo a eliminarlo.
Ecco, non succede niente se la View è più alta della schermata, ma se invece è più piccola, la ScrollView si riduce a una parte della schermata stessa.
Ripristinando fillViewport, la cosa torna a posto.
Ho avuto qualche problema con la ScrollView che non funzionava perfettamente quando le immagini scavalcavano di poco il margine inferiore.
Ho risolto confrontando con la mia app: anziché setX e setY, in un RelativeLayout, bisogna usare RelativeLayout.LayoutParams, altrimenti ci sono risultati paradossali.
Ecco:
ImageView view=new ImageView(this);
RelativeLayout.LayoutParams params=
new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.width=300;
params.height=300;
params.leftMargin=0;
params.topMargin=50;
view.setLayoutParams(params);
view.setImageResource(R.drawable.facciadaculo);
mainLayout.addView(view);
e il problema è risolto.
Nessun commento:
Posta un commento