Java 在使ImageView不可见和可见之间暂停
我正在编写一个Android应用程序,在编写应用程序的主要部分时遇到了一个问题 我需要让ImageView消失一两秒钟,然后在点击时重新出现。攻丝部分工作正常,我使用XML使其可点击,然后在点击时调用一个方法。问题在于我调用的方法。我需要它:Java 在使ImageView不可见和可见之间暂停,java,android,imageview,sleep,Java,Android,Imageview,Sleep,我正在编写一个Android应用程序,在编写应用程序的主要部分时遇到了一个问题 我需要让ImageView消失一两秒钟,然后在点击时重新出现。攻丝部分工作正常,我使用XML使其可点击,然后在点击时调用一个方法。问题在于我调用的方法。我需要它: 消失 将一个添加到PlayerCore 重新显示playerscore 以几秒钟的延迟重新出现 我的问题是,无论我做什么,它都不会明显消失。我更喜欢远离Thread.sleep(),因为我希望用户能够在它不可见的情况下点击其他东西(如果我误解了Thread
public void tb1(View view){
b1.setVisibility(View.INVISIBLE); //Make the ImageView Invisible
playerscore ++;
score.setText("SCORE: " + playerscore); //The sleep affected this line for some reason
Thread.sleep(1000)
b1.setVisibility(View.VISIBLE) //Make the ImageView Visible
}
这是我尝试的第二件事
public void tb1(View view) throws InterruptedException{
int i = 0;
b1.setVisibility(View.INVISIBLE);
playerscore ++;
score.setText("SCORE: " + playerscore);
while (i < 100){
i++;
}
if(i == 100){
b1.setVisibility(View.VISIBLE);
}
}
更新 M-WaJeEh的PostDelayed()方法非常酷,而且将该代码改编成动画也不难。我的原始代码不起作用的原因是我们没有仔细阅读API setAlpha(int)以setImageAlpha(int)为受益人进行折旧 但是,setAlpha(float)不是 区别在于setAlpha(int)和setImageAlpha(int)设置图像上的alpha,而不是视图上的alpha,setAlpha(float)设置实际视图上的alpha。这是一个重要的区别,因为当图像位于视图中时,图像本身无法设置动画 因此,要使其发挥作用,应:
b1.setAlpha(0f);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
然后我试着写它,这样一个视图就会淡出,然后淡入。事实证明,AnimationSet非常糟糕,当您有多个AlphaAnimations时,它不会为AlphaAnimations设置动画(或者我没有正确理解AnimationSet)。PostDelayed()解决了这个问题,这是一件好事
下面是一个例子:
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.animate().alpha(0f).setDuration(500);
imageView.postDelayed(new Runnable(){
@Override
public void run() {
imageView.animate().alpha(1f).setDuration(500);
}
}, 3000);
}
});
}
}
我们还可以将OnClickListener替换为类似的内容,以便在单击时在透明和不透明之间切换:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView imageView = (ImageView) findViewById(R.id.image);
float alpha = imageView.getAlpha();
if (alpha == 0f) {
imageView.animate().alpha(1f).setDuration(500);
} else if (alpha == 1f) {
imageView.animate().alpha(0f).setDuration(500);
}
}
});
活动\u main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="Animate" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/bottom_bar" />
</LinearLayout>
具体来说,以您的示例为例(因为我对您关于config_shortAnimTime的评论有点困惑——这只是Android系统定义的值):
如果你做了类似的事情:
b1.animate().alpha(1f).setDuration(500).setStartDelay(2000).start();
然后b1会因为setStartDelay()而不可见2秒,然后因为setDuration()而淡入需要500毫秒。更新 M-WaJeEh的PostDelayed()方法非常酷,而且将该代码改编成动画也不难。我的原始代码不起作用的原因是我们没有仔细阅读API setAlpha(int)以setImageAlpha(int)为受益人进行折旧 但是,setAlpha(float)不是 区别在于setAlpha(int)和setImageAlpha(int)设置图像上的alpha,而不是视图上的alpha,setAlpha(float)设置实际视图上的alpha。这是一个重要的区别,因为当图像位于视图中时,图像本身无法设置动画 因此,要使其发挥作用,应:
b1.setAlpha(0f);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
然后我试着写它,这样一个视图就会淡出,然后淡入。事实证明,AnimationSet非常糟糕,当您有多个AlphaAnimations时,它不会为AlphaAnimations设置动画(或者我没有正确理解AnimationSet)。PostDelayed()解决了这个问题,这是一件好事
下面是一个例子:
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.animate().alpha(0f).setDuration(500);
imageView.postDelayed(new Runnable(){
@Override
public void run() {
imageView.animate().alpha(1f).setDuration(500);
}
}, 3000);
}
});
}
}
我们还可以将OnClickListener替换为类似的内容,以便在单击时在透明和不透明之间切换:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView imageView = (ImageView) findViewById(R.id.image);
float alpha = imageView.getAlpha();
if (alpha == 0f) {
imageView.animate().alpha(1f).setDuration(500);
} else if (alpha == 1f) {
imageView.animate().alpha(0f).setDuration(500);
}
}
});
活动\u main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="Animate" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/bottom_bar" />
</LinearLayout>
具体来说,以您的示例为例(因为我对您关于config_shortAnimTime的评论有点困惑——这只是Android系统定义的值):
如果你做了类似的事情:
b1.animate().alpha(1f).setDuration(500).setStartDelay(2000).start();
然后b1会因为setStartDelay()而不可见2秒,然后因为setDuration()而淡入需要500毫秒。如果您不需要任何动画,则只需使用此代码,假设
b1
是您的类变量:
b1.setVisibility(View.INVISIBLE);
b1.postDelayed(new Runnable() {
@Override
public void run() {
b1.setVisibility(View.VISIBLE);
}
}, 3000);
如果您不需要任何动画,那么只需使用此代码,假设
b1
是您的类变量:
b1.setVisibility(View.INVISIBLE);
b1.postDelayed(new Runnable() {
@Override
public void run() {
b1.setVisibility(View.VISIBLE);
}
}, 3000);
听起来应该行了!但是有没有办法用config_shortAnimTime替换一个数值呢?如果淡出速度非常快,淡入时间稍长,那就太好了视图的animate()函数允许您设置所有这些。您不必使用Android的Systemr(比如config_shortAnimTime)来进行动画计时。setDuration(以毫秒为单位的长度)是您需要的。谢谢,我现在知道如何更好地使用它了。我将设置为我的接受答案,一旦我有机会把这纳入代码,并确保它的所有作品的权利!还有一个问题。我得到一个警告:来自ImageView类型的setAlpha(int)方法已被弃用。这是什么意思?我的版本太低了吗?我的测试设备很旧,无法更新。我的代码是否仍能在该设备上工作,还是必须更新/获取兼容性库?还有一个罢工通过了setalpha,贬值的方法意味着该方法仍然有效,但谷歌决定