Изменение размеров макетов программным способом (как анимация)
Я хочу изменить размеры макетов в своей работе.
Вот код основного XML:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/top"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:background="#3ee3e3" >
</LinearLayout>
<LinearLayout
android:id="@+id/middle"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
</LinearLayout>
<LinearLayout
android:id="@+id/bottom"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:background="#fe51e6" >
</LinearLayout>
</LinearLayout>
Как вы можете видеть, верхняя и нижняя высота макета равна 0, а средняя
макет охватывает все места.
Я хочу программно уменьшить средний размер макета, а также увеличить верхнюю
и размеры нижнего макета, пока все макеты не будут иметь одинаковую высоту.
Я хочу, чтобы это выглядело как анимация.
Как мне это сделать?
Спасибо
Ответы
Ответ 1
Я написал ResizeAnimation для аналогичной цели. Это просто, но дорого.
/**
* an animation for resizing the view.
*/
public class ResizeAnimation extends Animation {
private View mView;
private float mToHeight;
private float mFromHeight;
private float mToWidth;
private float mFromWidth;
public ResizeAnimation(View v, float fromWidth, float fromHeight, float toWidth, float toHeight) {
mToHeight = toHeight;
mToWidth = toWidth;
mFromHeight = fromHeight;
mFromWidth = fromWidth;
mView = v;
setDuration(300);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
float height =
(mToHeight - mFromHeight) * interpolatedTime + mFromHeight;
float width = (mToWidth - mFromWidth) * interpolatedTime + mFromWidth;
LayoutParams p = mView.getLayoutParams();
p.height = (int) height;
p.width = (int) width;
mView.requestLayout();
}
}
Ответ 2
В Honeycomb (Android 3.0) есть классы Animator
и ObjectAnimator
для более плавных анимаций.
Прочтите здесь
Пример о том, как оживить перемещение группы представлений (LinearLayout) с помощью интерполятора отказов.
BounceInterpolator bounceInterpolator = new BounceInterpolator();
ObjectAnimator anim = ObjectAnimator.ofFloat(myViewGroup, "translationY", 0f, -200 );
anim.setInterpolator(bounceInterpolator);
anim.setDuration(1100).start();
Это вызовет гладкую анимацию с эффектом отскока и действительно переместит представления, не похожие на анимацию, до Honeycomb. Из документов:
Предыдущие анимации изменили внешний вид целевых объектов... но они фактически не изменили сами объекты.