Intereting Posts
Установка MonoDevelop / Xamarin studio 4.0.8 Gtk # версия 2.12.16 Navigator.geolocation.GetCurrentPosition throws «Ошибка последнего провайдера местоположения отключена» Просмотр изображения без упаковки Ошибка камеры 100 на .takePicture ТОЛЬКО ПОСЛЕ остановки записи видео Тесты на оборудование для Android с использованием нескольких эмуляторов Получение java.net.SocketTimeoutException: время ожидания подключения в android Android: как распознать коды MICR Прослушивание жестов в виджетах приложения Получение фейсбука для работы с эмулятором facebook android В чем разница между файлом apk в папке bin и файлом apk, созданным с помощью опции «Экспорт» в Eclipse? Чтение контактов с менеджером загрузчика Android-браузер Facebook-перенаправление не всегда запускается для URL-адреса Android cursor.moveToNext ()? Гладкая прокрутка и Fling с помощью NestedScrollView, AppBarLayout и CoordinatorLayout Как отлаживать приложение meteor / cordova с помощью железа-маршрутизатора, застрявшего на экране загрузки?

Выпуск анимации плавающей кнопки

Я играл с fab в библиотеке дизайна поддержки, когда я запустил эту проблему. Я заменил метод onCreate в шаблоне Blank Activity по умолчанию в 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, которые переводили fab на 500idks, но проблема в том, что он не работает, как предполагалось.

Когда я нажимаю на него, как правило, ничего не происходит, что странно начинать с. Вот видео о том, как это происходит.

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

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

Animation

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

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

Поэтому мое предположение – ошибка, потому что у TranslateAnimation есть (и, возможно, еще есть) некоторые ошибки, подобные этому, два .

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

Возможно, это относится к вашей проблеме: 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.

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

Держите анимацию снаружи и отправьте свое наблюдение.

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

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

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