You can do this using animatedvectordrawable. On prelolipop devices this works only if you using support lib v28 or above
for more details see this repos: https://github.com/alexjlockwood/adp-delightful-details
In layout add:
<ImageView android:id="@+id/expandcollapse" android:layout_width="128dp" android:layout_height="128dp" android:layout_margin="4dp" android:contentDescription="@null" android:scaleType="fitCenter" app:srcCompat="@drawable/asl_checkable_expandcollapse" />
In Fragment or in Activity
expandCollapseView.setOnClickListener(v -> { final int[] stateSet = {android.R.attr.state_checked * (isChecked ? 1 : -1)}; expandCollapseView.setImageState(stateSet, true); });
asl_checkable_expandcollapse.xml
<?xml version="1.0" encoding="utf-8"?> <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/expanded" android:drawable="@drawable/vd_checkable_expandcollapse_expanded" android:state_checked="true"/> <item android:id="@+id/collapsed" android:drawable="@drawable/vd_checkable_expandcollapse_collapsed"/> <transition android:drawable="@drawable/avd_checkable_expandcollapse_collapsed_to_expanded" android:fromId="@id/collapsed" android:toId="@id/expanded"/> <transition android:drawable="@drawable/avd_checkable_expandcollapse_expanded_to_collapsed" android:fromId="@id/expanded" android:toId="@id/collapsed"/> </animated-selector>
vd_checkable_expandcollapse_expanded.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:tint="?attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24"> <group android:name="chevron" android:translateX="12" android:translateY="9"> <group android:name="leftBar" android:rotation="135"> <group android:translateY="-3"> <path android:fillColor="@android:color/white" android:pathData="@string/path_pathmorph_expandcollapse"/> </group> </group> <group android:name="rightBar" android:rotation="45"> <group android:translateY="3"> <path android:fillColor="@android:color/white" android:pathData="@string/path_pathmorph_expandcollapse"/> </group> </group> </group> </vector>
vd_checkable_expandcollapse_collapsed.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:tint="?attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24"> <group android:name="chevron" android:translateX="12" android:translateY="15"> <group android:name="leftBar" android:rotation="135"> <group android:translateY="3"> <path android:fillColor="@android:color/white" android:pathData="@string/path_pathmorph_expandcollapse"/> </group> </group> <group android:name="rightBar" android:rotation="45"> <group android:translateY="-3"> <path android:fillColor="@android:color/white" android:pathData="@string/path_pathmorph_expandcollapse"/> </group> </group> </group> </vector>
avd_checkable_expandcollapse_collapsed_to_expanded.xml
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" android:drawable="@drawable/vd_checkable_expandcollapse_collapsed"> <target android:name="chevron"> <aapt:attr name="android:animation"> <objectAnimator android:duration="250" android:interpolator="@android:interpolator/fast_out_slow_in" android:propertyName="translateY" android:valueFrom="15" android:valueTo="9"/> </aapt:attr> </target> <target android:name="leftBar"> <aapt:attr name="android:animation"> <objectAnimator android:duration="200" android:interpolator="@interpolator/pathmorph_expandcollapse" android:propertyName="rotation" android:valueFrom="135" android:valueTo="45" android:valueType="floatType"/> </aapt:attr> </target> <target android:name="rightBar"> <aapt:attr name="android:animation"> <objectAnimator android:duration="200" android:interpolator="@interpolator/pathmorph_expandcollapse" android:propertyName="rotation" android:valueFrom="45" android:valueTo="135" android:valueType="floatType"/> </aapt:attr> </target> </animated-vector>
avd_checkable_expandcollapse_expanded_to_collapsed.xml
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" android:drawable="@drawable/vd_checkable_expandcollapse_expanded"> <target android:name="chevron"> <aapt:attr name="android:animation"> <objectAnimator android:duration="250" android:interpolator="@android:interpolator/fast_out_slow_in" android:propertyName="translateY" android:valueFrom="9" android:valueTo="15"/> </aapt:attr> </target> <target android:name="leftBar"> <aapt:attr name="android:animation"> <objectAnimator android:duration="200" android:interpolator="@interpolator/pathmorph_expandcollapse" android:propertyName="rotation" android:valueFrom="135" android:valueTo="45" android:valueType="floatType"/> </aapt:attr> </target> <target android:name="rightBar"> <aapt:attr name="android:animation"> <objectAnimator android:duration="200" android:interpolator="@interpolator/pathmorph_expandcollapse" android:propertyName="rotation" android:valueFrom="45" android:valueTo="135" android:valueType="floatType"/> </aapt:attr> </target> </animated-vector>