簡體   English   中英

浮動動作按鈕動畫問題

[英]Floating Action Button animation Issue

當我運行此問題時,我正在支持設計庫中使用fab。 我在Android Studio的默認空白活動模板中替換了onCreate方法,這就是它的樣子:

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.animation.TranslateAnimation;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500);
                anim.setDuration(1000);
                anim.setFillEnabled(true);
                anim.setFillAfter(true);
                fab.startAnimation(anim);
            }
        });
        fab.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500);
                anim.setDuration(1000);
                anim.setFillEnabled(true);
                anim.setFillAfter(true);
                fab.startAnimation(anim);
                return true;
            }
        });
    }
}

基本上,我添加了一個onClickListener和一個onLongClickListener,它將fab翻譯為500idks,但問題是它不能像它應該的那樣工作。

當我點擊它時,通常沒有任何反應,這一切都很奇怪。 這是一個正在發生的視頻

當我長按它時,它會像我應該的那樣動畫,但只有當我持續按下時,每當我抬起手指時,無論動畫是否完整,它都會回到原始位置,即使我設置了setFillEnabled(true)setFillAfter(true)

以下是當我抬起手指以及當我手指放在屏幕上直到最后和所有事情時會發生什么的視頻。

Animation

為什么會這樣?

我不知道為什么你會遇到這個動畫問題,但它看起來像一個bug。 我檢查了你的代碼並且它適用於我的Android 6.0,但它不適用於安裝了Android 4.4的Android模擬器(但我的問題與你的有點不同)。

所以,我的假設是錯誤的,因為TranslateAnimation了(也許還是有)一些錯誤這樣的一個2

我的建議是如何避免接下來的。 使用ViewPropertyAnimator為視圖設置動畫。 在這種情況下,您的代碼應如下所示:

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fab.animate()
                    .translationX(-500)
                    .translationY(-500)
                    .setDuration(1000)
                    .start();
        }
    });
    fab.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            fab.animate()
                    .translationX(-500)
                    .translationY(-500)
                    .setDuration(1000)
                    .start();
            return true;
        }
    });

我在Android模擬器上使用Android 4.3,4.4,5.0,6.0進行了檢查,它運行正常。

更新

為您找到解決方案。 因此,您可以使用支持庫中的ViewPropertyAnimatorCompat ,您的代碼類似於:

fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
            ViewCompat.animate(fab)
                    .translationX(-500)
                    .translationY(-500)
                    .setDuration(1000)
                    .start();
    }
});
fab.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
            ViewCompat.animate(fab)
                    .translationX(-500)
                    .translationY(-500)
                    .setDuration(1000)
                    .start();
        return true;
    }
});

更新 :現在假設在我打開的錯誤后修復了支持lib 24.2.0: https//code.google.com/p/android/issues/detail? id = 215043

==============

對於我們這些不夠幸運的人來說,用我這樣的ViewPropertyAnimation替換他們的動畫:

出現此錯誤的原因是FloatingActionButton的支持實現中存在一個錯誤,特別是在FloatingActionButtonEclairMr1類中,其中將動畫設置為所有視圖狀態,因此在單擊視圖時會觸發一個FloatingActionButtonEclairMr1.ElevateToTranslationZAnimation動畫,因此您的動畫將從風景。

我找到的最簡單的解決方案是啟動你的動畫有一些延遲, 不是startOffset (因為它仍然會被按下的動畫覆蓋)但是延遲調用動畫(我使用100,但也檢查60,它工作.20是不夠的):

    final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //Probably want to do it just for pre Lolipop
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500);
                    anim.setDuration(1000);
                    anim.setFillEnabled(true);
                    anim.setFillAfter(true);
                    fab.startAnimation(anim);
                }
            }, 100);
        }
    });
    fab.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500);
                    anim.setDuration(1000);
                    anim.setFillEnabled(true);
                    anim.setFillAfter(true);
                    fab.startAnimation(anim);
                }
            }, 100);
        }
    });

我認為你必須將anim對象保持為類級別變量,onLongClick()和onClick()在許多情況下以重疊方式被調用。 因為,你有不同的動畫對象,你最終會從兩個動畫對象訪問同一個fab。

請保持在外面的動畫並發布您的觀察結果。

並嘗試刪除onLongClick()或onClick()方法。 如果可能的話,在這兩個方法中添加log以理解調用順序。

我會等你的觀察。

也許這涉及到你的問題: SO-Thread

我正在使用AnimatorListener在完成動畫后設置視圖的位置。

.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // set Position
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

我只看到你的代碼的摘錄。 對於onClickListener的問題,我會檢查你是否在你的xml中設置了android:clickable =“false”,或者你是否已經實現了另一個OnClickListener。

您需要使用ViewPropertyAnimator來完成這項工作。 動畫不實際移動視圖本身,只是視圖的位圖表示,作為描述在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM