1

ボタンをクリックせずにいくつかの画像をフェードアウトおよびフェードインする単純なスライドショーを作成しようとしています。役立つ例をいくつか見つけましたが、最初の画像が 2 番目の画像にフェードインするのに問題があります。今のところ、フェードアウトするだけです。私は以下のコードを持っています。

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>

フェードアウト.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>

レイアウト.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();
        }
    }

}
4

1 に答える 1

3

その場合は、タイマーを使用する必要があります。次のように使用します。

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ます。これは、メソッドが 3 番目の引数をミリ秒として受け入れるためです。5 秒を取得するには、5 に 1,000 を掛ける必要があります。その結果、5,000 になります。タイマーは、2 番目の引数を として渡すことによって、すぐに開始する0ように求められます。これが遅延です。そこを通過2000すると、2 秒遅れてタイマーが開始されます。3 番目の引数と同様に、メソッドはこの 2 番目の引数をミリ秒として受け入れます。

次はslideshow()OPと同じ方法です。これがOPがやりたいことです。

最後はプライベート オブジェクトですNextImageTask()

private class NextImageTask extends TimerTask {

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

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

これは、タイマーによって固定レート/5 秒ごとに実行されるタスクです。タイマーが適切に動作するように、 TimerTaskを拡張する必要があります。TimerTaskは抽象クラスであるため、NextImageTask()1 つのメソッド (メソッド) を実装する必要がありrun()ます。このメソッドには、タイマーが一定の間隔で実行されるコードが含まれている必要があります。これは別のスレッドで実行されるため、OP の場合と同じように UI で何かを行う必要がある場合は、UI スレッドで実行する必要があります。これが私たちがここに電話した理由runOnUiThreadです。最後に、内部には OP のメソッドを呼び出す別のランナブルがありslideshow()ます。

于 2013-08-12T07:44:13.097 に答える