2012-03-14 2 views
16

В моем приложении есть LinearLayout с 0 высотой макета. Когда я нажимаю кнопку, эта высота макета должна быть LayoutParams.WRAP_CONTENT. Это код, который я использую в onclicklistner.Анимация при изменении LayoutParams в LinearLayout

LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
slider.setLayoutParams(lp); 

Я хочу анимировать это. Как настроить анимацию для слайдера.

+1

Вы хотите анимацию на слайдере? –

+0

@Nixit Patel yes – Chrishan

+0

@NixitPatel: Вы хотите реализовать анимацию слайдера ??? –

ответ

25

Я думаю, что вы просто хотите, чтобы оживить взгляд от 0 высоты до конечной высоты, вы можете сделать это с помощью пользовательской анимации:

public class ShowAnim extends Animation { 
    int targetHeight; 
    View view; 

    public ShowAnim(View view, int targetHeight) { 
     this.view = view; 
     this.targetHeight = targetHeight; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     view.getLayoutParams().height = (int) (targetHeight * interpolatedTime); 
     view.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; 
    } 
} 

И сделать это в коде, чтобы запустить анимацию:

Animation ani = new ShowAnim(headerView, 100/* target layout height */); 
ani.setDuration(2000/* animation time */); 
headerView.startAnimation(ani); 
+1

Как вы это делаете без его начала с высоты нуля каждый раз? Если я сделаю это один раз с целевой высотой макета 100, а затем снова с целевым временем макета 200, я хочу, чтобы он переместился от 0 до 100, а затем 100 -> 200. – Andrew

+0

Если вы хотите перейти от 100 - > 200, затем просто измените эту строку 'view.getLayoutParams(). Height = (int) (targetHeight * интерполированное время);' на что-то вроде 'view.getLayoutParams(). Height = initialHeight/* 100 в вашем случае */+ (int) (targetHeight/* 200 в вашем случае */- initialHeight * interpolatedTime); ' – Kai

+1

Одна вещь, которая не работает, ничего не происходит, когда initialHeight равно 0. Нет визуальных изменений вообще. – Andrew

1

так как мы имеем переходы макета в андроиде, так как Jellybean мы можем использовать, что вместо того, чтобы использовать анимационный объект.

В приведенной ниже статье объясняется это подробно. https://proandroiddev.com/the-little-secret-of-android-animatelayoutchanges-e4caab2fddec

Короче говоря, мы должны были бы только этот код -

tView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); 
tView.setLayoutParams(lp); 

Здесь LP будет макет Params

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams 
          (RelativeLayout.LayoutParams.MATCH_PARENT, newHeight); 

Еще одна вещь, чтобы добавить бы добавить эту строку в макете файл, в макет, который будет выполнять переход.

android:animateLayoutChanges="true" 
Смежные вопросы