Android LinearLayout的子项自定义渲染动画

时间:2015-10-10 14:26:57

标签: android android-layout animation objectanimator layouttransition

情况如下:

我的LinearLayout垂直包含CardView

我想通过在卡片上添加动画来自定义呈现方式。

当布局呈现时(可能在 onResume())我希望每张卡片从底部滑动到卡片应该拍摄的位置(如果没有动画)如上图所示:enter image description here 黄色箭头表示LinearLayout paddingTop ,紫色箭头表示CardView marginBottom

我不知道如何实现这个目标,因为我无法获得最终职位,这就是为什么我来这里问你是否有人已经做过这个或类似的事情。

我尝试使用LayoutTransition ObjectAnimator添加LinearLayout添加/删除儿童动画,但我必须传递视图(孩子,我不是在ObjectAnimator的构造函数中假设知道。

我也试过这个:

[...]
int deviceHeight = getResources().getDisplayMetrics().heightPixels;
[...]
@override
public onResume() {
  super.onResume();
  card.animate().y(position)
      .withStartAction(new Runnable(){
        @Override
          public void run(){
            card.setY(deviceHeight);
          }
        });

但是我无法获得位置的值(我总是得到0)或者如果我将其更改为 .y(-deviceHeight),则会在他的位置然后移到底部,然后滑到LinearLayout 的顶部,但 paddingTop 甚至不被考虑..

编辑: 总而言之,我想做一些类似于当 android:animateLayoutChanges =“true”设置并且你删除第一个孩子时发生的事情:其他孩子只需向上滑动填充该空间(除了我想在每个子动画之间添加一些延迟)

1 个答案:

答案 0 :(得分:1)

最后我做了一个小技巧来实现这个目标:

假设LinearLayout被称为 cardsContainer ,我这样做了:

LayoutTransition lt = cardsContainer.getLayoutTransition();
lt.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 200);

这段代码为每个移动的孩子的每个动画增加了200毫秒,因为它们已被移除,所以我有一个空的View ghostcard )顶部 match_parent 然后我这样做:

@Override
public void onWindowFocusChanged (boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus) {
        cardsContainer.removeView(findViewById(R.id.ghostcard));
    } else {
        cardsContainer.addView(ghostCard, 0);
    }
}