2015-03-17 26 views
6

Android API GUIdes'i izleyerek özel interpolator'ımı yapmaya çalıştım. Yani bu enterpolator.Android özel enterpolator ile xml

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

Ama bunu animasyona kullanmaya çalıştığınızda:

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

Ve hiçbir şey olmaz - görünüm sadece kendini yenilemek. Neden ? Ve kullanmaya çalışırsanız bu şekilde olmasının nedeni: Bu kod ile

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

:

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

bir istisna atılır:

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) 

Bu garip, ben oluşturmak asla benim xml ile özel enterpolatör (sadece bunu yapmak için xml'de yapmak istedim). Şimdiden teşekkürler. resim kaybolur ve 5 saniye sonra geri döndü -

<scale 
    android:fromXScale="1" 
    android:toXScale="5" 
android:pivotX="50%" 
android:pivotY="50%" 
    android:duration="3000"/> 
ve bu işe yaramazsa:

Şimdi deneyin. Neden ? Yeniden boyutlandırmak yerine neden resim kaybolacak?

cevap

3

Fırlatma hatasını gözden geçirin. "customInterpolator" gerçek bir interpolator değildir. Bu etiketi sadece hiç bir şeyden yaratmadın. Bunları değiştirmek istiyorsanız, dahili android interpolator sınıflarını kullanmalısınız. Örneğin:

customInterpolator.xml

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

Android'de mevcut interpolatörlerinin farklı türleri için this link göz at.

Mevcut android enterpolaratörlerden birini kullanmak istemezseniz, kendi programsal olarak kendi oluşturabilirsiniz. Görüldüğü gibi

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; 
    } 
} 

, zaman t için 0 ve 1 arasında enterpolasyon değerini veren bir fonksiyonu oluşturmak gerekir. i = f (t)

Not: Bu şekilde yaparsanız, XML bu aradeğerleyici başvuramaz. Animasyonunuzu programlı olarak oluşturmanız gerekir.