您的位置:首页 > 其它

Handler+Timer/TimerTask实现ViewPager的自动循环播放

2016-05-08 11:37 483 查看
ViewPager是android.support.v4中提供的空间,和IOS中的UIScrollView有类似的效果,ViewPager正常工作需要一个PagerAdapter。

PagerAdapter.java如下:

package com.mxd.studyandroid;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ViewPagerAdapter extends PagerAdapter
{

private ImageView[] datas;

public ViewPagerAdapter(ImageView[] datas)
{
this.datas = datas;
}

@Override
public int getCount()
{
return datas.length;
}

@Override
public boolean isViewFromObject(View view, Object obj)
{
return view == obj;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
container.removeView(datas[position]);
}

@Override
public Object instantiateItem(ViewGroup container, int position)
{
container.addView(datas[position], 0);
return datas[position];
}
}


在xml文件中引入ViewPager空间:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btnStop"
android:layout_width="match_parent"
android:layout_height="43.0dip"
android:layout_marginTop="20.0dip"
android:text="STOP" />

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="200.0dip"
android:layout_height="200.0dip"
android:layout_centerInParent="true" />

</RelativeLayout>


1. 使用Handler+Timer+TimerTask实现ViewPager的自动切换:

public class ViewPagerActivity extends Activity
{

@SuppressLint("HandlerLeak")
Handler handler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
if (msg.what == 0x1)
{
viewpager.setCurrentItem(index % pagerCount, true);
}
};
};

ViewPager viewpager;
Button btnStop;

int[] imageBgs = new int[]
{ R.drawable.weather_0, R.drawable.weather_1, R.drawable.weather_2, R.drawable.weather_3, R.drawable.weather_4 };
ImageView[] imgDatas = new ImageView[imageBgs.length]; // 装载ViewPager中加载的ImageView视图

Timer pagerTimer = null;
// index每隔1s自加1,pagerCount为ViewPager中的Pager数量
int index = 0, pagerCount = imgDatas.length;

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

viewpager = (ViewPager) findViewById(R.id.viewpager);
// 初始化ViewPager中加载的ImageView
for (int i = 0, count = imageBgs.length; i < count; i++)
{
ImageView img = new ImageView(getApplicationContext());
img.setScaleType(ImageView.ScaleType.FIT_XY);
img.setBackgroundResource(imageBgs[i]);
imgDatas[i] = img;
}

ViewPagerAdapter adapter = new ViewPagerAdapter(imgDatas);
viewpager.setAdapter(adapter);
viewpager.setCurrentItem(0);
// viewpager.setCurrentItem(0, true); 是否smoothScroll

pagerTimer = new Timer(); // 用于循环ViewPager的Timer
pagerTimer.schedule(new TimerTask()
{
@Override
public void run()
{
index++;
handler.sendEmptyMessage(0x1);
}
}, 1000, 2000); // TimerTask, long delay, long period

btnStop = (Button) findViewById(R.id.btnStop);
btnStop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
pagerTimer.cancel();
}
});
}
}


[注意]

此处不能在TimerTask的run()方法中进行 viewPager.setCurrentItem(pagerIndex, true)更新UI的操作,new TimerTask是开启了一个子线程,非UIThread中更新UI回报错。

2.只使用Handler实现ViewPager的自动切换:

public class ViewPagerActivity extends Activity
{

@SuppressLint("HandlerLeak")
Handler handler = new Handler();

ViewPager viewpager;
Button btnStop;

int[] imageBgs = new int[]
{ R.drawable.weather_0, R.drawable.weather_1, R.drawable.weather_2, R.drawable.weather_3, R.drawable.weather_4 };
ImageView[] imgDatas = new ImageView[imageBgs.length]; // 装载ViewPager中加载的ImageView视图

// index每隔1s自加1,pagerCount为ViewPager中的Pager数量
int index = 0, pagerCount = imgDatas.length;

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

viewpager = (ViewPager) findViewById(R.id.viewpager);
// 初始化ViewPager中加载的ImageView
for (int i = 0, count = imageBgs.length; i < count; i++)
{
ImageView img = new ImageView(getApplicationContext());
img.setScaleType(ImageView.ScaleType.FIT_XY);
img.setBackgroundResource(imageBgs[i]);
imgDatas[i] = img;
}

ViewPagerAdapter adapter = new ViewPagerAdapter(imgDatas);
viewpager.setAdapter(adapter);
viewpager.setCurrentItem(0);
// viewpager.setCurrentItem(0, true); 是否smoothScroll

handler.post(updatePagerRunnable); // 开启ViewPager的循环

btnStop = (Button) findViewById(R.id.btnStop);
btnStop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
handler.removeCallbacks(updatePagerRunnable);
}
});
}

private Runnable updatePagerRunnable = new Runnable()
{
@Override
public void run()
{
index++;
viewpager.setCurrentItem(index % pagerCount, true);
handler.postDelayed(updatePagerRunnable, 1000);
}
};
}


[注意]

此处可以不用实现Handler中的handlerMessage(Message)方法,因为我们只是使用了Handler内部的Looper自带的MessageQueue,通知UIThread去更新ViewPager的显示。

上面两种方法实现的效果是一样的:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: