[英]Programmatically Translate View Pre-Honeycomb
如何在不使用动画的情况下以编程方式翻译任意视图( android.view.animation.*
)?
API 11引入了setTranslationX
和setTranslationY
, setX
和setY
,以及getMatrix
-all,它们可以用来完成我正在寻找的东西。 但是,我似乎无法找到先前API级别的等效项。
android.view.animation.TranslateAnimation
在其实现中使用了getMatrix
(早在API 4),但它始终是一个私有API。
有没有办法在不诉诸反思的情况下实现这一目标?
被收藏是因为我希望在这个问题上被证明是错误的,但是在我做一些Drag-n-Drop调查时我遇到了类似的问题。
我很确定你会遇到offsetTopAndBottom()
和offsetLeftAndRight()
因为在早期API中没有动画的情况下移动View
。 这里的一大缺点是这些方法实际上修改了顶部/底部/左/右值,因此如果你想回到起点,你必须做一些非常重的跟踪。
另一种选择是简单地使用具有非常短的持续时间的TranslateAnimation
并设置为fillAfter
...
其他选项需要子类化,并且仍然不漂亮,比如翻译View
的Canvas
。 这里的问题是你还必须创建一个不剪切它的子节点的父节点,以便视图可以在其自己的边界之外绘制。
是的,您可以使用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);
}
}
}
您也可以尝试以下代码: 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.