1

我正在尝试制作一个简单的幻灯片,无需单击按钮即可淡出并淡入一些图像。我找到了一些示例来帮助我,但我无法让第一张图像淡入第二张图像。截至目前,它只是淡出,仅此而已。我在下面有我的代码。

淡入淡出.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. 这是因为该方法接受第三个参数为毫秒。为了得到 5 秒,我们必须将 5 乘以 1,000,结果是,你猜对了,5,000。通过传递第二个参数 as要求计时器立即启动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到这里的原因。最后,里面是另一个调用 OP 的方法的可运行文件slideshow()

于 2013-08-12T07:44:13.097 回答