在制作ImageView隐形和可见Android之间暂停

时间:2014-05-11 01:45:36

标签: java android imageview sleep

我正在编写一个Android应用程序,并在编写应用程序的主要部分时遇到了问题。

我需要让ImageView消失一两秒钟,然后在点击时重新出现。点击部分工作,我使用XML使其可点击,然后点击调用方法。问题出在我打电话的方法中。我需要它:

  1. 消失
  2. 将一个添加到playerscore
  3. 重新显示球员核心
  4. 延迟几秒钟重新出现
  5. 我的问题是,无论我做什么,它都不会明显消失。我更喜欢远离Thread.sleep()因为我希望用户能够在不可见的情况下点击其他东西(如果我误解了Thread.sleep(),请告诉我。如果可以拥有所有方法是自己的线程,请告诉我如何。我仍然是Java的新手。)但是,我确实尝试使用Thread.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新手,并且经验不足。

    提前感谢您提供任何/所有帮助!

    <小时/> UPDATE 我从答案中添加了代码但没有任何改变。它消失了,但没有再出现。我有任何语法或任何值错误吗?

            public void tb1(View view){
        b1.setImageAlpha(0);
        b1.animate().alpha(1f).setDuration(0).setStartDelay(3000).start();
        playerscore++;
        score.setText("SCORE: " + playerscore);
    
        }
    

2 个答案:

答案 0 :(得分:3)

如果您不需要任何动画,那么只需使用此代码,假设b1是您的类变量:

b1.setVisibility(View.INVISIBLE);
b1.postDelayed(new Runnable() {
    @Override
    public void run() {
        b1.setVisibility(View.VISIBLE);
    }
}, 3000);

答案 1 :(得分:1)

<强>更新

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就完全不需要时间计算机 - 即使你想要计算到一个足够高的数字(或者说,每个循环让它睡10ms),它只会做与第一种方法相同的事情 - 阻止主线程并且不允许任何用户交互。

你想要的不是让视图消失,而是将视图的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();

然后b1因为setStartDelay()而在2秒内不可见,然后因为setDuration()而需要500毫秒才能淡入。