Java 在使ImageView不可见和可见之间暂停

Java 在使ImageView不可见和可见之间暂停,java,android,imageview,sleep,Java,Android,Imageview,Sleep,我正在编写一个Android应用程序,在编写应用程序的主要部分时遇到了一个问题 我需要让ImageView消失一两秒钟,然后在点击时重新出现。攻丝部分工作正常,我使用XML使其可点击,然后在点击时调用一个方法。问题在于我调用的方法。我需要它: 消失 将一个添加到PlayerCore 重新显示playerscore 以几秒钟的延迟重新出现 我的问题是,无论我做什么,它都不会明显消失。我更喜欢远离Thread.sleep(),因为我希望用户能够在它不可见的情况下点击其他东西(如果我误解了Thread

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

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

  • 消失
  • 将一个添加到PlayerCore
  • 重新显示playerscore
  • 以几秒钟的延迟重新出现
  • 我的问题是,无论我做什么,它都不会明显消失。我更喜欢远离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);
        }
        }
    

    更新

    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,贬值的方法意味着该方法仍然有效,但谷歌决定