以编程方式翻译视图前蜂窝

如何以编程方式翻译任意视图而不使用animation( android.view.animation.* )?

API 11引入了setTranslationXsetTranslationYsetXsetY ,以及getMatrix – 所有这些都可以用来完成我正在寻找的东西。 但是,我似乎无法在先前的API级别上find相同的结果。

android.view.animation.TranslateAnimation在其实现中使用getMatrix (早在API 4中),但是在这个时候它是一个私有的API。

有没有办法做到这一点,而不诉诸反思?

我喜欢这个,因为我希望在这个问题上被certificate是错误的,但是当我做一些拖放调查的时候,我遇到了类似的问题。

我敢肯定,在早期的API中,如果在没有animation的情况下移动View ,你会被offsetTopAndBottom()offsetLeftAndRight()卡住。 这里最大的缺点就是这些方法实际上修改了顶部/底部/左侧/右侧的值,所以如果你想回到你开始的地方,你必须做一些相当大的跟踪。

另一种select是简单地使用一个非常短的TranslateAnimation并设置为fillAfter

其他选项需要子类化,而且还不够漂亮,就像翻译View画的Canvas一样。 这里的问题是你还必须创build一个父母,不剪辑它的孩子,所以视图可以绘制在自己的范围之外。

是的,你可以使用TranslateAnimation。 将fillAfter设置为true后,即使在animation结束之后,您的视图也将保持翻译。 这里是一个例子:

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

格里希卡的回答帮了我很多,完美地工作。 为了使用具有nineoldandroids的Honeycomb API对翻译进行animation处理,我为翻译值设置了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; } } 

我遇到了同样的问题。 我能够通过操纵我想要翻译的视图的布局图,特别是边距来实现翻译。 您可以使用负值边缘顺便说一句。

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

你也可以试试这个代码: https : //github.com/BeyondAR/beyondar/blob/development/android/BeyondAR_Framework/src/com/beyondar/android/view/CustomLayout.java

使用setPosition方法。

我发现一个解决方法是设置负边距使用:

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