翻看老代码的时候发现了一个很奇怪的需求,点击对调两个view的位置,原先的实现思路是放了两个父布局,然后通过addview和removeview来实现更换位置的效果,嗯嗯,换个思路试试。
这是一个非常简单的示意图,直接上代码。
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
isChange = false;
mTvTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
RelativeLayout.LayoutParams params;
isChange = !isChange;
if (isChange) {
params = (RelativeLayout.LayoutParams) mRlTopRight.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
mRlTopRight.setLayoutParams(params);
params = (RelativeLayout.LayoutParams) mRlTopLeft.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
mRlTopLeft.setLayoutParams(params);
} else {
params = (RelativeLayout.LayoutParams) mRlTopRight.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
mRlTopRight.setLayoutParams(params);
params = (RelativeLayout.LayoutParams) mRlTopLeft.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
mRlTopLeft.setLayoutParams(params);
}
if (isChange) {
//move upward and downward 300
ObjectAnimator.ofFloat(mRlBottomRight, "TranslationX", -screenWidth + 50).setDuration(1000).start();
ObjectAnimator.ofFloat(mRlBottomLeft, "TranslationX", screenWidth - 50).setDuration(1000).start();
} else {
//back to normal position
ObjectAnimator.ofFloat(mRlBottomLeft, "TranslationX", 0).setDuration(1000).start();
ObjectAnimator.ofFloat(mRlBottomRight, "TranslationX", 0).setDuration(1000).start();
}
}
});
view的click事件上面的判断是直接切换,下面是带移动效果的,就这样,告辞!