2012-05-24 44 views
3

我有一个Animation导致滑出屏幕的右侧视图的视图初始状态,这是工作与下面的代码预期:Android的动画 -

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

我不是动画专家,但我给它一个镜头:)

这是我使用的动画,它的幻灯片从右侧

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之外的任何解决方案。但我不明白为什么会出现这个问题?

干杯!

1

你可以试试outtoRight.setFillBefore(false);

+0

试过了,事情是,我需要第三个动画只是把它放在屏幕上开始,这似乎有点奇怪。 –

3

一个可能的解决方案(考虑到这个问题真的很少受欢迎)可以是我目前使用的解决方案,尽管我根本不喜欢它。我已经制作了一个可见度为View.GONE的视图,并应用使它向右移动的动画。

然后,第一次(我控制这是第一次在视图上有一个标签)我设置了View.VISIBLE的可见性,并应用动画来滑入。这个按预期工作,没有毛刺和跳跃,但我是仍然关注将动画添加到许多与演出相关的元素的意义。

2

其实你自己的答案一点也不差。我唯一需要改变的不是将您的生存能力设置为GONE,而是使用addChild()手动创建和添加它。

在分离线程中添加动画,在分离线程中添加动画,并且只在主线程上调用addChild()

一般来说,你应该在分开的线程上执行init进程,这样UI线程就不会受到影响,如果它需要超过0.4秒,你应该开始播放加载动画至少0.5秒。这是我可以告诉你的最好的用户界面实践,我在我的应用程序中完成了它,它非常棒!

+0

我喜欢+1 :) –

+0

@Juan然后去试试吧;) –

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