在 LinearLayout 中更改 LayoutParams 的动画

Posted

技术标签:

【中文标题】在 LinearLayout 中更改 LayoutParams 的动画【英文标题】:Animation in changing LayoutParams in LinearLayout 【发布时间】: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 是的,我需要补充滑块动画。 【参考方案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_
        android:layout_
        android:animateLayoutChanges="true"
        android:orientation="vertical">

        <android.support.v7.widget.AppCompatEditText
            android:id="@+id/editText"
            android:layout_
            android:layout_ />
    </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

希望对你有所帮助。

如果没有,请告诉我。

谢谢。 享受。 :)

【讨论】:

以上是关于在 LinearLayout 中更改 LayoutParams 的动画的主要内容,如果未能解决你的问题,请参考以下文章

LinearLayout

LinearLayout布局

android:radiobutton的大小可以更改,你是怎么实现的

LinearLayout布局下android:layout_weight用法

Android中LinearLayout或ListView的android:layout_width="wrap_content"如何限制最高高度

寒假学干货之------LinearLayout.layout.weight