【发布时间】:2015-09-27 23:06:14
【问题描述】:
从新的Design Support Library 开始,我想为浮动操作按钮 (FAB) 设置动画,使其随着片段或选项卡的变化而收缩和扩展。
我尝试了几种过渡方式,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。
【问题讨论】:
标签: android floating-action-button
从新的Design Support Library 开始,我想为浮动操作按钮 (FAB) 设置动画,使其随着片段或选项卡的变化而收缩和扩展。
我尝试了几种过渡方式,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。
【问题讨论】:
标签: android floating-action-button
在ViewPager.OnPageChangeListener() 中,我将使用btn.setScaleY() 和btn.setScaleX(),具体取决于onPageScrolled() 方法的偏移量。
【讨论】:
在Activity 类中,在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 的大小。
【讨论】: