Expand/collapse animation in CardView

前端 未结 2 1550
时光取名叫无心
时光取名叫无心 2020-12-13 21:15

I try to do something like this :

I managed to do my cardViewAdapter but I block to enlarge my cards. I resumed the code of this response (Here the name of the cla

相关标签:
2条回答
  • 2020-12-13 21:52

    You'll need to create a custom class that extends CardView. Inside that class put the following methods:

    public void expand() {
        int initialHeight = getHeight();
    
        measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        int targetHeight = getMeasuredHeight();
    
        int distanceToExpand = targetHeight - initialHeight;
    
        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                if (interpolatedTime == 1){
                    // Do this after expanded
                }
    
                getLayoutParams().height = (int) (initialHeight + (distanceToExpand * interpolatedTime));
                requestLayout();
            }
    
            @Override
            public boolean willChangeBounds() {
                return true;
            }
        };
    
        a.setDuration((long) distanceToExpand);
        startAnimation(a);
    }
    
    public void collapse(int collapsedHeight) {
        int initialHeight = getMeasuredHeight();
    
        int distanceToCollapse = (int) (initialHeight - collapsedHeight);
    
        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                if (interpolatedTime == 1){
                    // Do this after collapsed
                }
    
    
                Log.i(TAG, "Collapse | InterpolatedTime = " + interpolatedTime);
    
                getLayoutParams().height = (int) (initialHeight - (distanceToCollapse * interpolatedTime));
                requestLayout();
            }
    
            @Override
            public boolean willChangeBounds() {
                return true;
            }
        };
    
        a.setDuration((long) distanceToCollapse);
        startAnimation(a);
    }
    

    Note that when you collapse it, you'll need to pass along the height you want it to be when collapsed. The height when expanded is set to WRAP_CONTENT.

    I've also added if/else statements that will run when the animation has completed.

    Good luck!

    0 讨论(0)
  • 2020-12-13 22:04

    I did not understand what you meant by displaying 10 elements out of 50. However, you can achieve the expand/collapse simply by showing/hiding the views and providing android:animateLayoutChanges="true" into the child layout of the CardView. Here is an example:

    <android.support.v7.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:padding="16dp"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"/>
    
            <TextView
                android:id="@+id/hello2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:visibility="gone"/>
    
            <TextView
                android:id="@+id/hello3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:visibility="gone"/>
    
        </LinearLayout>
    </android.support.v7.widget.CardView>
    

    And corresponding controller:

        TextView t1 = (TextView) findViewById(R.id.hello);
        final TextView t2 = (TextView) findViewById(R.id.hello2);
        final TextView t3 = (TextView) findViewById(R.id.hello3);
    
        t1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (t2.getVisibility() == View.GONE) {
                    t2.setVisibility(View.VISIBLE);
                    t3.setVisibility(View.VISIBLE);
                } else {
                    t2.setVisibility(View.GONE);
                    t3.setVisibility(View.GONE);
                }
            }
        });
    

    Tapping on the first TextView will collapse and expand the CardView along with the animation.

    0 讨论(0)
提交回复
热议问题