2016-01-27 77 views
13

当我遇到这个问题时,我正在支持设计库中玩弄晶圆厂。 我取代了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和翻译由500idks晶圆厂的onLongClickListener,但问题是它不像它应该的那样工作。

当我点击它通常没有任何反应,这是奇怪的开始。这是一个video它发生。

当我长按它时,它就像我应该动画一样,但只有当我一直按下,并且每当我抬起我的手指时,无论动画是否完整,它都会回到原始位置,即使我设置了setFillEnabled(true)setFillAfter(true)

下面是当我lift我的手指,当我leave我的手指在屏幕直到最后并everything上会发生什么影片。

Animation

这究竟是为什么?

+0

我想你应该申报'FloatingActionButton fab'是一个全局变量 –

+0

@MrNeo它是没有有所作为 – Olumide

+1

我在5.1.1版本的Nexus 4上尝试了这一点。它可以按照您的预期工作,并且没有您在设置中看到的问题。 –

回答

6

我不知道为什么会出现这个动画问题,但它看起来像一个错误。我检查了你的代码,它适用于我的Android 6.0,但它不适用于搭载Android 4.4的Android模拟器(但我的问题与你的有点不同)。

所以我认为这是一个错误,因为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 4.3,4.4,5.0,6.0检查了它的Android模拟器,它工作正常。

更新

为您找到解决方案。所以,你可以使用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,in这种情况下,你可以尝试使用这个库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的问题,我会检查你是否在你的xml中设置了android:clickable =“false”,或者你是否实现了另一个OnClickListener。

+0

您提供的链接非常具有洞察力,但它无法解释为什么我一拿起手指即可播放动画。我也更新了包含所有内容的代码 – Olumide

2

我认为你必须保持anim对象作为类级变量,onLongClick()和onClick()在很多情况下以重叠方式调用。因为,你有不同的动画对象,你最终会从两个动画对象访问同一个晶圆厂。

保持动物外部并张贴您的观察。

并尝试删除onLongClick()或onClick()方法。如果可能的话,在这两种方法中添加日志以了解呼叫顺序。

我将等待您的意见。

1

您需要使用ViewPropertyAnimator,使这项工作。动画并不实际移动视图本身,只是视图的位图表示,如here所述。

3

更新:它现在假设被固定在支架的lib 24.2.0下面我已经打开了错误:https://code.google.com/p/android/issues/detail?id=215043

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

对于我们这些不够幸运,只是一个ViewPropertyAnimation我一样更换自己的动画:

此错误是因为在FloatingActionButton的支持实施具体的FloatingActionButtonEclairMr1类,其中设置动画的所有错误的视图状态,所以点击视图时会触发一个FloatingActionButtonEclairMr1.ElevateToTranslationZAnimation动画,因此您的动画将从视图中清除。

,我已经找到的是刚开始使用一些延迟动画,startOffset(因为它仍然会通过按压动画被override),但调用带有延迟动画的最简单的解决方案(我。使用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); 
     } 
    });