你可以使用animatedvectordrawable来实现此功能。在prelolipop设备上,只有在使用支持库v28或更高版本时才能正常工作。
更多详情请参考这个repos:
https://github.com/alexjlockwood/adp-delightful-details
在布局中添加:
<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" />
在Fragment或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>