我有一个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);
这意味着我应用此动画的视图将漂亮地滑出屏幕。我当然有滑动的对立面。但我的问题是,我怎样才能将视图从屏幕上移开,这样我就可以将其滑入而不至少将此动画应用到屏幕上一次?
我玩过负边距等等,但我似乎无法找到合适的属性让我的视图在发布时不在屏幕上。
为了澄清,我可以在另一个动画的开头完美地隐藏它,但我可以看到它消失,即使它只有一秒钟。必须有一种方法让它在开始时不在那里,并允许我在之后滑入它。
答案 0 :(得分: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);
它来自屏幕之外,我不需要先把它放在外面,动画会为我照顾它。如果您希望在视图加载后立即为其添加动画,则此方法可以正常工作。
如果你需要保持自己的观点&#34; invisble&#34;在一段时间内,然后显示动画我不能考虑除View.Visible和View.Gone之外的任何解决方案。但我不明白为什么会出现问题?
干杯!
答案 1 :(得分:3)
一个可能的解决方案(考虑到这个问题真的很少受欢迎)可以是我正在使用的那个,即使我根本不喜欢它。我已经让视图具有View.GONE
的可见性,并应用使其向右移动的动画。
然后,第一次(我是第一次用视图上的标签控制它)我将可见性设置为View.VISIBLE
并应用动画进行滑动。这可以正常工作而不会出现毛刺和跳跃,但是我仍然担心将动画添加到与性能相关的许多元素中的含义。
答案 2 :(得分:2)
实际上你自己的答案一点也不差。我唯一要做的就是不将您的查看能力设置为GONE
,而是使用addChild()
手动创建和添加。{/ p>
在分离的线程中执行,在分离的线程中添加动画,并且仅在主线程上调用addChild()
。
通常,您应该对分离的线程执行init进程,因此UI线程不会受影响,如果超过0.4秒,您应该开始播放加载动画至少0.5秒。这是我能告诉你的最好的UI练习,我在我的应用程序中做到了,它的工作很棒!
答案 3 :(得分:1)
你能试试outtoRight.setFillBefore(false);
吗?
答案 4 :(得分: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;
}
};