Android 动画和过渡
Android Animation and transitioning
下面的代码应该是:
当我触摸屏幕时,按钮从左上角移动到右下角。如果我再次触摸屏幕,按钮将从右下移动到左上。
但实际情况是,当我触摸屏幕时,按钮开始从 TL 移动到 BR,但随后又跳回到 TL 角!
我触摸屏幕的时间越长,按钮 "travels" 朝向 BL 角的时间就越长。
这是为什么?我必须更改什么才能使按钮在我第一次触摸屏幕时向一个方向移动,而在我第二次触摸屏幕时向另一个方向移动?
@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
。例如,当您触摸屏幕时,会发送 ACTION_DOWN
。当您抬起手指时,会发送 ACTION_UP
。您可以找到所有事件的解释 here.
现在,您每次触摸屏幕时至少会收到两次 onTouchListener
呼叫。为了让它每次触摸只动画一次,我会做类似下面的事情来只在按下触摸事件时执行。
myLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
moveButton();
}
return true;
}
});
下面的代码应该是:
当我触摸屏幕时,按钮从左上角移动到右下角。如果我再次触摸屏幕,按钮将从右下移动到左上。
但实际情况是,当我触摸屏幕时,按钮开始从 TL 移动到 BR,但随后又跳回到 TL 角!
我触摸屏幕的时间越长,按钮 "travels" 朝向 BL 角的时间就越长。 这是为什么?我必须更改什么才能使按钮在我第一次触摸屏幕时向一个方向移动,而在我第二次触摸屏幕时向另一个方向移动?
@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
。例如,当您触摸屏幕时,会发送 ACTION_DOWN
。当您抬起手指时,会发送 ACTION_UP
。您可以找到所有事件的解释 here.
现在,您每次触摸屏幕时至少会收到两次 onTouchListener
呼叫。为了让它每次触摸只动画一次,我会做类似下面的事情来只在按下触摸事件时执行。
myLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
moveButton();
}
return true;
}
});