【问题标题】:How to slide a view in and out in android如何在android中滑入和滑出视图
【发布时间】:2014-09-25 02:33:26
【问题描述】:

我正在尝试制作一个视图(带有一些按钮的线性视图 - R.id.playerControl 根据活动中其他事件的上下文滑入和滑出。

为此,我有一个selectMediaItem 方法,当用户分别选择或取消选择一个项目时,它应该显示或隐藏视图。

我是 android 动画的新手,我无法让它工作有两个原因:

  1. 视图在动画时间之外仍保留在屏幕上,因此当它完成滑出时它会跳回 - 然后当请求滑入时它会跳出并滑回。

  2. 当视图消失时,屏幕上有一个永久的黑色空间。我希望视图在可见时填充空间,而在不可见时为GONE。为此,我希望布局也随着动画的变化而变化,这样它看起来就会把其他东西推开。

我的代码:

protected void selectMediaItem( ItemHandle item ) {

    if (item != null) {
        if (toPlay == null) {
            View playerControl = findViewById(R.id.playerControl);
            Animation slideInAdmination = AnimationUtils.loadAnimation(this, R.anim.slide_in);
            playerControl.startAnimation(slideInAdmination);
        }
    }
    else {
        if (toPlay != null) {
            View playerControl = findViewById(R.id.playerControl);
            Animation slideInAdmination = AnimationUtils.loadAnimation(this, R.anim.slide_out);
            playerControl.startAnimation(slideInAdmination);
        }
    }
    toPlay = item;
}

slide_in.xml

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


</set>

有没有一种简单的方法可以将视图滑入到位并再次滑出?

【问题讨论】:

    标签: java android android-animation


    【解决方案1】:

    我强烈建议您使用Property Animations。您的示例代码将是这样的。

    mSlidInAnimator = ObjectAnimator.ofFloat(mSlidingView, "translationY", 0);
    mSlidInAnimator.setDuration(200);
    mSlidInAnimator.start();
    
    mSlidOutAnimator = ObjectAnimator.ofFloat(mSlidingView, "translationY", newPosOfView);
    mSlidOutAnimator.setDuration(200);
    mSlidOutAnimator.start();
    

    “translationY”表示向上/向下动画。对左右动画使用“translationX”。

    这里的 newPosOfView 将是相对于您的默认视图位置的位置。例如,如果您想将视图向下移动 50dp,则它将是 50dp(以像素为单位)。在 slideInAnimator 中,pos 为 0,因为您要移动到视图的原始位置。

    仔细阅读文档,很有帮助。

    【讨论】:

    • 虽然这是一个替代解决方案,我尊重它,但它不是原始问题的答案。根据 google 文档,我们应该可以使用 View Animation。它没有被弃用,所以应该有这个问题的答案。
    • 我不太确定我是否遵循您的逻辑。 “能够使用它”和“能够将它用于……”是两个微妙不同的陈述。你有没有看到说明它应该满足这些要求的东西?
    【解决方案2】:

    你需要添加:

    slideInAdmination.setFillerAfter(true)
    

    在您致电startAnimation() 之前。这会导致视图在动画结束后保持在其新位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多