Android动画和过渡
下面的代码应该是: 当我触摸屏幕时,按钮从左上到右下移动。如果我再次触摸屏幕,按钮将从右下角移动到左上角 但现在发生的是,当我触摸屏幕时,按钮开始从TL移动到BR,但随后它又跳回到TL角 我触摸屏幕的时间越长,按钮“移动”到BL角的时间就越长。 为什么呢?第一次触摸屏幕时,我必须改变什么才能使按钮朝一个方向移动,第二次触摸时,按钮朝另一个方向移动Android动画和过渡,android,transition,Android,Transition,下面的代码应该是: 当我触摸屏幕时,按钮从左上到右下移动。如果我再次触摸屏幕,按钮将从右下角移动到左上角 但现在发生的是,当我触摸屏幕时,按钮开始从TL移动到BR,但随后它又跳回到TL角 我触摸屏幕的时间越长,按钮“移动”到BL角的时间就越长。 为什么呢?第一次触摸屏幕时,我必须改变什么才能使按钮朝一个方向移动,第二次触摸时,按钮朝另一个方向移动 @Override protected void onCreate(Bundle savedInstanceState) { super.on
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
state = false;
myLayout = (ViewGroup)findViewById(R.id.main_layout);
myLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
moveButton();
return true;
}
});
}
public void moveButton() {
View theButton = findViewById(R.id.button1);
TransitionManager.beginDelayedTransition(myLayout); //for smooth transitioning
//Change position
RelativeLayout.LayoutParams posRules = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
if ( state) {
posRules.addRule(RelativeLayout.ALIGN_PARENT_TOP);
posRules.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
}
else {
posRules.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
posRules.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
theButton.setLayoutParams(posRules);
//Change size
ViewGroup.LayoutParams sizeRules = theButton.getLayoutParams();
if ( state) {
sizeRules.width = 250;
sizeRules.height = 100;
}
else {
sizeRules.width = 450;
sizeRules.height = 300;
}
theButton.setLayoutParams(sizeRules);
state = !state;
}
每次触摸事件都会调用
onTouchListener
。例如,当您触摸屏幕时,会发送一个操作_DOWN
。当您的手指抬起时,会发送一个动作\u up
。你可以找到所有事件的解释
现在,每次触摸屏幕时,您都会收到至少两个对onTouchListener的调用。为了让它在每次触摸时只设置一次动画,我将执行如下操作,以便只在下触事件中执行
myLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
moveButton();
}
return true;
}
});