Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 浮动动作按钮动画_Android_Android Animation - Fatal编程技术网

Android 浮动动作按钮动画

Android 浮动动作按钮动画,android,android-animation,Android,Android Animation,当晶圆厂出现时,它将使用动画中的比例设置动画,当它隐藏时,它将使用向外缩放动画 因此,这是一个放大和缩小动画 如何制作此动画?该按钮仅使用OvershootTinterpolator从0缩放到1。应该是这样的: ScaleAnimation anim = new ScaleAnimation(0,1,0,1); anim.setFillBefore(true); anim.setFillAfter(true); anim.setFillEnabled(true); anim.setDuratio

当晶圆厂出现时,它将使用动画中的比例设置动画,当它隐藏时,它将使用向外缩放动画

因此,这是一个放大和缩小动画


如何制作此动画?

该按钮仅使用OvershootTinterpolator从0缩放到1。应该是这样的:

ScaleAnimation anim = new ScaleAnimation(0,1,0,1);
anim.setFillBefore(true);
anim.setFillAfter(true);
anim.setFillEnabled(true);
anim.setDuration(300);
anim.setInterpolator(new OvershootInterpolator());
fab.startAnimation(anim);

从@Zielony的回答中,我准确地做到了我想要的地方

下面是正确应用效果的代码

scale\u fab\u in.xml

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXScale="0"
    android:fromYScale="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1"
    android:interpolator="@android:interpolator/overshoot"/>
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="400"
    android:fromXScale="1"
    android:fromYScale="1"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0"
    android:toYScale="0"
    android:interpolator="@android:interpolator/overshoot"/>

scale\u fab\u out.xml

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXScale="0"
    android:fromYScale="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1"
    android:interpolator="@android:interpolator/overshoot"/>
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="400"
    android:fromXScale="1"
    android:fromYScale="1"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0"
    android:toYScale="0"
    android:interpolator="@android:interpolator/overshoot"/>

编辑2016年2月16日-另一种方式:

将下面的代码放在您的晶圆厂代码或任何其他视图中

//global
    private static final int FAB_ANIM_DURATION = 200;

public void hide() {
        // Only use scale animation if FAB is visible
        if (getVisibility() == View.VISIBLE) {
            // Pivots indicate where the animation begins from
            float pivotX = getPivotX() + getTranslationX();
            float pivotY = getPivotY() + getTranslationY();

            // Animate FAB shrinking
            ScaleAnimation anim = new ScaleAnimation(1, 0, 1, 0, pivotX, pivotY);
            anim.setDuration(FAB_ANIM_DURATION);
            anim.setInterpolator(getInterpolator());
            startAnimation(anim);
        }
        setVisibility(View.INVISIBLE);
    }


    public void show() {
        show(0, 0);
    }

    public void show(float translationX, float translationY) {

        // Set FAB's translation
        setTranslation(translationX, translationY);

        // Only use scale animation if FAB is hidden
        if (getVisibility() != View.VISIBLE) {
            // Pivots indicate where the animation begins from
            float pivotX = getPivotX() + translationX;
            float pivotY = getPivotY() + translationY;

            ScaleAnimation anim;
            // If pivots are 0, that means the FAB hasn't been drawn yet so just use the
            // center of the FAB
            if (pivotX == 0 || pivotY == 0) {
                anim = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
            } else {
                anim = new ScaleAnimation(0, 1, 0, 1, pivotX, pivotY);
            }

            // Animate FAB expanding
            anim.setDuration(FAB_ANIM_DURATION);
            anim.setInterpolator(getInterpolator());
            startAnimation(anim);
        }
        setVisibility(View.VISIBLE);
    }

    private void setTranslation(float translationX, float translationY) {
        if (Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1) {
            animate().setInterpolator(getInterpolator()).setDuration(FAB_ANIM_DURATION)
                    .translationX(translationX).translationY(translationY);
        }
    }

    private Interpolator getInterpolator() {
        return AnimationUtils.loadInterpolator(getContext(), R.interpolator.fab_interpolator);
    }


