我需要为以下场景制作动画:
我有一个 ListView,每个单元格中有 3 个布局:
- preview_layout (蓝色):包含content_layout内容的预览。
- 内容布局(绿色):包含带有一些按钮的长文本。
- 一个wrapper_layout(红色):包含preview_layout 和contents_layout。
contents_layout 的可见性设置为“ gone ”,因此列表中只有 preview_layout 可见。
当按下 ListView 的一个单元格时,我需要使用向下滑动的动画来显示 content_layout。
到目前为止,我使用了以下解决方案:
在ListView的getView中:
// Preview_layouts height
int hPreview = 70;
// Views
final View previewView = rowView.findViewById(R.id.preview);
final View contentsView = rowView.findViewById(R.id.contents);
// On previewView click
previewView.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (!contentsView.isShown()) {
// Close all the contents_layout of the ListView (menuListView)
for (int i=0; i < menuListView.getChildCount(); i++) {
View v = menuListView.getChildAt(i).findViewById(R.id.contents);
if (v.isShown()) { v.startAnimation(new SlideUpAnimation(v, hPreview)); }
}
// Slide down the selected contents_layout (contentsView)
contentsView.startAnimation(new SlideDownAnimation(contentsView, hPreview));
}
}
});
SlideDownAnimation 类:
public class SlideDownAnimation extends Animation {
private View target;
private LayoutParams targetResize;
private int mFromHeight, mToHeight;
public SlideDownAnimation( View targetToSlideDown, int fromHeight ) {
// Show the contents_layout target
target = targetToSlideDown;
target.setVisibility(View.VISIBLE);
// Animation property
setDuration(500);
setInterpolator(new DecelerateInterpolator());
// Target
targetResize = targetToSlideDown.getLayoutParams();
mFromHeight = fromHeight;
mToHeight = targetResize.height - fromHeight;
targetResize.height = 1;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// Set the Alpha to fade in the contents_layout target
t.setAlpha(interpolatedTime);
// Set the height to slide down the contents_layout target
targetResize.height = (int) (mToHeight * interpolatedTime) + mFromHeight;
target.requestLayout();
}
}
这个解决方案的最大问题是,如果 content_layout 设置为android:layout_height="wrap_content"并且可见性消失,我无法获得它的高度,它只返回“0”。
您还有其他解决方案来执行我需要的动画吗?