繁体   English   中英

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

[英]Programmatically Translate View Pre-Honeycomb

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

API 11引入了setTranslationXsetTranslationYsetXsetY ,以及getMatrix -all,它们可以用来完成我正在寻找的东西。 但是,我似乎无法找到先前API级别的等效项。

android.view.animation.TranslateAnimation在其实现中使用了getMatrix (早在API 4),但它始终是一个私有API。

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

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

我很确定你会遇到offsetTopAndBottom()offsetLeftAndRight()因为在早期API中没有动画的情况下移动View 这里的一大缺点是这些方法实际上修改了顶部/底部/左/右值,因此如果你想回到起点,你必须做一些非常重的跟踪。

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

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

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

TranslateAnimation anim=new TranslateAnimation(0, 0, 20, 20);
anim.setFillAfter(true);
anim.setDuration(0);
yourView.startAnimation(anim);

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

}

我遇到了同样的问题。 我能够通过操纵我想翻译的视图的layoutparams,特别是边距来实现翻译。 您可以使用负值btw的负值。

TranslateAnimation的一个替代方法是将View子类化并在dispatchDraw上翻译Canvas。 就像是:

 public class TranslateView extends View {

        private float mTranslationX = 0;
        private float mTranslationY = 0;
        private boolean mWillUseSDKTranslation = true;

        @Override
        protected void dispatchDraw(final Canvas canvas) {
            if (mWillUseSDKTranslation == false) {
                // keep track of the current state
                canvas.save(Canvas.MATRIX_SAVE_FLAG);
                // translate
                canvas.translate(mTranslationX, mTranslationY);
                // draw it
                super.dispatchDraw(canvas);
                // restore to the previous state
                canvas.restore();
            } else {
                super.dispatchDraw(canvas);
            }
        }

        public void setTranslationValue(final float aTranslationX, final float aTranslationY) {
            if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
                mWillUseSDKTranslation = false;
                mTranslationX = aTranslationX;
                mTranslationY = aTranslationY;
                invalidate();
            } else {
                setTranslationX(aTranslationX);
                setTranslationY(aTranslationY);
            }
        }

    }

我找到的解决方法是使用以下方法设置负边距:

layoutParams.setMargins(left, top, right, bottom);
yourView.setLayoutParams(layoutParams);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM