[英]Pause Between Making ImageView Invisible and Visible Android
我正在编写一个Android应用程序,在编写应用程序主要部分时遇到了问题。
我需要让ImageView消失一两秒钟,然后在点击时重新出现。 点击部分起作用,我使用XML使其可点击,然后在点击时调用方法。 问题出在我调用的方法中。 我需要它:
我的问题是,无论我做什么,它都不会明显消失。 我宁愿远离Thread.sleep(),因为我希望用户能够在不可见的情况下点击其他东西(如果我误解了Thread.sleep(),请告诉我。如果可以使用所有方法作为自己的线程,请向我展示如何操作。我在Java上还是很新。)但是,我确实尝试使用Thread.sleep(),并且它在sleep语句之前暂停了代码行,但并未明显影响消失和重新出现之间的时间间隔。 (看代码听起来可能会令人困惑,这将有助于对其进行解释)。 我还尝试使用while语句计数到100,然后在计数器达到100时重新出现,但这没有用。 我考虑过使用计时器,但是我需要一个非常简洁的示例,因为该计时器需要使用24种不同的方法。 这是代码,应该可以帮助解释一下。
这是我尝试过的第一件事,我最好不要使用
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);
}
}
对于这个,就像我什么也没做。 一切都没有延迟。
我真的不知道该怎么做。 我是在使用错误的东西,还是只是在使用错误的东西? 请耐心等待,我还是Java的新手,并且经验不足。
预先感谢您提供的所有帮助!
public void tb1(View view){ b1.setImageAlpha(0); b1.animate().alpha(1f).setDuration(0).setStartDelay(3000).start(); playerscore++; score.setText("SCORE: " + playerscore); }
如果不需要任何动画,则只需使用以下代码,并假设b1
是您的类变量:
b1.setVisibility(View.INVISIBLE);
b1.postDelayed(new Runnable() {
@Override
public void run() {
b1.setVisibility(View.VISIBLE);
}
}, 3000);
更新
M-WaJeEh的PostDelayed()方法非常酷-而且使该代码适应动画也不难。 我的原始代码不起作用的原因是因为我们没有足够仔细地阅读API。
setAlpha(int)折旧为setImageAlpha(int)
setAlpha(float)却不是。
区别在于setAlpha(int)和setImageAlpha(int)设置图像上的Alpha,而不是视图 ,而setAlpha(float)设置实际视图上的Alpha。 这是一个重要的区别,因为当图像位于视图内部时,图像本身无法进行动画处理。
因此,要使其正常工作-应该是:
b1.setAlpha(0f);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
然后我尝试编写它,以使视图逐渐淡出,然后逐渐淡入。原来,当您有多个动画集时,AnimationSet很坏并且不能为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);
}
}
});
activity_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>
这就是它的样子。 太糟糕了,我还不能发布图片。
单击时在透明和不透明之间切换:
https://dl.dropboxusercontent.com/u/2588338/Stuff/Untitled-1.gif
单击一次,淡出然后淡入:
https://dl.dropboxusercontent.com/u/2588338/Stuff/Untitled-2.gif
旧答案
您将为此使用Android的动画框架。
另外,第二种方法不起作用的原因是计算机对数字的计数非常快 ,一台计算机计数到100根本不需要时间-即使您要将其计数到足够高的数字(或者说拥有一个足够大的数字)每个循环睡眠10毫秒),它只会执行与第一种方法相同的操作-阻塞主线程,并且不允许任何用户交互。
您想要的不是使视图消失,而是将视图的Alpha设置为0,然后将视图的Alpha延迟设置回1。
所以像这样:
b1.setAlpha(0);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
具体来说,以您的示例为例(由于您对config_shortAnimTime的评论有点困惑-这仅仅是Android系统定义的值):
public void tb1(View view){
//Make the ImageView invisible
b1.setAlpha(0);
// Make the ImageView visible after 1 second with no animation delay
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
playerscore++;
score.setText("SCORE: " + playerscore);
}
如果您执行了以下操作,则:
b1.animate().alpha(1f).setDuration(500).setStartDelay(2000).start();
然后,由于setStartDelay(),b1将在2秒钟内不可见,然后由于setDuration(),需要500毫秒才能淡入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.