16

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

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

我想动画这个。如何将动画设置为滑块。

4

5 回答 5

25

我认为您只想将视图从 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);
于 2012-03-14T15:22:49.183 回答
3

在 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.在科特林

 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()
于 2018-09-17T08:26:13.197 回答
1

由于自 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"
于 2018-01-31T14:24:04.323 回答
0

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

重要的是,您定义并将过渡附加到线性布局父级,例如: llRoot.setLayoutTransition(layoutTransition)在下面的代码片段中,在 c 挂起子级的 LayoutParams 之前。

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
    }
于 2019-01-22T14:24:46.493 回答
-1

如果您想为您的布局实现滑块动画,请查看此演示

更新

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

希望它会帮助你。

如果没有,请告诉我。

谢谢。享受。:)

于 2012-03-14T05:02:40.330 回答