java - 如何使用户按下的按钮在按下时缩小?
问题描述
我正在开发一款手机游戏,在游戏中,用户在按钮收缩之前按下按钮,为了让游戏“有趣”,按钮收缩的速度越来越快,所以当用户按下一个按钮时,另一个按钮就会弹出向上收缩得更快。到目前为止,我有这段代码可以处理用户输入和按钮的缩小,但是,一旦按下没有动画,它会立即捕捉到“缩小”的大小,我不知道如何解决这个问题。
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
ViewGroup.LayoutParams params = button.getLayoutParams();
Integer value = 120;
while(value >= 2) {
value = value - 1;
SystemClock.sleep(50);
params.width = value;
params.height = value;
button.setLayoutParams(params);
};
}
});
我添加了这SystemClock.sleep(50)
条线,因为我认为这就是它正在捕捉的原因(即它是如此之快以至于我只是没有看到动画)但事实并非如此,因为应用程序只是挂起,直到按钮的大小更新。
Ps 在开发移动应用程序方面我是个新手。
解决方案
编辑
忘记我在原始帖子中写的内容。请尝试下面的代码,让我知道这是否对您有帮助。
final ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f, 0.0f); //start and end value
valueAnimator.setDuration(2000); //you can replace 2000 with a variable you can change dynamically
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
button.setScaleX(animatedValue);
button.setScaleY(animatedValue);
}
});
valueAnimator.start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
valueAnimator.pause();
}
});
原始答案
我会遵循 0X0nosugar 的建议。
在您的 Android 文件树中,在您的 res 目录下,添加一个 Android 资源目录(右键单击 res 文件夹 > 新建)并将其命名为“anim”。如果您使用该名称,Android Studio 可能会自动将其视为保存动画的文件夹。再次右键单击动画文件夹 > 新建 > 动画资源文件。把它命名为你想要的。在我的示例中,我将其命名为 button_animator。
您的文件树将如下所示:
您的 button_animator.xml 可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="0.1"
android:fromYScale="1.0"
android:toYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="500" />
</set>
您可以使用这些行来定制按钮的结束比例:
android:toXScale="0.1"
和
android:toYScale="0.1"
在您的代码中,您可以动态地定制您的动画:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation shrinkButton = AnimationUtils.loadAnimation(MainActivity.this, R.anim.button_animator); //reference the animator
shrinkButton.setDuration(5000); //dynamically set the duration of your animation
button.startAnimation(shrinkButton); //start the animation. Since it is inside an onclicklistener, the animation start on a button click event
shrinkButton.setAnimationListener(new Animation.AnimationListener() { //you could use an AnimationListener to do something on certain event, like at the end of the animation
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) { //you probably want to something onAnimationEnd, otherwise the button will snap back into its original size.
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
});
在 onAnimationEnd 中,您必须决定在动画结束时要做什么。只是几个想法:
@Override
public void onAnimationEnd(Animation animation) { //you probably want to something onAnimationEnd, otherwise the button will snap back into its original size.
button.setScaleX(0.1f); //same size as in toScale size in the animator xml
button.setScaleY(0.1f);
}
或者,如果您希望按钮变得不可见:
@Override
public void onAnimationEnd(Animation animation) {
button.setVisibility(View.INVISIBLE);
}
推荐阅读
- android - 如何使用 Kotlin 中的 Room 使用实体中的另一个字段来更新 List 中的数据
- c# - 当值为 NULL 时不要创建 XElement
- python - 如何编写一个抓取多个网页的scrapy程序?
- php - 从字符串变量插入日期不起作用
- javascript - 如何提高在范围内查找完美数字的性能 [Java Script]
- c - 为什么 C puts 附加换行符而 fputs 没有?
- amazon-web-services - AWS EC2 中的 python 烧瓶应用程序
- javascript - javascript .push() 添加到两个数组
- perl - 如何在一行中同时添加/删除两个进程的功能?
- java - OuterClass 中的方法可以只调用静态 InnerClass 中的静态方法吗?