2016-01-27 5 views
13

Я играл с fab в библиотеке дизайна поддержки, когда я запускал эту проблему. я заменил OnCreate метода в шаблоне по умолчанию Blank активности в Android Studio, это то, что он выглядит следующим образом:Анимация с плавающей кнопкой Действие №

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, преобразующий ФАБ по 500idks, но проблема заключается в том, что он не работает, как предполагалось.

Когда я нажимаю на него, обычно ничего не происходит, что странно начинать с. Вот это video.

Когда я долго нажимаю на него, он оживляет, как я должен, но только если я продолжаю нажимать, и всякий раз, когда я поднимаю палец, он возвращается в исходное положение независимо от того, завершена ли анимация или нет, хотя я установил setFillEnabled(true) и setFillAfter(true).

Вот видео о том, что происходит, когда я lift мой палец и когда я leave мой палец на экране до конца и everything.

Animation

Почему это происходит?

+0

Я думаю, вы должны объявить 'FloatingActionButton fab' является глобальным переменными –

+0

@MrNeo это не делало разницы – Olumide

+1

I пробовал это на Nexus 4, в версии 5.1.1. Он работает так, как вы ожидали, и у вас нет проблем, которые вы видите при настройке. –

ответ

6

Я не знаю, почему вы получаете эту проблему с анимацией, но она выглядит как ошибка. Я проверил ваш код, и он работает на моем Android 6.0, но он не работает на Android Emulator с Android 4.4 на борту (но мой вопрос немного отличается от вашего).

Так что мое предположение это ошибка, потому что TranslateAnimation имел (и, возможно, еще) некоторые ошибки, подобные этому one, two.

И мое предложение, как вы можете избежать этого, следующее. Используйте 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 и она отлично работает.

Update

Найдено решение для Вас. Таким образом, вы можете использовать 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; 
    } 
}); 
+0

Yeah ViewPropertyAnimator также работает на моем устройстве, но мне хотелось, чтобы что-то работало с api 11, а ViewPropertyAnimator было представлено в 12. Я также выгляжу так, что вы можете быть прав насчет ошибки – Olumide

+0

@Olumide, в в этом случае вы можете попробовать использовать эту библиотеку https://github.com/JakeWharton/NineOldAndroids –

+0

@Olumide, нашел решение для вас, см. мой обновленный ответ –

1

Может быть, это относится к вашей проблеме: 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 я проверил бы, если вы установили android: clickable = "false" внутри вашего xml или если вы внедрили еще один OnClickListener.

+0

Ссылка, которую вы предоставили, была проницательной, но она, однако, не объясняет, почему анимация, как только я поднимаю палец. Я также обновил код, чтобы включить все. – Olumide

2

Я думаю, что вы должны держать объект anim в качестве переменной уровня класса, во многих случаях onLongClick() и onClick() вызывается во многих случаях перекрывающимся образом. Поскольку у вас разные объекты-объекты, вы получаете доступ к одной и той же фабрике из двух объектов-аниматоров.

Храните анимацию снаружи и отправляйте свое наблюдение.

и попробуйте удалить методы onLongClick() или onClick(). если возможно, добавьте журнал этих двух методов, чтобы понять последовательность вызовов.

Я буду ждать ваших наблюдений.

1

Вы должны использовать ViewPropertyAnimator, чтобы сделать эту работу. Анимация фактически не перемещает представление, а просто растровое представление представления, как описано here.

3

Update: это теперь, должно быть зафиксировано в поддержку 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); 
     } 
    }); 
Смежные вопросы