3

我有一个Animation导致视图向右滑出屏幕的结果,这与以下代码按预期工作:

Animation outtoRight = new TranslateAnimation(
         Animation.RELATIVE_TO_SELF,  0.0f, Animation.RELATIVE_TO_SELF,  +1.0f,
         Animation.RELATIVE_TO_SELF,  0.0f, Animation.RELATIVE_TO_SELF,   0.0f
        );
outtoRight.setDuration(500);
outtoRight.setInterpolator(new AccelerateInterpolator());
outtoRight.setFillAfter(true);

这意味着我应用此动画的视图将漂亮地滑出屏幕。当然,我有一个相反的滑入。但我的问题是,我怎样才能将视图移出屏幕,这样我就可以在不应用此动画的情况下将其滑入至少一次?

我玩过负边距等,但我似乎找不到合适的属性让我的视图在启动时不在屏幕上。

澄清一下,我可以从另一个动画开始时完美地隐藏它,但我可以看到它消失了,即使它只有几分之一秒。一定有办法让它一开始就不在那里,然后让我把它滑进去。

4

5 回答 5

4

我不是动画专家,但我会试一试:)

这是我正在使用的动画,它从右侧滑入一个视图

EnterByRight.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
    <translate android:fromXDelta="100%" android:toXDelta="0%"
      android:fromYDelta="0%" android:toYDelta="0%"
     android:duration="400"/>
   </set>

就我而言,我正在为 xml 中定义的 TableLayout 设置动画。当我希望它滑入时:

Animation animationEnterByRight = AnimationUtils.loadAnimation(this, R.anim.animationentrancebyright);
tableLayout.startAnimation(animationEnterByRight);

它来自屏幕外,我不需要先将它放在外面,动画会为我处理。如果您想在视图加载后立即对其进行动画处理,这可以正常工作。

如果你需要让你的视图“不可见”一段时间,然后显示动画我想不出除了 View.Visible 和 View.Gone 之外的任何解决方案。但我不明白为什么这是一个问题?

干杯!

于 2012-05-29T12:31:49.007 回答
3

一个可能的解决方案(考虑到这个问题的受欢迎程度非常低)可能是我目前正在使用的解决方案,即使我根本不喜欢它。我已经使视图具有可见性View.GONE并应用了使其向右移动的动画。

然后,第一次(我控制它是第一次在视图上带有标签)我将可见性设置为View.VISIBLE并将动画应用到滑入。这可以按预期工作,没有故障和跳跃,但我仍然担心影响一次向许多元素添加动画与性能相关。

于 2012-05-25T08:10:47.537 回答
2

其实你自己的答案一点也不差。我唯一要更改的不是设置您查看可行性,GONE而是使用addChild().

在单独的线程中执行,在单独的线程中添加动画,并且只addChild()在主线程上调用。

一般来说,你应该在分开的线程上进行初始化过程,这样UI线程不会受到影响,如果超过0.4秒你应该开始播放至少0.5秒的加载动画。这是我可以告诉你的最好的 UI 实践,我在我的应用程序中做到了,效果很好!

于 2012-05-29T19:28:33.147 回答
1

你能试试outtoRight.setFillBefore(false);吗?

于 2012-05-25T02:23:40.897 回答
1

您可以使用 PreDrawListner() 在绘制之前设置视图在屏幕外的位置,然后为其运行滑入动画。

yourview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
        public boolean onPreDraw() {
            yourview.getViewTreeObserver().removeOnPreDrawListener(this);
            yourview.setTranslationX(something that will take it out of the screen, depends on padding);
            yourview.runIntroAnimation();
            return false;
       }
};
于 2015-03-05T22:30:00.327 回答