使用ViewSwitcher的Android图像幻灯片

时间:2013-05-28 19:49:02

标签: android animation slideshow viewswitcher

我正在尝试制作一个简单的幻灯片,在没有按钮点击的情况下淡出并淡化几张图像。我找到了一些例子来帮助我,但是我无法让第一张图像淡入第二张图像。截至目前,它只是淡出,就是这样。我的代码如下。

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();
        }
    }

}

1 个答案:

答案 0 :(得分: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乘以1,000,结果是,你猜对了,5000。通过传递第二个参数0,要求计时器立即启动。这是延误。如果你在那里通过2000,计时器将在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()应该实现一个方法run()方法。此方法应包含计时器将以固定间隔运行的代码。这在不同的线程上运行,因此如果您需要在UI中执行某些操作,就像OP的情况一样,我们需要在UI线程上运行。这就是我们在这里调用runOnUiThread的原因。最后,inside是另一个runnable调用OP的方法slideshow()