如何在不使用动画(android.view.animation.*)的情况下以编程方式转换任意视图?
API11介绍了setTranslationX和setTranslationY,setX和setY,以及getMatrix-all,它们可以用来实现我正在寻找的东西。然而,在以前的API级别上,我似乎找不到等效的API。
android.view.animation.TranslateAnimation在其实现中使用getMatrix (早在API4中),但在这段时间内它始终是私有的。
有没有办法在不求助于反思的情况下做到这一点?
发布于 2012-01-05 05:22:38
因为我希望在这一点上被证明是错误的,所以我很受欢迎,但不久前我在做一些拖放调查时遇到了类似的问题。
我敢肯定,在早期的API中,由于在没有动画的情况下移动View,你会被offsetTopAndBottom()和offsetLeftAndRight()卡住。这里最大的缺点是这些方法实际上修改了top/bottom/left/right的值,所以如果你想回到开始的地方,你必须做一些相当繁重的跟踪。
另一种选择是简单地使用一个持续时间非常短的TranslateAnimation,并设置为fillAfter...
其他选项需要子类化,而且仍然不是很好,比如翻译View所使用的Canvas。这里的问题是,您还必须创建一个不裁剪它的子级的父级,以便视图可以在自己的边界之外绘制。
发布于 2012-01-05 05:21:17
可以,您可以使用TranslateAnimation。将fillAfter设置为true时,即使在动画结束后,视图仍将保持平移。下面是一个示例:
TranslateAnimation anim=new TranslateAnimation(0, 0, 20, 20);
anim.setFillAfter(true);
anim.setDuration(0);
yourView.startAnimation(anim);发布于 2012-07-31 12:39:28
Grishka的回答对我帮助很大,效果很好。为了在nineoldandroids中使用Honeycomb API来实现翻译动画,我为翻译值设置了一个FloatEvaluator,然后在Honeycomb+上使用setTranslationX或者使用TranslateAnimation方法。下面是我的代码:
public class TranslationXEvaluator extends FloatEvaluator {
private View view;
public TranslationXEvaluator(View view) {
this.view = view;
}
@Override
public Float evaluate(float fraction, Number startValue, Number endValue) {
float translationX = super.evaluate(fraction, startValue, endValue);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
view.setTranslationX(translationX);
} else {
TranslateAnimation anim = new TranslateAnimation(translationX, translationX, 0, 0);
anim.setFillAfter(true);
anim.setDuration(0);
view.startAnimation(anim);
}
return translationX;
}
}https://stackoverflow.com/questions/8734001
复制相似问题