android移动view之后刷新布局导致移动后的view归回原位置1

来源:互联网 发布:巫妖王之怒数据库 编辑:程序博客网 时间:2024/04/30 12:35

上篇讲了使用动画移动view的位置,但是移动view位置后,布局中如有其它view刷新会导致之前移动的view回归到原始位置。。。
可自定义布局,并在借助重绘解决,具体在onlayout中设置view的位置即可: mView.layout(mLeft, mTop, mRight, mBottom);

自定义的相对布局
public class RefreshRelativeLayout extends RelativeLayout {
View mView;
boolean mNeedLayout = false;
int mLeft = 0;
int mTop = 0;
int mRight = 0;
int mBottom = 0;

public RefreshRelativeLayout(Context context) {    this(context, null);}public RefreshRelativeLayout(Context context, AttributeSet attrs) {    this(context, attrs, 0);}public RefreshRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);}public void setTargetViewLayout(float xFromDeltaDistance, float xToDeltaDistance, float yFromDeltaDistance, float yToDeltaDistance, int duration, int delay, final boolean isBack) {

// mNeedLayout = false;
mView = getChildAt(2);
moveViewWithAnimation(mView, xFromDeltaDistance, xToDeltaDistance, yFromDeltaDistance, yToDeltaDistance, duration, delay, isBack);
}

@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {    super.onLayout(changed, l, t, r, b);    if (mNeedLayout == false) {        return;    }    mView.layout(mLeft, mTop, mRight, mBottom);}/** * 动画移动view并摆放至相应的位置 * * @param view               控件 * @param xFromDeltaDistance x起始位置的偏移量 * @param xToDeltaDistance   x终止位置的偏移量 * @param yFromDeltaDistance y起始位置的偏移量 * @param yToDeltaDistance   y终止位置的偏移量 * @param duration           动画的播放时间 * @param delay              延迟播放时间 * @param isBack             是否需要返回到开始位置 */public void moveViewWithAnimation(final View view, final float xFromDeltaDistance, final float xToDeltaDistance, final float yFromDeltaDistance, final float yToDeltaDistance, int duration, int delay, final boolean isBack) {    //创建位移动画    TranslateAnimation ani = new TranslateAnimation(xFromDeltaDistance, xToDeltaDistance, yFromDeltaDistance, yToDeltaDistance);    ani.setInterpolator(new OvershootInterpolator());//设置加速器    ani.setDuration(duration);//设置动画时间    ani.setStartOffset(delay);//设置动画延迟时间    //监听动画播放状态    ani.setAnimationListener(new Animation.AnimationListener() {        @Override        public void onAnimationStart(Animation animation) {        }        @Override        public void onAnimationRepeat(Animation animation) {        }        @Override        public void onAnimationEnd(Animation animation) {            int deltaX = (int) (xToDeltaDistance - xFromDeltaDistance);            int deltaY = (int) (yToDeltaDistance - yFromDeltaDistance);            int layoutX = view.getLeft();            int layoutY = view.getTop();            int tempWidth = view.getWidth();            int tempHeight = view.getHeight();            view.clearAnimation();            if (isBack == false) {                layoutX += deltaX;                layoutY += deltaY;                view.layout(layoutX, layoutY, layoutX + tempWidth, layoutY + tempHeight);            } else {                view.layout(layoutX, layoutY, layoutX + tempWidth, layoutY + tempHeight);            }            mLeft = layoutX;            mTop = layoutY;            mRight = layoutX + tempWidth;            mBottom = layoutY + tempHeight;            mNeedLayout = true;        }    });    view.startAnimation(ani);}

布局文件

0 0
原创粉丝点击