【问题标题】:Slidedown and slideup layout with animation带有动画的下滑和上滑布局
【发布时间】:2014-07-18 12:28:54
【问题描述】:

当我按下按钮时,如何使用 slideUp 在中心显示布局,然后再次按下以隐藏...在 ANDROID 中的 slideDown

帮帮我,谢谢

【问题讨论】:

标签: android animation slidedown slideup


【解决方案1】:

在res/anim文件夹下创建两个动画xml

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
    android:duration="1000"
    android:fromYDelta="0"
    android:toYDelta="100%" />
</set>

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
    android:duration="1000"
    android:fromYDelta="100%"
    android:toYDelta="0" />
</set>

像下面的代码一样加载动画并根据您的要求在需要时启动动画

//Load animation 
Animation slide_down = AnimationUtils.loadAnimation(getApplicationContext(),
            R.anim.slide_down);

Animation slide_up = AnimationUtils.loadAnimation(getApplicationContext(),
            R.anim.slide_up);

// Start animation
linear_layout.startAnimation(slide_down); 

【讨论】:

  • linar_layout 应该有什么高度和/或可见度?我尝试过“GONE”,但视图从未显示。我已将高度设置为 0dp,并且它永远不会向下滑动。您错过了有关如何最初“隐藏”视图的整个部分。
  • @lostintranslation 您可以在调用开始动画之前添加一个动画监听器,然后您可以在显示时在 onAnimationStart 处可见,在隐藏时在 onAnimationEnd 处不可见
  • 你能解释一下我们如何使用插值器来加速/减速在最后获得反弹或其他什么吗?
  • 最初向上滑动不起作用。一旦 slide_down 只能向上滑动。不知道为什么?
  • 在 andorid 4.4.2 中不工作。但在其他设备上工作
【解决方案2】:

这对我不起作用,我想喜欢 jquery slideUp / slideDown 功能,我尝试了这段代码,但它只会在动画结束后将内容移动到同一位置,视图应该有 0dp 高度在 slideDown 的开始和动画结束后的视图高度(带有 wrap_content)。

【讨论】:

  • 这只是一个布局动画。它实际上并没有将项目移动到布局中的不同位置。你需要对象动画师。如果您希望视图在动画之后消失或可见,只需在动画之前或之后设置视图的可见性。
【解决方案3】:

我使用这些简单的功能,它像 jquery slideUp slideDown 一样工作,在帮助类中使用它,只需传递您的视图:

public static void expand(final View v) {
    v.measure(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
    final int targetHeight = v.getMeasuredHeight();

    // Older versions of android (pre API 21) cancel animations for views with a height of 0.
    v.getLayoutParams().height = 1;
    v.setVisibility(View.VISIBLE);
    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            v.getLayoutParams().height = interpolatedTime == 1
                    ? WindowManager.LayoutParams.WRAP_CONTENT
                    : (int)(targetHeight * interpolatedTime);
            v.requestLayout();
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int) (targetHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

public static void collapse(final View v) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 1){
                v.setVisibility(View.GONE);
            }else{
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

【讨论】:

  • 干得好!关闭的视图也会相应地进行动画处理
  • 库代码的绝佳解决方案(不是带有资源 xml 文件的应用程序)
【解决方案4】:

我正在开发的应用程序中有类似的要求。而且,我发现了一个第三方库,它可以在 Android 中进行上滑、下滑和右滑。

更多详情请参考链接:https://github.com/mancj/SlideUp-Android

设置库(根据要求从其 Github 页面的自述文件部分复制):

获取 SlideUp 库

将 JitPack 存储库添加到您的构建文件中。将其添加到存储库末尾的根 build.gradle 中:

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
    maven { url "https://maven.google.com" } // or google() in AS 3.0
  }
}

添加依赖项(在模块 gradle 中)

