[英]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.