我们知道属性动画要设置get、set 方法,但是有时不好设置,因此我们找新方法。
/**
* Created by gongdongdong on 2017/1/16.
*/
public class OffsetAnimation {
private LinearLayout mOffsetll;
private int mHeight;
public OffsetAnimation(LinearLayout mOffsetll, int height) {
this.mOffsetll = mOffsetll;
mHeight = height;
}
public void startShowAnimate() {
ViewWrapper wrapper = new ViewWrapper(mOffsetll);
ObjectAnimator.ofInt(wrapper, "bottomMargin", mHeight).setDuration(500).start();
}
public void startHideAnimate() {
ViewWrapper wrapper = new ViewWrapper(mOffsetll);
ObjectAnimator.ofInt(wrapper, "bottomMargin", 0).setDuration(500).start();
}
public class ViewWrapper {
private LinearLayout ll;
public int getBottomMargin() {
return ll.getLayoutParams().height;
}
public void setBottomMargin(int bottomMargin) {
ll.getLayoutParams().height = bottomMargin;
ll.requestLayout();
}
public ViewWrapper(LinearLayout view) {
this.ll = view;
}
}
}
使用方式:
将隐藏显示的内容放在LinearLayout中,启动的时候测量出LinearLayout的高度height(这里你可以onCreate获取高度,可以使用measure、ViewTreeObserver、post三种方式中的一种),这里我使用ViewTreeObserver,如下:
ViewTreeObserver vto=mInsuranceTv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mInsuranceTv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
height=mInsuranceTv.getMeasuredHeight();
}
});
启动动画的时候可以实例化OffsetAnimation对象m,将LinearLayout和height传入;调用m.startShowAnimate()显示、m.startHideAnimate()隐藏。如果想隐藏有动画效果的View,可以在onCreate里做如下处理。
mInsuranceTv= (TextView) findViewById(R.id.insurance_tv); //TextView要隐藏显示的view
LinearLayout.LayoutParams mLayoutParams = ((LinearLayout.LayoutParams) mInsuranceTv2.getLayoutParams());
mLayoutParams.bottomMargin=-height;
大家可以试下,效果还可以,有问题大家可以留言下,相互学习。本文借鉴《Android开发艺术探索》