如何在 tab/fragment 转换之间为新的浮动操作按钮设置动画?
How can I animate the new Floating Action Button between tab/fragment transition?
从新的 Design Support Library 开始,我想设置浮动操作按钮 (FAB) 的动画,使其随着片段或选项卡的更改而收缩和展开。
我尝试了一段时间的几种过渡,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。
在ViewPager.OnPageChangeListener()
中,我将根据onPageScrolled()
方法的偏移量使用btn.setScaleY()
和btn.setScaleX()
。
在你的Activity
class中,在你的ViewPager
中添加addOnPageChangeListener
。见下文:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
private int state = 0;
private boolean isFloatButtonHidden = false;
private int position = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (isFloatButtonHidden == false && state == 1 && positionOffset != 0.0) {
isFloatButtonHidden = true;
//hide floating action button
swappingAway();
}
}
@Override
public void onPageSelected(int position) {
//reset floating
this.position = position;
if (state == 2) {
//have end in selected tab
isFloatButtonHidden = false;
selectedTabs(position);
}
}
@Override
public void onPageScrollStateChanged(int state) {
//state 0 = nothing happen, state 1 = begining scrolling, state 2 = stop at selected tab.
this.state = state;
if (state == 0) {
isFloatButtonHidden = false;
} else if (state == 2 && isFloatButtonHidden) {
//this only happen if user is swapping but swap back to current tab (cancel to change tab)
selectedTabs(position);
}
}
});
在您的私有方法中,您可以在那里执行自定义任务。
private void swappingAway()
{
floatingActionButton.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_down);
floatingActionButton.startAnimation(animation);
}
private void selectedTabs(int tab)
{
floatingActionButton.show();
//a bit animation of popping up.
floatingActionButton.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_up);
floatingActionButton.startAnimation(animation);
//you can do more task. for example, change color for each tabs, or custom action for each tabs.
}
我有意不使用 hide()
和 show()
,因为它有错误,当您交换并立即返回时。
这是 pop_down 和 pop_up
的动画
pop_down.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.0"
android:toYScale="0.0"
android:duration="100"
android:pivotX="50%"
android:pivotY="50%"
android:shareInterpolator="true"
android:fillAfter="true">
</scale>
pop_up.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0"
android:duration="500"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="200"
android:interpolator="@android:anim/bounce_interpolator"
android:shareInterpolator="true"
android:fillAfter="true">
</scale>
最简单的方法:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_IDLE:
switch (viewPager.getCurrentItem()) {
case 0: {
fab.setImageResource(R.drawable.your_drawable);
fab.show();
break;
}
case 1: {
fab.setImageResource(R.drawable.your_another_drawable);
fab.show();
break;
}
}
break;
case ViewPager.SCROLL_STATE_DRAGGING:
case ViewPager.SCROLL_STATE_SETTLING:
fab.hide();
break;
}
重要提示:要提高绘图性能,请尝试使用 .svg 格式或减小 png 的大小。
从新的 Design Support Library 开始,我想设置浮动操作按钮 (FAB) 的动画,使其随着片段或选项卡的更改而收缩和展开。
我尝试了一段时间的几种过渡,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。
在ViewPager.OnPageChangeListener()
中,我将根据onPageScrolled()
方法的偏移量使用btn.setScaleY()
和btn.setScaleX()
。
在你的Activity
class中,在你的ViewPager
中添加addOnPageChangeListener
。见下文:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
private int state = 0;
private boolean isFloatButtonHidden = false;
private int position = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (isFloatButtonHidden == false && state == 1 && positionOffset != 0.0) {
isFloatButtonHidden = true;
//hide floating action button
swappingAway();
}
}
@Override
public void onPageSelected(int position) {
//reset floating
this.position = position;
if (state == 2) {
//have end in selected tab
isFloatButtonHidden = false;
selectedTabs(position);
}
}
@Override
public void onPageScrollStateChanged(int state) {
//state 0 = nothing happen, state 1 = begining scrolling, state 2 = stop at selected tab.
this.state = state;
if (state == 0) {
isFloatButtonHidden = false;
} else if (state == 2 && isFloatButtonHidden) {
//this only happen if user is swapping but swap back to current tab (cancel to change tab)
selectedTabs(position);
}
}
});
在您的私有方法中,您可以在那里执行自定义任务。
private void swappingAway()
{
floatingActionButton.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_down);
floatingActionButton.startAnimation(animation);
}
private void selectedTabs(int tab)
{
floatingActionButton.show();
//a bit animation of popping up.
floatingActionButton.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_up);
floatingActionButton.startAnimation(animation);
//you can do more task. for example, change color for each tabs, or custom action for each tabs.
}
我有意不使用 hide()
和 show()
,因为它有错误,当您交换并立即返回时。
这是 pop_down 和 pop_up
的动画pop_down.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.0"
android:toYScale="0.0"
android:duration="100"
android:pivotX="50%"
android:pivotY="50%"
android:shareInterpolator="true"
android:fillAfter="true">
</scale>
pop_up.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0"
android:duration="500"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="200"
android:interpolator="@android:anim/bounce_interpolator"
android:shareInterpolator="true"
android:fillAfter="true">
</scale>
最简单的方法:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_IDLE:
switch (viewPager.getCurrentItem()) {
case 0: {
fab.setImageResource(R.drawable.your_drawable);
fab.show();
break;
}
case 1: {
fab.setImageResource(R.drawable.your_another_drawable);
fab.show();
break;
}
}
break;
case ViewPager.SCROLL_STATE_DRAGGING:
case ViewPager.SCROLL_STATE_SETTLING:
fab.hide();
break;
}
重要提示:要提高绘图性能,请尝试使用 .svg 格式或减小 png 的大小。