//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