带有 xml 的 Android 自定义插值器

标签 android xml interpolation

我尝试按照 android API GUIdes 制作我的自定义插值器。 这就是插值器。

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

但是当我尝试在动画中使用它时:

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

什么也没有发生 - View 只是自行刷新。这是为什么 ? 为什么如果我尝试以这种方式使用 is:

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

抛出一个异常:

 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)

这很奇怪,我从来没有用 xml 创建自定义插值器(我想用 xml 来做只是为了练习)。 提前致谢。

现在我尝试:

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

这不起作用 - 图片消失并在 5 秒后恢复。这是为什么 ?为什么图片消失而不是调整大小?

最佳答案

查看它抛出的错误。 “customInterpolator”不是实际的插值器。您刚刚从无到有创建了该标签。如果你想修改它们,你必须使用内置的 android 插值器类。例如:

customInterpolator.xml

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

看看this link适用于 Android 中可用的不同类型的插值器。

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

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

如您所见,您需要创建一个函数,返回时间 t 的 0 和 1 之间的插值值。 i = f(t)

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

关于带有 xml 的 Android 自定义插值器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111289/

相关文章:

java - 带有空 xml 文档的 Jdom2 解析器

algorithm - 在 1-DOF 质量 Spring 系统中实现半隐式后向欧拉

python - 字符串插值导致 MysqlDB 错误

android - 异步任务中的 toast

android - Android Studio 上用于 NDK 的新实验性 Gradle 中的 preBuild 依赖项

android - 当我单击标题栏上的后退箭头而不是转到上一个面板时,它会退出应用程序吗?

xml - 如何从 XML 获取所有叶元素的 xpath?

xml - 使用 xslt 编码层次结构问题 xslt v1 将 xml 转换为 xml

vector - 通过距离单位而不是 THREE.js 中的因子对 2 Vector3 进行线性插值

android - 如何通过 ListView 和刷新 ListView 从 SQLite 数据库中删除一行?