dependencies {
    compile 'com.github.mancj:SlideUp-Android:2.2.1'
    compile 'ru.ztrap:RxSlideUp2:2.x.x' //optional, for reactive listeners based on RxJava-2
    compile 'ru.ztrap:RxSlideUp:1.x.x' //optional, for reactive listeners based on RxJava
}

要将 SlideUp 添加到您的项目中,请执行以下三个简单步骤:

第 1 步:

创建任何类型的布局

<LinearLayout
  android:id="@+id/slideView"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>

第 2 步:

在您的活动/片段中找到该视图

View slideView = findViewById(R.id.slideView);

第 3 步:

创建一个 SlideUp 对象并传入你的视图

slideUp = new SlideUpBuilder(slideView)
                .withStartState(SlideUp.State.HIDDEN)
                .withStartGravity(Gravity.BOTTOM)

                //.withSlideFromOtherView(anotherView)
                //.withGesturesEnabled()
                //.withHideSoftInputWhenDisplayed()
                //.withInterpolator()
                //.withAutoSlideDuration()
                //.withLoggingEnabled()
                //.withTouchableAreaPx()
                //.withTouchableAreaDp()
                //.withListeners()
                //.withSavedState()
                .build();

您也可以参考链接上的示例项目。我发现它很有用。

【讨论】:

  • 您还应该输入 OP 应该使用的代码,而不是仅仅引用一个链接...
【解决方案5】:

上述方法有效,但这里有更逼真的从屏幕顶部向上和向下滑动的动画。

只需在anim文件夹下创建这两个动画

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="200"
        android:fromYDelta="-100%"
        android:toYDelta="0" />
</set> 

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="-100%" />
</set>

像这样在java类中加载动画

imageView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.slide_up));
imageView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.slide_down));

【讨论】:

    【解决方案6】:

    来自 JAVA 文件:使用此方法。

        public class ViewAnimatorSlideUpDown {
    
        public static void slideDown(final View view) {
            if (view != null) {
                view.setVisibility(View.VISIBLE);
                ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                layoutParams.height = 1;
                view.setLayoutParams(layoutParams);
    
                view.measure(View.MeasureSpec.makeMeasureSpec(Resources.getSystem().getDisplayMetrics().widthPixels,
                        View.MeasureSpec.EXACTLY),
                        View.MeasureSpec.makeMeasureSpec(0,
                                View.MeasureSpec.UNSPECIFIED));
    
                final int height = view.getMeasuredHeight();
                ValueAnimator valueAnimator = ObjectAnimator.ofInt(1, height);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        int value = (int) animation.getAnimatedValue();
                        if (height > value) {
                            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                            layoutParams.height = value;
                            view.setLayoutParams(layoutParams);
                        } else {
                            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                            layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
                            view.setLayoutParams(layoutParams);
                        }
                    }
                });
                valueAnimator.start();
            }
        }
    
    
        public static void slideUp(final View view) {
            if (view != null) {
                view.post(new Runnable() {
                    @Override
                    public void run() {
                        final int height = view.getHeight();
                        ValueAnimator valueAnimator = ObjectAnimator.ofInt(height, 1);
                        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator animation) {
                                int value = (int) animation.getAnimatedValue();
                                if (value > 0) {
                                    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                                    layoutParams.height = value;
                                    view.setLayoutParams(layoutParams);
                                } else {
                                    view.setVisibility(View.GONE);
                                }
                            }
                        });
                        valueAnimator.start();
                    }
                });
            }
        }
    }
    

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

    并将其用于 Java 文件 ex.

          if (binding.llTheme.getVisibility() == View.GONE) {
                ViewAnimatorSlideUpDown.slideDown(binding.llTheme);
                binding.llTheme.setVisibility(View.VISIBLE);
    
            } else {
                binding.llTheme.setVisibility(View.GONE);
                ViewAnimatorSlideUpDown.slideUp(binding.llTheme);
            }
    

    完成。 ☻♥坚持下去。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2015-06-27
      • 2020-03-24
      相关资源
      最近更新 更多