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