java - 如何使用Animation类获得流畅的动画效果?

标签 java android animation

我有以下类来向上滑动 FrameLayout。它基本上降低了 View 的高度。它的效果非常好,但唯一的问题是动画的流畅度并不能令我满意。它提供 10 FPS。

SlideUpDownAnimation.java

package anim;

import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class SlideUpDownAnimation extends Animation {
private static final String TAG = "ANIMATION";
private View view;
private boolean isUp;
private int startHeight;
private int finalHeight;
private int difference;

public SlideUpDownAnimation(View view, boolean isUp, int finalHeight) {
    this.view = view;
    this.isUp = isUp;
    this.startHeight = view.getMeasuredHeight();
    this.finalHeight = finalHeight;
    this.difference = this.finalHeight - view.getLayoutParams().height;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    int newHeight;

    // daha yüksek bir değerden azalarak ilerliyor demektir.
    if (!isUp) {
        newHeight = (int) (this.difference * (1 - interpolatedTime));
        view.getLayoutParams()
                .height = newHeight;
    } else {
        newHeight = (int) (this.startHeight - (this.difference * interpolatedTime));
        view.getLayoutParams()
                .height = newHeight;
    }

    Log.i(TAG, "Start height: " + this.startHeight + " New height: " + newHeight + " interpolated time: " + interpolatedTime);

    view.requestLayout();
}
}

我将持续时间设置为 1000 毫秒。这是我的日志:

06-28 17:48:21.876 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 800 interpolated time: 0.0
06-28 17:48:21.876 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 800 interpolated time: 0.0
06-28 17:48:22.006 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 777 interpolated time: 0.061846644
06-28 17:48:22.116 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 739 interpolated time: 0.16699407
06-28 17:48:22.236 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 679 interpolated time: 0.33210987
06-28 17:48:22.356 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 613 interpolated time: 0.51570535
06-28 17:48:22.476 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 547 interpolated time: 0.6971313
06-28 17:48:22.591 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 493 interpolated time: 0.8468266
06-28 17:48:22.716 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 453 interpolated time: 0.9569855
06-28 17:48:22.831 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 438 interpolated time: 0.99944496
06-28 17:48:22.961 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 438 interpolated time: 1.0
06-28 17:48:23.076 13403-13403/com.menulux.menu I/ANIMATION: Start height: 800 New height: 438 interpolated time: 1.0

最佳答案

您可以使用 view.animate().translationY(distance); 将 View 向下滑动一段距离

然后使用以下命令将其滑回原始位置:view.animate().translationY(0);

您还可以进行一些有趣的组合,例如:

// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);

// Start the animation
view.animate()
    .translationY(view.getHeight())
    .alpha(1.0f);

它将按照其高度向下滑动,然后消失。

您也可以将该 View 淡出回其原始位置。

使用AnimatorListener,您也可以在动画完成后将view设置为“消失”。

此处引用:Show hide view with animation

如果您想走 XML 路线。这也可能是一个不错的选择:

  <?xml version="1.0" encoding="utf-8"?>

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="100%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toYDelta="0%" />

可以更改这些增量以获得不同的效果/方向

关于java - 如何使用Animation类获得流畅的动画效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806095/

相关文章:

java - 未生成 key 哈希

Android:从现有 URI 保存文件

android - 无法使用 Ionic 2 框架安装 cordova 相机插件

CSS 背景缩放动画在鼠标移出时跳转

java - 以奇数序列打印奇数

Java 8 条件 .map() (或带有恒等函数的映射)

java - 在 Enum 类中存储值的 Map 集合以便更好地访问

java - Java Boolean对象中的值赋值会导致内存重新分配吗

iphone - 如何停止 UIScrollView 调用 drawRect : on sublayers that go in/out of the visible region?

javascript - 如何为网站的所有 3 个维度制作 3D block 动画