android 给view设置动画并.setFillAfter(true)(停在动画结束时),动画结束后view的实际位置还是动画开始位置(显示是动画结束的位置,是前面设置.setFillAfter(true)的原因)。
private RelativeLayout kb_bg;
private Animation in;
private RelativeLayout.LayoutParams params;
private void initKeyBoardAnim() {
kb_bg = (RelativeLayout) findViewById(R.id.bt_main_kb_bg);
kbAnim = new KeyBoardAnimListener();
params = (RelativeLayout.LayoutParams) kb_bg.getLayoutParams();
in = new TranslateAnimation(0, 300, 0, 0);//view向右移动300像素的动画
in.setFillAfter(true);
in.setDuration(300);
in.setAnimationListener(kbAnim);
Button btn = (Button) findViewById(R.id.bt_main_kb_btn_hideOrShow);
btn.setOnClickListener(new KBBtnEvent());
}
按钮事件:
1,开始动画时把要移动的View先隐藏再开始View的移动动画。
private class KBBtnEvent implements OnClickListener {
@Override
public void onClick(View v) {
params.leftMargin = 300;
kb_bg.setLayoutParams(params);
kb_bg.setVisibility(View.GONE);
kb_bg.startAnimation(in);
}
};
动画监听:
2,在动画结束后清除动画,再显示View。
private class KeyBoardAnimListener implements AnimationListener{
@Override
public void onAnimationEnd(Animation animation) {
kb_bg.clearAnimation();
kb_bg.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
这种方式也解决了动画结束后View闪一下的问题。