Autore Topic: Transizione del colore di sfondo al LongClick  (Letto 2303 volte)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 773
  • Respect: +161
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Transizione del colore di sfondo al LongClick
« il: 26 Febbraio 2012, 21:34:56 CET »
+1
...ossia come ottenere lo stesso effetto che si ha negli elementi dei ListView per evidenziare la presenza di un menù contestuale.

Codice (Java): [Seleziona]
View myView = findViewById(R.id.viewId);
myView.setBackgroundResource(R.drawable.bg_last_result);
myView.setOnTouchListener(listOnTouchListener);

  OnTouchListener listOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent me){
      switch (me.getAction()) {
      case MotionEvent.ACTION_DOWN:
        startLongPressAnimation(v);
        break;
      case MotionEvent.ACTION_UP:
        resetLongPressAnimation(v);
        break;
      case MotionEvent.ACTION_CANCEL:
        resetLongPressAnimation(v);
        break;
      }
      return false;
    }
   
    CompleteLongPress completeLongPress;
    Handler myHandler = new Handler();
   
    protected void startLongPressAnimation(View view) {
      view.setPressed(true);
      Drawable current = view.getBackground().getCurrent();
      if (current instanceof TransitionDrawable) {
        ((TransitionDrawable)current).startTransition(ViewConfiguration.getLongPressTimeout());
        if (completeLongPress == null) {
          completeLongPress = new CompleteLongPress();
        }
        completeLongPress.setView(view);
        myHandler.postDelayed(completeLongPress, ViewConfiguration.getLongPressTimeout() + ViewConfiguration.getTapTimeout());
      }
    }
   
    protected void resetLongPressAnimation(View view) {
      myHandler.removeCallbacks(completeLongPress);
     
      Drawable current = view.getBackground().getCurrent();
      if (current instanceof TransitionDrawable) {
        ((TransitionDrawable)current).resetTransition();
      }
    }
   
    class CompleteLongPress implements Runnable {
      View mView;
     
      public void setView(View view) {
        mView = view;
      }
     
      public void run() {
        Drawable current = mView.getBackground().getCurrent();
        if (current instanceof TransitionDrawable) {
          ((TransitionDrawable)current).resetTransition();
          mView.setPressed(false);
        }
      }
    }
  };

In alternativa di R.drawable.bg_last_result è possibile utilizzare un selector personalizzato così composto:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:state_window_focused="false"
            android:drawable="@drawable/normal_background" />
        <item
            android:state_focused="true"
            android:state_enabled="false"
            android:state_pressed="true"
            android:drawable="@drawable/disabled_background" />
       
        <item
                android:state_focused="true"
                android:state_enabled="false"
            android:drawable="@drawable/disabled_background" />
       
        <!-- Deve essere un TransitionDrawable -->
        <item
            android:state_focused="true"
            android:state_pressed="true"
            android:drawable="@drawable/transition_background" />
       
        <!-- Deve essere un TransitionDrawable -->
        <item
            android:state_focused="false"
            android:state_pressed="true"
            android:drawable="@drawable/transition_background" />
       
        <item
            android:state_focused="true"
            android:drawable="@+drawable/focused_background" />
</selector>

Spero torni utile, io ho impiegato un bel po' prima di riuscire ad ottenere questo risultato.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Transizione del colore di sfondo al LongClick
« Risposta #1 il: 27 Febbraio 2012, 00:10:43 CET »
0
Grazie :-)