按住按钮修改视图属性
我有两个视图v1和v2。我的目标是,当用户按下并保存v1时,v2将使用动画进行扩展。当用户放开v1时,v2停止扩展。按住按钮修改视图属性
这是我的onCreate是什么样子:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
root = findViewById(R.id.root);
shape = findViewById(R.id.shape);
root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
isExpanding = true;
expandView(shape);
} return true;
case MotionEvent.ACTION_UP: {
isExpanding = false;
shrinkView(shape);
} return true;
default: return false;
}
}
});
}
对于expandView()和shrinkView(),我尝试添加含有isExpanding while循环,并增加在那里的动画:
private void shrinkView(final View view) {
while (!isExpanding) {
view.animate().scaleXBy(0.1f).scaleYBy(0.1f);
}
}
我也尝试更改循环内的LayoutParams:
private void expandView(final View view) {
while (isExpanding) {
final ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
currWidth = layoutParams.width;
currHeight = layoutParams.height;
currWidth = +GROWTH_FACTOR;
currHeight = +GROWTH_FACTOR;
layoutParams.width += currWidth;
layoutParams.height += currHeight;
view.setLayoutParams(layoutParams);
view.invalidate();
}
}
但是这两个块都会e ui线程如预期。
那么对于这种类型的动画,我将使用ObjectAnimator来缩放X和Y.然后,我将向该ObjectAnimator添加一个侦听器,并在onAnimationEnd中检查用户是否仍在按下(isExpanding)。如下面的代码:
View v2 = findViewById(R.id.v2);//lets say u have v2 and v1
final ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(v2, "scaleX", 0.5f);
final ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(v2, "scaleY", 0.5f);
scaleDownX.setDuration(1000);
scaleDownY.setDuration(1000);
final AnimatorSet scaleAnimation = new AnimatorSet();
scaleAnimation.play(scaleDownX).with(scaleDownY);
scaleAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
if (isExpanding) {
scaleAnimation.start();
}
}
});
findViewById(R.id.v1).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: {
isExpanding = true;
if (!scaleAnimation.isRunning()) {
scaleAnimation.start();
}
}
return true;
case MotionEvent.ACTION_UP: {
isExpanding = false;
scaleAnimation.cancel();
}
return true;
default:
return false;
}
}
});
希望这会有所帮助。
感谢您分享此内容,但它无效:/我的视图根本没有改变! –
更新了答案.. setOnTouchListener而不是setOnKeyListener,播放是定义设置,而.start()是启动它:) –
您可以使用调用它的发布方法每隔固定的时间间隔产生的AsyncTask,在呼叫扩大V2。这将释放你的UI线程来听取v1的发布。
或者另一种方法是,当用户持有V1启动一个线程,让该线程post
回更新(修改V2)。您也可以在v1发布时终止线程。
Ui线程由于无限循环而被阻止 –
@AbhishekPatel正确,因此为什么我需要帮助:) –