gpt4 book ai didi

android - 如何在 XML 中定义特定于屏幕尺寸的动画

转载 作者:行者123 更新时间:2023-12-04 02:50:25 25 4
gpt4 key购买 nike

我创建了一个 AnimationFragments在我的应用程序中。 Animation在选项卡之间移动动画,为此我需要动画当前 Fragment在需要时完全移出屏幕 Fragment从对面滑入。有点像 Animation ViewPager使用。

我需要指定 View 的绝对开始和结束位置并且由于不同的设备具有不同的尺寸,我无法定义 Animation适合所有设备的 XML 格式。在更大的设备上 View可能无法完全滑动屏幕,而在较小的设备上,View当他已经离开屏幕时,移动到很多并继续移动。

所以我想我的问题是:如何在 XML 中定义一个动画来滑动 Fragment屏幕外同时适合所有设备?

我的动画:

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

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="x"
android:valueType="floatType"
android:valueTo="720"
android:valueFrom="0"
android:duration="300"/>

</set>

最佳答案

1)关于赏金:

Existing answers on SO suggest subclassing the FrameLayout...



如果您想使用 ObjectAnimator您别无选择,只能对 View 进行子类化你想要动画。您需要提供 ObjectAnimator使用必要的 getter 和 setter 方法来发挥它的魔力,因为它本质上只是调用这些 getter 和 setter 方法来执行 Animation .

您链接到的问题 ( Animate the transition between fragments ) 是子类化 FrameLayout添加 setXFraction()和一个 getXFraction()方法。它们的实现方式是设置相对于 FrameLayout 宽度的 x 值。 .只有这样才能 ObjectAnimator除了在绝对值之间设置动画之外,还可以做任何其他事情。

总而言之, ObjectAnimator它本身实际上并没有做太多动画,它只是通过反射调用 getter 和 setter 方法。

Is there really no way to get the actual screen pixel dimensions (not just dp) into the xml file?



ObjectAnimator没有办法做到这一点。 ObjectAnimators只需从起始值插入到结束值。正如我上面解释的,setter 方法定义了实际发生的事情。

For example, calling a custom function that returns the width would be fine, or defining a constant that code can set, having code set said constant to equal the screen width, then accessing that constant from the xml would be equally useful.



您不能将代码中的任何值插入到任何 xml 资源中。 xml 文件中包含的所有内容在构建时都会编译到您的 APK 中, 不能 在运行时更改。这也是您的另一个问题的答案:在包含当前屏幕大小的 xml 中没有可访问的资源或常量或任何内容。动态值(如安装应用程序的设备的屏幕大小)不能成为这些资源的一部分,因为在您构建应用程序时,其中的所有内容都已编译到您的应用程序中。

2)可能的解决方案:查看动画

一种可能的解决方案是使用 View 动画而不是 ObjectAnimator .使用 View 动画,您可以指定分数而不是绝对值:
<set xmlns:android="http://schemas.android.com/apk/res/android">  
<translate android:fromYDelta="-100%" android:toYDelta="0%" android:duration="1000"/>
</set>

这将为 View 设置动画来自 -100%0%屏幕高度。换句话说,从整个屏幕到 View 的位置.你可以这样使用它:
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down);
view.startAnimation(animation);

我意识到这可能对您没有任何帮助。有些情况下必须使用 ObjectAnimators并且不能使用 View 动画。但是只要您能够使用 View 动画,这应该几乎可以解决您的问题。
  • Link todocumentation
  • Related question


  • 3) 最佳实践

    我们真正应该在这里解决的是我认为你的误解。正如您已经注意到的,您在 xml 中定义的每个动画都有绝对的开始和结束值。这些值是静态的,在编译您的应用程序后无法更改。

    如果您查看资源如何与许多可用选择器以及 dp, sp... 一起工作,那么您将意识到它旨在做一件事:
    例如,您可以定义一个移动 View 的动画。按 100dp。 Dp 是物理尺寸的度量,100dp 将与具有任何像素密度的任何屏幕完全相同的物理尺寸。通过选择器,您可以为屏幕较小或较大的设备更改此动画,其中动画可能会移动 View太多或太少。但是您只能填写静态值。除了使用选择器之外,您无法为每个设备自定义动画。

    所以你看,这些资源实际上只是为任何静态和不变的东西设计的。它适用于尺寸或字符串转换,但有时使用动画可能会有点痛苦。正如我上面所说,只有 View 动画通过提供指定分数而不是绝对值的选项来提供一种绕过静态性质的方法。但一般来说,你不能在 xml 中定义任何动态的东西。

    为了进一步证实这一论点,请看谷歌关于动画的优秀 DevBytes 视频:
  • View Animations
  • Custom Activity Animations
  • Cardflip Animation
  • Property Animations
  • ListView Animations

  • 然后您会注意到在这些示例中没有一个动画是在 xml 中定义的。当然,有人可能会争辩说他们没有在 xml 中定义它们,因为他们希望更轻松地解释和显示代码,但在我看来,这再次证明了一点:

    您不能在依赖于纯动态值的静态资源中定义动画

    由于屏幕宽度/高度因设备而异,您需要为每个设备设置不同的动画。只有 View 动画提供了一种解决方法,因为它们允许您定义分数而不是绝对值。在任何其他情况下,您都需要以编程方式定义动画。幸运的是,这对 ObjectAnimators 来说并不困难:
    Animator animator = ObjectAnimator.ofFloat(view, View.X, startValue, endValue);
    animator.start();

    这将为 View 的 x 位置设置动画从开始到结束的像素值。您可以传入 View 的宽度像您想要的那样对其进行动画处理:
    Animator animator = ObjectAnimator.ofFloat(view, View.X, -view.getWidth(), 0.0f);
    animator.start();

    这将使 View 动画化从左侧滑入。它完全在屏幕外开始并在其最终位置停止。你也可以这样做:
    view.animate().x(targetValue);

    这将使 View 动画化从其当前 x 位置到目标 x 值。

    但是请不要误解我,您仍然应该尝试在资源中尽可能多地定义 - 无论是动画还是其他任何东西。应尽可能避免硬编码动画或任何其他值,除非在您的情况下有必要。

    4) 总结

    所以总结一下:
  • 你不能做你想做的事 ObjectAnimators无需将您需要的 getter 和 setter 方法添加到 View你想要动画。
  • 如果可能,请使用 view animations .使用它们,您可以根据 View 的宽度或高度的分数定义动画。 .
  • 如果上述方法不起作用或不适用于您的情况,则定义动画 programmatically ,这在任何情况下都有效。

  • 希望我能帮到你,如果你有任何进一步的问题,请随时提出!

    关于android - 如何在 XML 中定义特定于屏幕尺寸的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15881555/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com