[英]How to do translate animation of button in Android Studio?
我試圖將一個按鈕從一個站點移動到另一個站點。 我設法移動了它,但是當它移動時,我必須點擊它之前所在的位置而不是點擊按鈕。 為什么會發生這種情況?
這是它的樣子。 你可以看到最后當我點擊另一邊時,按鈕的陰影被激活了
我的代碼:
動畫xaml
移動.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" > <translate android:fromYDelta="0%p" android:fromXDelta="0%p" android:toXDelta="-300" android:toYDelta="-300" android:duration="500" ></translate> </set>
在代碼中:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.move);
btnNext.startAnimation(animation);
發生這種情況是因為動畫是通過更改translationX和 translationY 視圖屬性來執行的,而不是 ui 框架作者以其無窮小的智慧放置在繼承LayoutParams的外部類中的實際位置。 因此,單擊事件被分派到視圖的“原始”位置,該位置不考慮視圖轉換( 參考)。 android 中的動畫仍然相當乏味和野蠻,但至少有很多方法可以采用。 對於這種情況,LayoutParams 字段的 ValueAnimator 似乎是一個解決方案。 如果布局允許邊距,則它可能如下所示:
final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) btnNext.getLayoutParams();
int initialX = displayWidth - btnNextWidth, finalX = displayWidth / 2;
ValueAnimator.ofInt(initialX, finalX)
.setDuration(500)
.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Integer ax = (Integer) valueAnimator.getAnimatedValue();
Log.i("anim", "x: " + ax);
lp.leftMargin = ax;
btnNext.requestLayout();
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.