<item name="fab_interpolator" type="interpolator">@android:interpolator/decelerate_cubic</item>
//全局
私有静态最终整数制造动画持续时间=200;
公共空间隐藏(){
//仅当FAB可见时才使用缩放动画
if(getVisibility()==View.VISIBLE){
//枢轴指示动画从何处开始
浮点数据透视X=getPivotX()+getTranslationX();
float pivotY=getPivotY()+getTranslationY();
//使晶圆厂收缩动画化
ScaleAnimation anim=新的ScaleAnimation(1,0,1,0,pivotX,pivotY);
动画设定持续时间(制作动画持续时间);
anim.setInterpolator(getInterpolator());
startAnimation(anim);
}
设置可见性(视图不可见);
}
公开展览({
显示(0,0);
}
公共无效显示(浮动平移X、浮动平移Y){
//Set-FAB的翻译
setTranslation(translationX,translationY);
//仅在隐藏FAB时使用缩放动画
if(getVisibility()!=View.VISIBLE){
//枢轴指示动画从何处开始
float pivotX=getPivotX()+translationX;
float pivotY=getPivotY()+translationY;
尺度动画;
//如果枢轴为0,则表示尚未绘制晶圆厂,因此只需使用
//工厂中心
如果(pivotX==0 | | pivotY==0){
anim=新缩放动画(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,
动画。相对于自身,0.5f);
}否则{
anim=新的缩放动画(0,1,0,1,pivotX,pivotY);
}
//动画晶圆厂扩展
动画设定持续时间(制作动画持续时间);
anim.setInterpolator(getInterpolator());
startAnimation(anim);
}
设置可见性(View.VISIBLE);
}
私有void setTranslation(浮点translationX,浮点translationY){
如果(Build.VERSION.SDK\u INT>=VERSION\u CODES.HONEYCOMB\u MR1){
动画().setInterpolator(getInterpolator()).setDuration(制作动画持续时间)
.translationX(translationX).translationY(translationY);
}
}
私有插值器getInterpolator(){
返回AnimationUtils.loadInterpolator(getContext(),R.interpolator.fab_interpolator);
}
@android:插值/减速

对于我来说,使用
startOffset
值集时,这种缩放动画看起来更好。这对我有好处:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="400"
       android:fillBefore="true"
       android:fillAfter="true"
       android:fillEnabled="true"
       android:startOffset="500"
       android:fromXScale="0"
       android:fromYScale="0"
       android:pivotX="50%"
       android:pivotY="50%"
       android:toXScale="1"
       android:toYScale="1"
       android:interpolator="@android:interpolator/overshoot"/>

您可以使用此方法对任何视图进行动画放大。如果你对0和1进行混响,你会得到缩放动画

 public static void scale(View view, long delay) {
        view.setScaleX(0);
        view.setScaleY(0);
        view.animate()
                .scaleX(1)
                .scaleY(1)
                .setDuration(500)
                .setStartDelay(delay)
                .setInterpolator(new OvershootInterpolator())
                .start();
    }

使用以下代码可以获得相同的效果

    ScaleAnimation anim = new ScaleAnimation(0, 1, 0, 1, 50, 50);
    anim.setFillBefore(true);
    anim.setFillAfter(true);
    anim.setFillEnabled(true);
    anim.setDuration(400);
    anim.setInterpolator(new OvershootInterpolator());
    imageView.startAnimation(anim);

假设任务是设置FloatingActionButton大小调整的动画,我首先对动画进行子类化,以通常处理视图(适用于Kotlin from)

…为了专门处理FloatingActionButton,我将其子类化为ResizeAnimation(主要用于更新floating action button的customSize属性)

…用法

    val animation = FabResizeAnimation(fab, 800.0f, 100.0f, 2000)
    fab.startAnimation(animation)

这以更好的方式模拟了新材料设计规范中暴露的行为,应该向上投票(参考:)它可以工作,但是缩放动画从晶圆厂的左侧开始,而不是从中心开始进行动画,您知道如何修复它吗?您可以设置pivotX和pivotY以更改动画的中心点