Android: расти / уменьшаться - PullRequest
0 голосов
/ 15 июня 2011

У меня есть макет вида, подобный этому:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@color/light_gray"
    android:padding="5dip">

    <View android:id="@+id/fixedSpace" android:layout_width="fill_parent"
        android:layout_height="50dip" android:background="@color/aqua"
        android:layout_alignParentBottom="true" android:clickable="true"
        android:onClick="onClickStartAnimation" />

    <View android:id="@+id/dynamicSpace" android:layout_width="fill_parent"
        android:layout_height="200dip" android:background="@color/lime"
        android:layout_above="@id/fixedSpace" />


    <View android:id="@+id/remainingSpace" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:background="@color/pink"
        android:layout_alignParentTop="true" android:layout_above="@id/dynamicSpace" />


</RelativeLayout>

То, чего я хочу достичь, это в основном поведение роста / сжатия dynamicSpace в течение времени t . С анимацией я могу произвести следующее:

т = 1:

t=1

т = 2

t=2

т = 3

t=3

Однако это не меняет мои взгляды, в частности dynamicSpace и remainingSpace. Он просто оживляет движущееся представление dynamicSpace. Но представление "контейнер" уже занимает пространство, занятое с самого начала.

Правильно было бы, что салатовый dynamicSpace начинается с 0px, а розовый remainingSpace вступает во владение, поэтому между ними нет серого пространства.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

EDIT: Я попытался заменить приведенное ниже потоком AsyncTask , и он стал намного плавнее. Я думаю, что ключ заключается в том, что я поддерживаю поток в фоновом режиме и просто использую его, когда хочу что-то изменить, уменьшая таким образом накладные расходы


Создайте пользовательский AnimationListener и поместите код для изменения размера представления в метод onAnimationRepeat.

Затем выполните фиктивную анимацию и установите повтор анимации на бесконечный. Как только представление достигнет окончательного размера, установите счетчик повторений на анимации равным нулю (снова в onAnimationRepeat):

class ResizeAnimationListener implements AnimationListener{

int finalHeight; // max Height
int resizeAmount; // amount to resize each time
View view; // view to resize

public ResizeAnimationListener(int finalHeight; View view, int resizeAmount) {
    super();
    finalHeight; = finalHeight; 
    this.resizeAmount = resizeAmount;
    this.view = view;

}

@Override
public void onAnimationEnd(Animation animation) {

}

@Override
public void onAnimationRepeat(Animation animation) {

    int newHeight;
    int currentHeight;

    current = view.getMeasuredHeight();

    newHeight= currentHeight+ resizeAmount;
    if(newHeight> finalHeight){
        // check if reached final height

        // set new height to the final height
        newHeight = finalHeight;
        // set repeat count to zero so we don't have any more repeats
        anim.setRepeatCount(0);

    }

    // set new height
    LayoutParams params = view.getLayoutParams();                                           
    params.height = newHeight;
    v.setLayoutParams(params);                                      

}

@Override
public void onAnimationStart(Animation animation) {

}

};

class DummyAnimation extends Animation{}


float frameRate = 1000/30;                              
DummyAnimation anim = new DummyAnimation();
anim.setDuration((long)frameRate);                          
anim.setRepeatCount(Animation.INFINITE);
ResizeAnimationListener animListener = new ResizeAnimationListener(((View)view.getParent()).getHeight(), view, 25);
anim.setAnimationListener(animListener);

view.startAnimation(anim);

Я сделал эту работу в своем собственном приложении. Однако виды, привязанные к виду, размер которого я изменяю (и, следовательно, перемещаюсь по экрану при изменении размера моего вида), похоже, сбиваются. Вероятно, связано с повторным изменением размера, а не с чем-либо еще, но только с предупреждением. Может, кто-то еще знает почему?

0 голосов
/ 15 июня 2011

Масштаб просмотра

Поскольку вы говорите, что делаете это с течением времени t , звучит так, что LinearInterpolator лучше всего.

...