JavascriptProva

giovedì 14 aprile 2016

Conseguenze del nuovo tipo di "apertura" del settingMode nella mia applicazione mediante "Drag Drop di lucchettii"

Tengo memoria del complicato processo a quattro viti che avevo ingegnato per passare alla modalità settingMode nella mia App.
 //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