簡體   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