问题描述
我想为 View
的可见性设置为 GONE
时制作 Animation
.View
应该折叠"而不是仅仅消失.我用 ScaleAnimation
尝试了这个,但是 View
被折叠了,但是布局只会在 Animation
停止之后(或之前)调整它的空间大小(或开始).
I want to make an Animation
for when a View
gets it's visibility set to GONE
. Instead of just dissapearing, the View
should 'collapse'. I tried this with a ScaleAnimation
but then the View
is collapse, but the layout will only resize it's space after (or before) the Animation
stops (or starts).
如何制作 Animation
以便在动画时,较低的 View
将直接停留在内容下方,而不是有空格?
How can I make the Animation
so that, while animating, the lower View
s will stay directly below the content, instead of having a blank space?
推荐答案
通过 API 似乎没有简单的方法可以做到这一点,因为动画只是改变了视图的渲染矩阵,而不是实际大小.但是我们可以设置一个负边距来欺骗 LinearLayout 认为视图正在变小.
There doesn't seem to be an easy way to do this through the API, because the animation just changes the rendering matrix of the view, not the actual size. But we can set a negative margin to fool LinearLayout into thinking that the view is getting smaller.
因此,我建议基于 ScaleAnimation 创建您自己的 Animation 类,并覆盖applyTransformation"方法以设置新的边距和更新布局.像这样...
So I'd recommend creating your own Animation class, based on ScaleAnimation, and overriding the "applyTransformation" method to set new margins and update the layout. Like this...
public class Q2634073 extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.q2634073);
findViewById(R.id.item1).setOnClickListener(this);
}
@Override
public void onClick(View view) {
view.startAnimation(new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, view, true));
}
public class MyScaler extends ScaleAnimation {
private View mView;
private LayoutParams mLayoutParams;
private int mMarginBottomFromY, mMarginBottomToY;
private boolean mVanishAfter = false;
public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view,
boolean vanishAfter) {
super(fromX, toX, fromY, toY);
setDuration(duration);
mView = view;
mVanishAfter = vanishAfter;
mLayoutParams = (LayoutParams) view.getLayoutParams();
int height = mView.getHeight();
mMarginBottomFromY = (int) (height * fromY) + mLayoutParams.bottomMargin - height;
mMarginBottomToY = (int) (0 - ((height * toY) + mLayoutParams.bottomMargin)) - height;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
if (interpolatedTime < 1.0f) {
int newMarginBottom = mMarginBottomFromY
+ (int) ((mMarginBottomToY - mMarginBottomFromY) * interpolatedTime);
mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
mLayoutParams.rightMargin, newMarginBottom);
mView.getParent().requestLayout();
} else if (mVanishAfter) {
mView.setVisibility(View.GONE);
}
}
}
}
通常的警告适用:因为我们覆盖了一个受保护的方法 (applyTransformation),所以不能保证这在未来的 Android 版本中有效.
The usual caveat applies: because we are overriding a protected method (applyTransformation), this is not guaranteed to work in future versions of Android.
这篇关于我如何动画 View.setVisibility(GONE)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!