当前位置: 首页 > 知识库问答 >
问题:

如何用XML定义特定屏幕大小的动画

杜嘉慕
2023-03-14

我的动画:

<?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个答案

薛扬
2023-03-14

关于SO的现有答案建议将FrameLayout子类化...

如果您想使用ObjectAnimator,您别无选择,只能对要动画的视图进行子类化。您需要为ObjectAnimator提供必要的getter和setter方法才能发挥其作用,因为它实际上只是调用这些getter和setter方法来执行动画

您要链接到的问题(动画片段之间的转换)是对FrameLayout进行子类化,以添加setxfraction()getxfraction()方法。它们的实现方式是相对于FrameLayout的宽度设置x值。只有这样,ObjectAnimator才能执行除绝对值之间的动画之外的任何其他操作。

对于ObjectAnimator,没有办法实现这一点。ObjectAnimators只需从开始值到结束值进行插值。正如我在上面所解释的,setter方法定义了实际发生的事情。

例如,调用一个返回宽度的自定义函数就可以了,或者定义一个代码可以设置的常量,让代码将该常量设置为等于屏幕宽度,然后从xml访问该常量也同样有用。

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

<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate android:fromYDelta="-100%" android:toYDelta="0%" android:duration="1000"/>
</set>
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down);
view.startAnimation(animation);

我意识到这可能对你没有任何帮助。在某些情况下,必须使用ObjectAnimators而不能使用视图动画。但是,只要你能够使用视图动画,这应该可以很好地解决你的问题。

  • 链接到文档
  • 相关问题

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

    null

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

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

由于屏幕的宽度/高度因设备而异,因此每个设备都需要不同的动画。只有视图动画提供了一种解决方法,因为它们允许您定义分数而不是绝对值。在任何其他情况下,您都需要以编程方式定义动画。幸运的是,ObjectAnimators:

Animator animator = ObjectAnimator.ofFloat(view, View.X, startValue, endValue);
animator.start(); 
Animator animator = ObjectAnimator.ofFloat(view, View.X, -view.getWidth(), 0.0f);
animator.start();
view.animate().x(targetValue);

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

但是请不要误解我的意思,您仍然应该在参考资料中尽可能多地定义--无论是动画还是其他任何东西。应该尽可能避免硬编码动画或任何其他值,除非像您的情况那样是必要的。

所以总结一下:

    null
 类似资料:
  • 问题内容: Bootstrap 3在响应实用程序中具有不错的CSS类,使我可以根据屏幕分辨率隐藏或显示一些块 我在CSS文件中有一些要根据屏幕分辨率应用或不应用的样式规则。 我该怎么做? 我打算将所有CSS文件最小化到生产部署中的一个,但是如果没有其他解决方案,而没有针对不同屏幕分辨率的单独CSS文件,则可以避免这种情况。 问题答案: 使用查询。他们服务于这个确切的目的。以下是它们如何工作的示例:

  • 我是swift和Xcode新手,我想知道是否有人愿意向我解释,我应该如何让我的启动屏幕显示3秒钟,然后在这段时间内稍微淡出? 我想做一个我以前构建的网页的web视图,但希望它在启动屏幕之前淡出。 我已经阅读了所有其他与该主题相关的问题,但我不理解它们。我也一直在关注一些关于这个主题的教程,但什么都没有。 有人吗,拜托?

  • 我刚刚开始熟悉Jetpack Compose,据我所知,NavHost就像NavHostFragment,它托管不同的组件而不是片段。 我很难理解的是,如果我定义一个带有脚手架和NavHost的屏幕作为其内容,例如: 这使得底部导航栏和脚手架中定义的所有内容都显示在由导航主机承载的每个可组合组件上。如果我想为不同的屏幕设置不同的浮动操作按钮,该怎么办?我是否必须为这些屏幕启动一个新的活动,并在那里

  • 问题内容: 该文档是非常难学...... 有没有谁可以教我怎么一组孩子的任何一个Views到有类似的“权重”? 现在看来,所有内容都放在了左侧, 我已经尝试了很多次,但仍然无法像每个屏幕一样将其变成屏幕宽度的一半。 编辑:我不知道当所有的小孩都可以做些什么… …即使我想以特定的尺寸设置一些图像,此类也可以帮助我做ImageView ....它无法正常运行,我错过了一些设置吗?!? 问题答案: 注意

  • 调整屏幕的亮度 导航至 Settings(设定)应用程式,找到并轻触 Display(显示)。 轻触Adjust brightness(调节屏幕亮度)。 选择并轻触所需的亮度。 您可以通过调暗手表屏幕的亮度来延长电池的使用寿命。 打开/关闭 Always-on screen(保持启用屏幕) 您可选择是否想让屏幕暗淡地显示时间,或未使用手表时将屏幕完全关闭。 通过 M600 更改设定 导航至设置应用

  • 我第一次使用swing API来获得我的win应用程序的屏幕分辨率。 如何设置目前的屏幕大小在Java摆动?