当一个组在ExpandableListView上展开/折叠时,我想应用一个简单的rotationX动画。下面的代码适用于前两个扩展,但是在两次/三次/五次之后不能播放定义的动画。奇怪的是,我第一次展开/折叠它是完美的!
ExpandableListview exp = new ExpandableListview(context);
// set adapter code
LayoutTransition transition = new LayoutTransition();
Animator appearAnim = ObjectAnimator.ofFloat(null, "rotationX", 90f,0f).setDuration(transition.getDuration(LayoutTransition.APPEARING));
transition.setAnimator(LayoutTransition.APPEARING, appearAnim); // I also tried first argument equals DISSAPEARING, CHANGING, etc
exp.setLayoutTransition(transition);
任何想法?这种做法完全错了吗?
此时我必须注意到这不是重复的!我正在寻找一个将使用LayoutTransition类/方法来解决的解决方案。
答案 0 :(得分:1)
这里有一些很棒的示例可以帮助您在ExpandableListView上进行扩展/折叠动画,在使用OpenGL渲染动画的android-flip库中,如果应用程序支持的最低Android版本是4.0,可以使用标准的Android SDK方法而不是OpenGL:View.setRotationX(),View.setScaleX()等。启用硬件加速时(默认情况下,如果目标API级别>> 14,则启用它),这些方法使用设备GPU非常有效地工作。
您可以使用此 FoldableLayout 在ExpandableListView上实现折叠动画以进行展开/折叠。
FoldableLayout中的布局实现:
设计的第一个元素是可以折成两半的布局。我们的 方法相当大胆:主要布局(FoldableItemLayout)简单 包含一个专门的布局(BaseLayout)。在动画期间, BaseLayout将其内容写入缓存,这是一个专门创建的缓存 Bitmap对象基于原始布局的大小。查看plaincopy 到clipboardprint?
class FoldableItemLayout extends FrameLayout {
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Bitmap cacheBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mBaseLayout.setCacheCanvas(new Canvas(cacheBitmap));
}
}
class BaseLayout extends FrameLayout {
private Canvas mCacheCanvas;
private void setCacheCanvas(Canvas cacheCanvas) {
mCacheCanvas = cacheCanvas;
}
@Override
public void draw(Canvas canvas) {
mCacheCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
super.draw(mCacheCanvas);
}
}
另外,我们需要使用两个额外的视图(PartView) - 用于 上半部分和下半部分 - 这将显示相应的 缓存中的数据,表示图像的上半部分和下半部分 (位图)。两个视图都包含主要布局的整个区域,但是 仅显示所需的部件。为了达到这个效果,我们计算了 Bitmap限制 - 并且在onDraw()方法中我们使Canvas绘制了 通过drawBitmap(Bitmap位图,Rect src,RectF dst, 油漆涂料)方法。
然后我们通过设置来设置旋转这些额外的视图 setRotationX()方法以相应的角度,实现 图像的下部和上部的独立旋转。至 拉下来,我们为FoldableItemLayout添加一个新参数 - 名为FoldRotation。