2013-05-28 92 views
1

我試圖做一個簡單的幻燈片,淡出和淡入一些圖像沒有按鈕點擊。我發現了幾個例子來幫助我,但我無法讓第一張圖像淡入第二張圖像。到目前爲止,它只是淡出,就是這樣。下面我有我的代碼。使用ViewSwitcher的Android圖像幻燈片

fade_in.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <alpha 
     android:fromAlpha="0.1" 
     android:toAlpha="1.0" 
     android:duration="5000" 
     android:repeatCount="infinite" 
     /> 
</set> 

fade_out.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <alpha 
     android:fromAlpha="1.0" 
     android:toAlpha="0.1" 
     android:duration="5000" 
     android:repeatCount="infinite" 
     /> 
</set> 

layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/switcher" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:inAnimation="@anim/fade_in" 
    android:outAnimation="@anim/fade_out" > 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" 
     android:src="@drawable/image1" /> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" 
     android:src="@drawable/image2" /> 
</ViewSwitcher> 

MainClass.Activity

public class MainClass extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.next); 

     slideshow(); 
    } 

    public void slideshow() { 
     ViewSwitcher switching = (ViewSwitcher)findViewById(R.id.switcher); 
     if (switching.getDisplayedChild() == 0) { 
      switching.showNext(); 
     } else { 
      switching.showPrevious(); 
     } 
    } 

} 

回答

3

在這種情況下,您需要使用timer。你這樣使用它:

public class MainClass extends Activity { 

    private Timer timer; 
    private ViewSwitcher switching; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.next); 

     switching = (ViewSwitcher)findViewById(R.id.switcher); 

     timer = new Timer(); 
     timer.scheduleAtFixedRate(new NextImageTask(), 0, 5000); 
     //5000 is in milliseconds, meaning 5 seconds 

    } 

    public void slideshow() { 
     if (switching.getDisplayedChild() == 0) { 
      switching.showNext(); 
     } else { 
      switching.showPrevious(); 
     } 
    } 

    private class NextImageTask extends TimerTask { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        slideshow(); 
       } 
      }); 
     } 
    } 
} 

這段代碼是做什麼的?那麼,讓我們一步一步來看看。首先聲明的意見

private Timer timer; 
private ViewSwitcher switching; 

然後初始化它們在onCreate方法

switching = (ViewSwitcher)findViewById(R.id.switcher); 

timer = new Timer(); 

然後,我們開始計時!要啓動計時器,並告訴它做什麼,我們做它像這樣

timer.scheduleAtFixedRate(new NextImageTask(), 0, 5000); 

這行代碼基本上意味着嘿定時器,安排任務,在5秒的固定利率。立即開始!

第一個參數是要安排的任務,一個對象,NextImageTask()。該對象包含一個Runnable,其中包含要運行每個時間間隔的代碼。間隔是固定的5秒。但在代碼中,它被寫爲5000。這是因爲該方法接受第三個參數爲毫秒。要得到5秒,我們必須乘以5乘1000,結果是,你猜對了,5000。通過傳遞第二個參數0,定時器被要求立即開始。這是延遲。如果您通過2000,計時器將在2秒延遲後開始。就像第三個參數一樣,該方法接受第二個參數爲毫秒

接下來是與OP相同的方法slideshow()。這是OP想要做的。

最後是私人對象NextImageTask()

private class NextImageTask extends TimerTask { 

    @Override 
    public void run() { 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       slideshow(); 
      } 
     }); 
    } 
} 

這是定時器以固定速率/每5秒完成的任務。它應該延長TimerTask讓計時器正常工作。 TimerTask是一個抽象類,所以NextImageTask()應實現一種方法,即run()方法。該方法應包含計時器以固定間隔運行的代碼。這在不同的線程上運行,所以如果你需要像UI的情況那樣在UI中做一些事情,我們需要在UI線程上運行。這就是我們在這裏稱爲runOnUiThread的原因。最後,裏面是另一個可運行的調用OP的方法slideshow()