繁体   English   中英

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

[英]Pause Between Making ImageView Invisible and Visible Android

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

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

  1. 消失
  2. 将一个添加到玩家评分
  3. 重新显示玩家分数
  4. 重新出现几秒钟的延迟

我的问题是,无论我做什么,它都不会明显消失。 我宁愿远离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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM