【问题标题】:Animation in changing LayoutParams in LinearLayout在 LinearLayout 中更改 LayoutParams 的动画
【发布时间】:2012-03-30 13:25:11
【问题描述】:

在我的应用中有一个具有 0 布局高度的 LinearLayout。当我单击按钮时,此布局高度应为 LayoutParams.WRAP_CONTENT。这是我在 onclicklistner 中使用的代码。

LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
slider.setLayoutParams(lp);

我想对此进行动画处理。如何将动画设置为滑块。

【问题讨论】:

  • 你想要滑块上的动画吗?
  • @NixitPatel:你想实现滑块动画???
  • @iDroid Explorer 是的,我需要补充滑块动画。

标签: android android-layout android-animation layoutparams


【解决方案1】:

我认为您只想将视图从 0 高度设置为最终高度,您可以使用自定义动画来做到这一点:

public class ShowAnim extends Animation {
    int targetHeight;
    View view;

    public ShowAnim(View view, int targetHeight) {
        this.view = view;
        this.targetHeight = targetHeight;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        view.getLayoutParams().height = (int) (targetHeight * interpolatedTime);
        view.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }

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

并在您的代码中执行此操作以启动动画:

Animation ani = new ShowAnim(headerView, 100/* target layout height */);
ani.setDuration(2000/* animation time */);
headerView.startAnimation(ani);

【讨论】:

  • 如果它每次都从零高度开始,你如何做到这一点?如果我以 100 的目标布局高度执行此操作,然后以 200 的目标布局时间再次执行此操作,我希望它从 0 -> 100 到 100 -> 200。
  • 如果你想从 100 -> 200,那么只需将这一行 view.getLayoutParams().height = (int) (targetHeight * interpolatedTime); 修改为 view.getLayoutParams().height = initialHeight /*100 in your case*/ + (int) (targetHeight/*200 in your case*/-initialHeight * interpolatedTime); 之类的东西
  • 有一点不起作用的是initialHeight为0时什么都没有发生。视觉上完全没有变化。
  • 您之前的回复也有1个问题。操作顺序不正确。您必须在 targetHeight - initialHeight 周围加上括号,以便在之后应用 * interpolatedTime
  • 这只是一个快速的psudo代码来开始工作,请根据自己的需要进行调整
【解决方案2】:

在 java 或 kotlin 中使用 animateLayoutChanges xml 和 enableTransitionType

1.将 animateLayoutChanges 添加到根布局 xml

    <LinearLayout
        android:id="@+id/mainLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true"
        android:orientation="vertical">

        <android.support.v7.widget.AppCompatEditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="0dp" />
    </LinearLayout>

2。在java中

LayoutTransition layoutTransition = mainLinearLayout.layoutTransition;
layoutTransition.setDuration(5000); // Change duration
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);

editText.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; // you can set number, example: 300

editText.requestLayout();

3.in kotlin

 val layoutTransition = mainLinearLayout.layoutTransition
 layoutTransition.setDuration(5000) // Change duration
 layoutTransition.enableTransitionType(LayoutTransition.CHANGING)

 editText.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT // you can set number, example: 300 

 editText.requestLayout()

【讨论】:

    【解决方案3】:

    自从 JELLYBEAN 以来我们在 android 中就有了布局转换,我们可以使用它而不是使用动画对象。

    下面的文章详细解释了它。 https://proandroiddev.com/the-little-secret-of-android-animatelayoutchanges-e4caab2fddec

    简而言之,我们只需要这段代码 -

    tView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
    tView.setLayoutParams(lp);
    

    这里 lp 是布局参数

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams
                                (RelativeLayout.LayoutParams.MATCH_PARENT, newHeight);
    

    要添加的另一件事是将布局文件中的这一行添加到将进行转换的布局中。

    android:animateLayoutChanges="true"
    

    【讨论】:

      【解决方案4】:

      要对线性布局及其子布局的布局参数进行动画更改,您可以使用 LayoutTransition

      在 c 挂起子级的 LayoutParams 之前,在下面的代码 sn-p 中定义并附加到线性布局父级的过渡非常重要。

      LayoutTransition的支持高于Android JellyBean

         private var AnimationDuration = 1100f
      
      
          @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
          private fun fadeOutControls() {
              var layoutTransition = LayoutTransition()
              layoutTransition.setDuration(AnimationDuration.toLong()) // Change duration
      
              layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
              layoutTransition.addTransitionListener(object : LayoutTransition.TransitionListener {
                  override fun startTransition(transition: LayoutTransition, container: ViewGroup, view: View, transitionType: Int) {
      
                  }
      
                  @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                  override fun endTransition(transition: LayoutTransition, container: ViewGroup, view: View, transitionType: Int) {
                      //Change this line of code to below one
                      transition.disableTransitionType(LayoutTransition.CHANGING)
                  }
              })
      
              // set transition to Linear layout
              llRoot.setLayoutTransition(layoutTransition)
      
      
               // change Layout params of child now to animate Transition
              val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
              lp.weight = 10f
              mediaRoot.setLayoutParams(lp)
      
              leftControl.visibility = View.GONE
              rightControl.visibility = View.GONE
          }
      

      【讨论】:

        【解决方案5】:

        如果您想为您的布局实现滑块动画,请参阅this demo

        更新

        另见http://www.inter-fuser.com/2009/07/android-transistions-slide-in-and-slide.html

        希望对你有所帮助。

        如果没有,请告诉我。

        谢谢。 享受。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-09
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-04
          相关资源
          最近更新 更多