2011-09-23 7 views
13

Lo sé, lo pueden iniciar los ajustes-Actividad con¿Cómo puedo saber si animaciones de ventanas están habilitadas en la configuración

Intent intent = new Intent(Settings.ACTION_DISPLAY_SETTINGS); 
startActivityForResult(intent,1); 

pero ¿cómo puedo saber si las animaciones están habilitadas en el primer lugar?

Tengo una animación dentro de una vista personalizada y solo quiero mostrarla, si las animaciones están habilitadas en la configuración. Si están deshabilitados, me gustaría pedirle al usuario que los habilite la primera vez que inicia la aplicación.

Respuesta

9

Consulte http://developer.android.com/reference/android/provider/Settings.System.html.

Usted puede leer las banderas:

  • TRANSITION_ANIMATION_SCALE
  • WINDOW_ANIMATION_SCALE

Si son 0, entonces animaciones están desactivados.

+1

Gracias, eso funcionó. Me gustaría añadir, que si la configuración del usuario está configurada en "Se muestran algunas animaciones de ventana", entonces solo Settings.System.WINDOW_ANIMATION_SCALE se establece en 1.0, el otro en 0.0. – roplacebo

+0

¿Cómo los usamos realmente? Probé con la función 'getInt()' pero seguí viendo una excepción y cambié al 'getInt()' con un valor predeterminado pero luego siempre obtengo el valor predeterminado de nuevo :( –

+1

Si lo intentas 'getFloat', ¿funcionará? –

6

Configuración. Sistema .TRANSITION_ANIMATION_SCALE y Configuración. Sistema .ANIMATOR_DURATION_SCALE están en desuso desde API 17.

Así que utilizo este método para averiguarlo.

private boolean areSystemAnimationsEnabled() { 
    float duration, transition; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    duration = Settings.Global.getFloat(
        context.getContentResolver(), 
        Settings.Global.ANIMATOR_DURATION_SCALE, 1); 
    transition = Settings.Global.getFloat(
        context.getContentResolver(), 
        Settings.Global.TRANSITION_ANIMATION_SCALE, 1); 
    } else { 
    duration = Settings.System.getFloat(
        context.getContentResolver(), 
        Settings.System.ANIMATOR_DURATION_SCALE, 1); 
    transition = Settings.System.getFloat(
        context.getContentResolver(), 
        Settings.System.TRANSITION_ANIMATION_SCALE, 1); 
    } 
    return (duration != 0 && transition != 0); 
} 

O bien, se puede comprobar sólo para ANIMATOR_DURATION_SCALE ...

private float checkSystemAnimationsDuration() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    return Settings.Global.getFloat(
     context.getContentResolver(), 
     Settings.Global.ANIMATOR_DURATION_SCALE, 
     0); 
    } else { 
    return Settings.System.getFloat(
     context.getContentResolver(), 
     Settings.System.ANIMATOR_DURATION_SCALE, 
     0); 
    } 
} 

y establecer su valueAnimator.setDuration() en consecuencia.

ValueAnimator alphaFirstItemAnimator = new ValueAnimator(); 
alphaFirstItemAnimator.setObjectValues(0.8F, 0F); 
alphaFirstItemAnimator.setDuration((long)(DURATION_ANIMATION_MILLIS * checkSystemAnimationsDuration())); 
alphaFirstItemAnimator.setInterpolator(new DecelerateInterpolator()); 
alphaFirstItemAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    public void onAnimationUpdate(ValueAnimator animation) { 

    } 
}); 

Espero que ayude a alguien.

Cuestiones relacionadas