2015-03-17 4 views
6

Ho provato a creare il mio interpolatore personalizzato seguendo le API API di Android. Quindi questo è l'interpolatore.Interpolatore personalizzato Android con xml

<?xml version="1.0" encoding="utf-8"?> 
<customInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
android:factor="2" 
/> 

Ma quando cerco di usarlo in animazione:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android"> 
    android:fromXScale="1" 
    android:toXScale="5" 
    android:duration="3000" 
    android:interpolator="@anim/custom_interpolator"/> 
</scale> 

e non succede nulla - la vista semplicemente rinfrescarsi. Perché ? E perché se cerco di usare è in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

<scale 
    android:fromXScale="1" 
    android:toXScale="5" 
    android:duration="3000" 
    android:interpolator="@anim/custom_interpolator"/> 
</set> 

con questo codice:

AnimationSet animation =  (AnimationSet)AnimationUtils.loadAnimation(AnimationActivity.this, R.anim.animation); 
animationView.startAnimation(animation); 

un eccezioni è gettato:

java.lang.RuntimeException: Unknown interpolator name: customInterpolator 
     at android.view.animation.AnimationUtils.createInterpolatorFromXml(AnimationUtils.java:422) 
     at android.view.animation.AnimationUtils.loadInterpolator(AnimationUtils.java:285) 
     at android.view.animation.Animation.setInterpolator(Animation.java:391) 
     at android.view.animation.Animation.<init>(Animation.java:255) 
     at android.view.animation.ScaleAnimation.<init>(ScaleAnimation.java:63) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:119) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:115) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:92) 
     at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:73) 
     at com.example.someone.studyproject.AnimationActivity$4.onClick(AnimationActivity.java:61) 
     at android.view.View.performClick(View.java:4633) 
     at android.view.View$PerformClick.run(View.java:19330) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:157) 
     at android.app.ActivityThread.main(ActivityThread.java:5356) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
     at dalvik.system.NativeStart.main(Native Method) 

E 'strano, non ho mai creare il mio interpolatore personalizzato con xml (volevo farlo in xml solo per praticarlo). Grazie in anticipo.

Ora cerco:

<scale 
    android:fromXScale="1" 
    android:toXScale="5" 
android:pivotX="50%" 
android:pivotY="50%" 
    android:duration="3000"/> 

e questo non funziona - l'immagine scompare e dopo 5 secondi è tornato. Perché ? Perché l'immagine scompare invece di ridimensionare?

risposta

3

Dai un'occhiata all'errore che sta lanciando. "customInterpolator" non è un vero interpolatore. Hai appena creato quel tag dal nulla. Devi usare le classi di interpolatore Android integrate se vuoi modificarle. Per esempio:

customInterpolator.xml

<accelerateInterpolator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:factor="2" /> 

Dai un'occhiata alla this link per diversi tipi di interpolatori disponibili in Android.

Se non si desidera utilizzare uno degli interpolatori Android esistenti, è possibile crearlo a livello di programmazione.

CubicAccelerateDecelerateInterpolator.java

public class CubicAccelerateDecelerateInterpolator implements Interpolator 
{ 
    @Override 
    public float getInterpolation(float t) 
    { 
     float x = t * 2.0f; 
     if (t < 0.5f) 
     { 
      return 0.5f * x * x * x; 
     } 
     x = (t - 0.5f) * 2 - 1; 
     return 0.5f * x * x * x + 1; 
    } 
} 

Come si può vedere, è necessario creare una funzione che restituisce il valore di interpolazione tra 0 e 1 per il tempo t. i = f (t )

Nota: se lo si fa in questo modo, non è possibile fare riferimento a questo interpolatore in XML. Devi creare la tua animazione programmaticamente.