以编程方式翻译查看Pre-Honeycomb

Jak*_*ton 48 android android-layout

如何在不使用动画(android.view.animation.*)的情况下以编程方式转换任意视图?

API 11介绍setTranslationXsetTranslationY,setXsetY,和getMatrix-所有这些都可以用来实现什么我要找的.但是,我似乎无法找到先前API级别的等效项.

android.view.animation.TranslateAnimationgetMatrix在实现中的用途(早在API 4),但它始终是一个私有API.

有没有办法在不诉诸反思的情况下实现这一目标?

Dev*_*red 14

被收藏是因为我希望在这个问题上被证明是错误的,但是在我做一些Drag-n-Drop调查时我遇到了类似的问题.

我敢肯定,你坚持offsetTopAndBottom()offsetLeftAndRight()用于移动View周围没有早期的API的动画.这里的一大缺点是这些方法实际上修改了顶部/底部/左/右值,因此如果你想回到起点,你必须做一些非常重的跟踪.

另一种选择是简单地使用TranslateAnimation非常短的持续时间并设置为fillAfter......

其他选项需要子类化,仍然不漂亮,像翻译CanvasView借鉴.这里的问题是你还必须创建一个不剪切它的子节点的父节点,以便视图可以在其自己的边界之外绘制.

  • 这是一个糟糕的情况.具有讽刺意味的是,我实际上试图通过Honeycomb API(http://nineoldandroids.com)来动画这些视图的翻译.我希望直接在库中提供类型的兼容性实现以进行蜂窝前的翻译,这样使用该库的人就不必在他们自己的代码中使用特殊情况.我按照你的说法尝试了偏移方法,但很难跟踪原始位置并可靠地预先设置关键帧位置.反思看起来越来越好...... (6认同)

Gri*_*hka 11

是的,您可以使用TranslateAnimation.将fillAfter设置为true后,即使动画结束,您的视图也会保持翻译状态.这是一个例子:

TranslateAnimation anim=new TranslateAnimation(0, 0, 20, 20);
anim.setFillAfter(true);
anim.setDuration(0);
yourView.startAnimation(anim);
Run Code Online (Sandbox Code Playgroud)


Mat*_*ino 6

Grishka的回答帮了我很多忙,效果很好.为了使用带有nineoldandroids的Honeycomb API为转换设置动画,我为转换值设置了FloatEvaluator,然后在Honeycomb +或TranslateAnimation方法上使用setTranslationX.这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)