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