情况如下:
我的LinearLayout
垂直包含CardView
。
我想通过在卡片上添加动画来自定义呈现方式。
当布局呈现时(可能在 onResume())我希望每张卡片从底部滑动到卡片应该拍摄的位置(如果没有动画)如上图所示:
黄色箭头表示
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”设置并且你删除第一个孩子时发生的事情:其他孩子只需向上滑动填充该空间(除了我想在每个子动画之间添加一些延迟)
答案 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);
}
}