//EVENT LISTENER DELLE VITI PER PASSARE A SETTINGMODE
screwOpen = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Vibrator vib = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
vib.vibrate(500);
if(settingMode==false){
if(v==leftTop) {
if(openFlag==0){
openFlag=1;
leftTop.setImageResource(R.drawable.unscrewed);
}
else if(openFlag==1){
openFlag=0;
leftTop.setImageResource(R.drawable.screwed);
}
}
if(v==rightTop) {
if(openFlag==1){
openFlag=2;
rightTop.setImageResource(R.drawable.unscrewed);
}
else if(openFlag==2){
openFlag=1;
rightTop.setImageResource(R.drawable.screwed);
}
}
if(v==leftBottom){
if(openFlag==2){
openFlag=3;
leftBottom.setImageResource(R.drawable.unscrewed);
}
else if(openFlag==3){
openFlag=2;
leftBottom.setImageResource(R.drawable.screwed);
}
}
if(v==rightBottom && openFlag==3) {
rightBottom.setImageResource(R.drawable.unscrewed);
settingMode=true;
bttIniziale.setVisibility(View.INVISIBLE);
openFlag=0;
}
} // fine di if(settingMode==false)
else{
leftTop.setImageResource(R.drawable.screwed);
rightTop.setImageResource(R.drawable.screwed);
leftBottom.setImageResource(R.drawable.screwed);
rightBottom.setImageResource(R.drawable.screwed);
settingMode=false;
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
}
button.setVisibility(View.INVISIBLE);
imgButton.setVisibility(View.INVISIBLE);
if(currentCat.equals("iniziale")) bttIniziale.setVisibility(View.INVISIBLE);
else bttIniziale.setVisibility(View.VISIBLE);
}
return true;
}
};
Quindi lo sfascio.Ecco il nuovo Listener:
//EVENT LISTENER DELLE VITI PER PASSARE A SETTINGMODE
View.OnTouchListener padTouchListener=new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
DragShadowBuilder shadowBuilder=new DragShadowBuilder(v);
v.startDrag(null, shadowBuilder, v, 0);
return true;
}
};
View.OnDragListener padDragListener=new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
if(event.getAction()==DragEvent.ACTION_DROP){
if((v==leftBottom && event.getLocalState()==rightTop)
|| (v==rightBottom && event.getLocalState()==leftTop)) return false;
//se settingMode è falso, le immagini di chiusura vanno modificate
//in apertura, se settingMode è vero deve accadere il
//contrario.
//Il valore deve diventare sempre true.
//quindi alla fine se i valori sono ambedue true allora se
//settingMode è falso diventa vero e viceversa.
if(v==leftBottom && event.getLocalState()==leftTop){
if(padLockLeft==false){
((ImageView)v).setImageResource(R.drawable.lucaperto);
padLockLeft=true;
}else{
((ImageView)v).setImageResource(R.drawable.lucchiuso);
padLockLeft=false;
}
}
if(v==rightBottom && event.getLocalState()==rightTop){
if(padLockRight==false){
((ImageView)v).setImageResource(R.drawable.lucaperto);
padLockRight=true;
}else{
((ImageView)v).setImageResource(R.drawable.lucchiuso);
padLockRight=false;
}
}
if(padLockLeft==true && padLockRight==true) {
settingMode=true;
button.setVisibility(View.INVISIBLE);
imgButton.setVisibility(View.INVISIBLE);
bttIniziale.setVisibility(View.INVISIBLE);
}
if(padLockLeft==false && padLockRight==false) {
settingMode=false;
}
}
return true;
}
};
leftTop.setOnTouchListener(padTouchListener);
rightTop.setOnTouchListener(padTouchListener);
leftBottom.setOnDragListener(padDragListener);
rightBottom.setOnDragListener(padDragListener);
Restano dei dubbi sulla gestione dei pulsanti e del colore giallo dell'etichetta della View in questione.Nel precedente listener come mi ero regolato?
Ecco: in caso ci troviamo nella condizione settingMode = true e passiamo a settingMode = false, c'era questo codice:
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
}
button.setVisibility(View.INVISIBLE);
imgButton.setVisibility(View.INVISIBLE);
if(currentCat.equals("iniziale")) bttIniziale.setVisibility(View.INVISIBLE);
else bttIniziale.setVisibility(View.VISIBLE);
e cioè:
Per ogni View contenuta nel mainLayout, viene colorata in bianco l'etichetta:
questo codice:
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
}
Quindi il bottone Cancella viene reso invisibile:
button.setVisibility(View.INVISIBLE);
Quindi viene reso invisibile il bottone Cambio Immagine:
imgButton.setVisibility(View.INVISIBLE);
e invece viene reso visibile il bottone che riporta la pseudoschermata iniziale se non siamo nella pseudoschermata iniziale:
if(currentCat.equals("iniziale")) bttIniziale.setVisibility(View.INVISIBLE);
else bttIniziale.setVisibility(View.VISIBLE);
Proviamo a sintetizzare tutto in una sola funzione.
Eccola:
private void buttonsNoSettingMode(){
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
}
button.setVisibility(View.INVISIBLE);
imgButton.setVisibility(View.INVISIBLE);
if(currentCat.equals("iniziale")) bttIniziale.setVisibility(View.INVISIBLE);
else bttIniziale.setVisibility(View.VISIBLE);
}
che viene chiamata qui, quando il listener dei lucchetti cambia il settingMode a false:
if(padLockLeft==false && padLockRight==false) {
settingMode=false;
buttonsNoSettingMode();
//toglie il giallo dall'etichetta, nasconde
//i pulsanti cancella e cambia immagine,
//mostra il pulsante che torna alla schermata iniziale
}
Ho poi ottimizzato la comparsa del button Modifica Immagine, che appare al click sulla view e sparisce quando viene cliccata un'altra view o il mainLayout
La situazione in cui viene cliccata un'altra View era già stata sistemata nell'ambito dell'OnTouchListener delle View, getAction ACTION_DOWN:
ActiveOne=(LinearLayout)v;
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
ActiveOne.getChildAt(numEtichetta).setBackgroundColor(Color.YELLOW);
}
button.setVisibility(View.VISIBLE);
imgButton.setVisibility(View.VISIBLE);
vengono reimbiancate tutte le views, quindi quella attiva, attribuita alla variabile ActiveOne, viene colorata di giallo nella sua etichetta; si rendono visibili il button e l'imgButton che agiscono su ActiveOne.
Invece quando si clicca su mainLayout si devono imbiancare tutte le views senza colorarne di giallo alcuna e devono sparire i buttons (codice nell'OnTouchListener del mainLayout):
ActiveOne=null;
for(int i=0;i<mainLayout.getChildCount();i++){
((ViewGroup)mainLayout.getChildAt(i)).getChildAt(numEtichetta).setBackgroundColor(Color.WHITE);
}
button.setVisibility(View.INVISIBLE);
imgButton.setVisibility(View.INVISIBLE);
Sperimentiamo: da modalità settingMode false a settingMode true: ho creato un'altra view, e cliccando l'una o l'altra si colora di giallo la sua etichetta, mentre cliccando sul mainLayout si decolorano tutte le etichette delle views, e spariscono i bottoni.Ora passo dalla selezione di una di queste views alla modalità settingMode false, per mezzo dei lucchetti.
Anche questo funziona.
Ora, per vedere se nel passaggio da settingMode true a settingMode false in pseudoschermate diverse da quella iniziale appare il button che riporta allo stato iniziale.
Creo un'immagine categoria.
E ho trovato il primo bugghetto: il pulsante non sparisce passando a settingMode true.
La funzione buttonsNoSettingMode è stata chiamata quando per mezzo dei lucchetti si passa da settingMode true a settingMode false, e in quel caso funziona. Però non funziona la sua sparizione quando si va a settingMode true.
Ho ovviato in questo modo, nel listener dei lucchetti:
if(padLockLeft==true && padLockRight==true) {
settingMode=true;
bttIniziale.setVisibility(View.INVISIBLE);
}
if(padLockLeft==false && padLockRight==false) {
settingMode=false;
buttonsNoSettingMode();
Se già è invisibile in quanto siamo nella pseudoschermata iniziale, è solo un innocuo pleonasmo.
Nessun commento:
Posta un commento