Вы можете попробовать что-то вроде этого
1) создать нарисованный ресурс rectangle_curved.xml
, как показано ниже
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="#FFFFFF"/>
<corners
android:bottomRightRadius="350dp"
android:bottomLeftRadius="0dp"
android:topLeftRadius="0dp"
android:topRightRadius="350dp"/>
<stroke android:color="#50000000" android:width="2dp"/>
</shape>
2) Установите его в качестве фона view
, которыйрасширяется и разрушается.Здесь я использовал Framelayout
, который разворачивается и разворачивается
<FrameLayout
android:id="@+id/shape"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:background="@drawable/rectangle_curved"/>
3) Создайте класс для обработки анимации развертывания / сворачивания следующим образом
public class ResizeAnimation extends Animation {
private int mWidth;
private int mInitialWidth;
private View mView;
public ResizeAnimation(View view, int width) {
mView = view;
mWidth = width;
mInitialWidth = view.getWidth();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth = mInitialWidth + (int) ((mWidth - mInitialWidth) * interpolatedTime);
mView.getLayoutParams().width = newWidth;
mView.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;
}
}
4) Наконец, используйтеэто так.Создайте функцию для обработки анимации следующим образом
private void animate(View shapeView, boolean isExpand) {
int width = isExpand ? 500 : 0; // 500 is the max width in pixels , you ca change it
ResizeAnimation anim = new ResizeAnimation(shapeView, width);
anim.setDuration(500);
shape.startAnimation(anim);
}
и вызовите эту функцию следующим образом
для анимации расширения: animate(myBackgroundView, true)
для анимации свертывания: animate(myBackgroundView, false)
РЕДАКТИРОВАТЬ: в этой строке шага 4: int width = isExpand ? 500 : 0;
использовать 1 вместо 0. 0 не работает должным образом.Я не знаю почему.
private void animate(View view, boolean isExpand) {
int width = isExpand ? 200 : 1; // 200 is the max width in pixels.
//use a factor for same width on all screen size.
DisplayMetrics metrics = getResources().getDisplayMetrics();
int factor =(int) metrics.density;
ResizeAnimation anim = new ResizeAnimation(view, width * factor);
anim.setDuration(500);
view.startAnimation(anim);
}