这是我的自定义ScaleAnimation:
public class MyScaler extends ScaleAnimation {
private static final String TAG = "myScaler";
private View mView;
private LayoutParams mLayoutParams;
private int oldMargin, newMargin;
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);
setFillAfter(true);
setFillBefore(true);
setFillEnabled(true);
mView=view;
int height = 200; // fiktive hoehe
mLayoutParams = (LayoutParams) view.getLayoutParams();
oldMargin = toY<fromY ? mLayoutParams.bottomMargin : -214;
Log.d(TAG, "old Margin "+oldMargin);
newMargin = toY<fromY ? oldMargin-height : height;
Log.d(TAG, "new Margin "+newMargin);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
Log.d(TAG, "apply transofrmation");
if (interpolatedTime < 1.0f) {
int newBottomMargin=(int)(newMargin*interpolatedTime) + oldMargin;
mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
mLayoutParams.rightMargin, newBottomMargin);
Log.d(TAG,"margin change "+newBottomMargin);
mView.getParent().requestLayout();
} else if (mVanishAfter) {
mView.setVisibility(View.GONE);
}
}
@Override
public boolean willChangeBounds() {
return true;
}
}
我这样称呼它,通过切换按钮进行展开并隐藏它:
toggle.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Log.d(TAG, "onClick first "+first);
if(first){
myScale = new MyScaler(1.0f, 1.0f, 0.0f, 1.0f, 500, dp, false);
((TextView) v).setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.expander_ic_minimized, 0);
}
else{
myScale = new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, dp, false);
((TextView) v).setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.expander_ic_maximized, 0);
}
first=!first;
myScale.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
first= !first;
Log.d(TAG, "change First"+first);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
Log.d(TAG, "started ani");
}
});
dp.startAnimation(myScale);
View parent = (View)dp.getParent();
parent.invalidate();
}
});
它在第一次尝试时以正确的方式隐藏了视图。但每当我想通过Button扩展它时,它就不会发生。如果触摸覆盖视图,则动画开始。我需要改变什么?提前谢谢。
答案 0 :(得分:7)
我有同样的问题,但无效在我的情况下不起作用。这解决了我的问题:
dp.requestLayout();
答案 1 :(得分:2)
在invalidate()
方法帮助我之后,在可见的View
对象上调用startAnimation(Animation)
方法。
答案 2 :(得分:2)
对于致电invalidate()
和requestLayout()
的人不起作用,请尝试
((View) view.getParent()).invalidate()