带xml的Android自定义插值器

带xml的Android自定义插值器,android,xml,interpolation,Android,Xml,Interpolation,我试着按照android API指南制作我的自定义插值器。 这就是插值器 <?xml version="1.0" encoding="utf-8"?> <customInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:factor="2" /> 将引发异常: java.lang.RuntimeException: Unknown interpolator nam

我试着按照android API指南制作我的自定义插值器。 这就是插值器

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

 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)
java.lang.RuntimeException:未知插值器名称:customInterpolator
在android.view.animation.AnimationUtils.createInterpolatorFromXml(AnimationUtils.java:422)中
位于android.view.animation.AnimationUtils.loadInterpolator(AnimationUtils.java:285)
位于android.view.animation.animation.setInterpolator(animation.java:391)
在android.view.animation.animation.(animation.java:255)
在android.view.animation.ScaleAnimation.(ScaleAnimation.java:63)
在android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:119)上
在android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:115)中
在android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:92)中
在android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:73)中
在com.example.someone.studyproject.AnimationActivity$4.onClick(AnimationActivity.java:61)上
在android.view.view.performClick上(view.java:4633)
在android.view.view$PerformClick.run(view.java:19330)
位于android.os.Handler.handleCallback(Handler.java:733)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:157)
位于android.app.ActivityThread.main(ActivityThread.java:5356)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1265)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
在dalvik.system.NativeStart.main(本机方法)
奇怪的是,我从来没有用xml创建过我的自定义插值器(我想用xml来做,只是为了练习一下)。 提前谢谢

现在我试着:



这不起作用-图片消失,5秒后又回来了。为什么呢?为什么图片会消失而不是调整大小?

请查看它引发的错误。“customInterpolator”不是实际的插值器。你只是从无到有地创建了那个标记。如果要修改内置的android插值器类,则必须使用这些类。例如:

customInterpolator.xml

<accelerateInterpolator
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:factor="2" />
用于Android中可用的不同类型的插值器

如果您不想使用现有的android插值器,您可以通过编程方式创建自己的插值器

cubicacceleratededellateinterpolator.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;
    }
}
public类cubicacceleratedevelorate插值器实现插值器
{
@凌驾
公共浮点(浮点t)
{
浮动x=t*2.0f;
如果(t<0.5f)
{
返回0.5f*x*x*x;
}
x=(t-0.5f)*2-1;
返回0.5f*x*x*x+1;
}
}
如您所见,您需要创建一个函数,返回时间t的0到1之间的插值值。i=f(t)

注意:如果这样做,则不能在XML中引用此插值器。您必须以编程方式创建动画

 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)
<scale
    android:fromXScale="1"
    android:toXScale="5"
android:pivotX="50%"
android:pivotY="50%"
    android:duration="3000"/>
<accelerateInterpolator
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:factor="2" />
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;
    }
}