您的位置:首页 > 理论基础 > 计算机网络

ViewPager+RadioGroup 实现网络加载图片的轮播

2016-11-30 12:03 375 查看
废话不多说 先上图  实现了轮播和定时播放 网络加载图片 实现了三级缓存



布局文件  (这里实现了radioGroup的动态添加radioButton)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="com.example.android_day18_viewpager02.MainActivity" >

    <android.support.v4.view.ViewPager

        android:id="@+id/viewPager"

        android:layout_width="match_parent"

        android:layout_height="match_parent" />

    <RadioGroup

        android:id="@+id/rg"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"

        android:layout_centerHorizontal="true"

        android:layout_marginBottom="30dp"

        android:orientation="horizontal" >

    </RadioGroup>

</RelativeLay>

部分核心代码如下:

Timer定时器 实现的图片定时播放

timer = new Timer();
/*
* 1.被关闭过的timer  就不能使用他再次开启
* 2.TimerTask 用过了,就不能再用!
*
*/
timer.schedule(new TimerTask() {

@Override
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
// 主线程
@Override
public void run() {
// TODO Auto-generated method stub
int currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页

int count = adapter.getCount(); // 总共有多少条

// 0123 4
if (currentItem == (count - 1)) {
// 如果使用第二个参数,单条显示Fragment数据可能无法加载!
viewPager.setCurrentItem(0);
} else {
currentItem++;
viewPager.setCurrentItem(currentItem);
}
}
});
}
}, 2000, 2000);
ViewPager的触摸监听

//触摸监听
viewPager.setOnTouchListener(new OnTouchListener() {
/**
* 参数1: ViewPager 调用者
* 参数2: 记录触摸的事件  包含: 触摸的xy 触摸的动作: down move up
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
// 获取触摸动作
int action  = event.getAction();

switch (action) {
case MotionEvent.ACTION_DOWN:
//按下
//停止定时器
timer.cancel(); //关闭
break;

case MotionEvent.ACTION_UP:
//抬起
//开启定时器
timer = new Timer(); //新创建一个对象
timer.schedule(new TimerTask() {

@Override
public void run() {
// TODO Auto-generated method stub

runOnUiThread(new Runnable() {
// 主线程
@Override
public void run() {
// TODO Auto-generated method stub
int currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页

int count = adapter.getCount(); // 总共有多少条

// 0123 4
if (currentItem == (count - 1)) {
// 如果使用第二个参数,单条显示Fragment数据可能无法加载!
viewPager.setCurrentItem(0);
} else {
currentItem++;
viewPager.setCurrentItem(currentItem);
}
}
});

}
}, 2000, 2000);

break;
}

return false;
}
});
  ViewPager的状态改变监听

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
//改变后是第几页
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub

((RadioButton)rGroup.getChildAt(arg0)).setChecked(true);

}

//获取拉取偏移量
@Override
public void onPageScrolled(int position, float arg1, int arg2) {
// TODO Auto-generated method stub

}

//状态改变
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub

}
});


RadioGroup 的监听事件

//点击RadioButton 把ViewPager切换到当前的页面
rGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub

//选中的是第几个RadioButton

for (int i = 0; i < group.getChildCount(); i++) {
//得到子控件
RadioButton button = (RadioButton) group.getChildAt(i);

if (button.isChecked()) {

//把选中的位置,设置为ViewPager显示的位置
viewPager.setCurrentItem(i);

break;
}

}

}
});


根据添加图片的多少  动态添加RadioGroup的RadioButton

for (int i = 0; i < imageurls.length; i++) {
//添加点
RadioButton  button = new  RadioButton(this);
button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
rGroup.addView(button);
if (i==0) {
button.setChecked(true);  //第一个默认选中
}
}
适配器

@Override
public View instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub

View ret = null;

//创建一个视图  ImageView
ImageView imageView = new ImageView(context);

imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

imageView.setScaleType(ScaleType.FIT_XY);

String url = images[position]; //取到网址
Bitmap bitmap = utils.getBitmap(url); //看下缓存中是否存在图片

if (bitmap == null) {
//内存没有需要下载
imageView.setImageResource(R.drawable.ic_launcher);
new ImageTask(imageView).execute(url);

}else{
imageView.setImageBitmap(bitmap);
}

ret = imageView;
//添加到容器中
container.addView(ret);
return ret;
}


以上是主要的核心代码  有时间的猿们可以看看  如果急需代码 一下是所有的代码

MainActivity.java

/*
* 带循环轮播的广告,并且底部有RadioGroup
*
* ViewPager显示
*
* 定时器
*
* RadioGroup显示联动
*
*/
public class MainActivity extends Activity {

private ViewPager viewPager;
private MyAdapter adapter;

private RadioGroup rGroup;

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

viewPager = (ViewPager) findViewById(R.id.viewPager);

rGroup = (RadioGroup) findViewById(R.id.rg);

initRadioButton(); //往RadioGroup内部动态添加小点
initListener(); //初始化监听事件

adapter = new MyAdapter(imageurls, this);

viewPager.setAdapter(adapter);

timer = new Timer();
/*
* 1.被关闭过的timer 就不能使用他再次开启
* 2.TimerTask 用过了,就不能再用!
*
*/
timer.schedule(new TimerTask() {

@Override
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
// 主线程
@Override
public void run() {
// TODO Auto-generated method stub
int currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页

int count = adapter.getCount(); // 总共有多少条

// 0123 4
if (currentItem == (count - 1)) {
// 如果使用第二个参数,单条显示Fragment数据可能无法加载!
viewPager.setCurrentItem(0);
} else {
currentItem++;
viewPager.setCurrentItem(currentItem);
}
}
});
}
}, 2000, 2000);
4000

//触摸监听 viewPager.setOnTouchListener(new OnTouchListener() { /** * 参数1: ViewPager 调用者 * 参数2: 记录触摸的事件 包含: 触摸的xy 触摸的动作: down move up */ @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub // 获取触摸动作 int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: //按下 //停止定时器 timer.cancel(); //关闭 break; case MotionEvent.ACTION_UP: //抬起 //开启定时器 timer = new Timer(); //新创建一个对象 timer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub runOnUiThread(new Runnable() { // 主线程 @Override public void run() { // TODO Auto-generated method stub int currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页 int count = adapter.getCount(); // 总共有多少条 // 0123 4 if (currentItem == (count - 1)) { // 如果使用第二个参数,单条显示Fragment数据可能无法加载! viewPager.setCurrentItem(0); } else { currentItem++; viewPager.setCurrentItem(currentItem); } } }); } }, 2000, 2000); break; } return false; } });}

private void initListener() {
// TODO Auto-generated method stub

viewPager.setOnPageChangeListener(new OnPageChangeListener() { //改变后是第几页 @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub ((RadioButton)rGroup.getChildAt(arg0)).setChecked(true); } //获取拉取偏移量 @Override public void onPageScrolled(int position, float arg1, int arg2) { // TODO Auto-generated method stub } //状态改变 @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } });

//点击RadioButton 把ViewPager切换到当前的页面 rGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub //选中的是第几个RadioButton for (int i = 0; i < group.getChildCount(); i++) { //得到子控件 RadioButton button = (RadioButton) group.getChildAt(i); if (button.isChecked()) { //把选中的位置,设置为ViewPager显示的位置 viewPager.setCurrentItem(i); break; } } } });

}

private void initRadioButton() {
// TODO Auto-generated method stub

for (int i = 0; i < imageurls.length; i++) {
//添加点
RadioButton button = new RadioButton(this);
button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
rGroup.addView(button);
if (i==0) {
button.setChecked(true); //第一个默认选中
}
}

}

public String imageurls[] = new String[] {
"http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383264_3954.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383264_4787.jpg" };
private Timer timer;
}


 MyAdapter.java 代码  适配器

/**
*
* ViewPager
*
* pagerAdapter
* FragmentPagerAdapter
* FragmentStateAdapter
*
* @author Administrator
*
*/
public class MyAdapter extends PagerAdapter{

private String [] images;
private Context context;

private LruCacheUtils utils;

public MyAdapter(String[] images, Context context) {
this.images = images;
this.context = context;
utils = LruCacheUtils.getInstance(); //得到缓存工具类
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return images != null?images.length:0;
}
/*
* 1.修改返回值
*
*
*/
@Override public View instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub View ret = null; //创建一个视图 ImageView ImageView imageView = new ImageView(context); imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); imageView.setScaleType(ScaleType.FIT_XY); String url = images[position]; //取到网址 Bitmap bitmap = utils.getBitmap(url); //看下缓存中是否存在图片 if (bitmap == null) { //内存没有需要下载 imageView.setImageResource(R.drawable.ic_launcher); new ImageTask(imageView).execute(url); }else{ imageView.setImageBitmap(bitmap); } ret = imageView; //添加到容器中 container.addView(ret); return ret; }
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}

/**
* 1.去掉 super
* 2.
*
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {

if (object instanceof View) {
View view = (View) object;
container.removeView(view); //移除
}

}


网络请求 记载图片  这是使用的是异步任务加载

//异步任务
class ImageTask extends AsyncTask<String, Void, Bitmap>{

private ImageView imageView;

public ImageTask(ImageView imageView) {
this.imageView = imageView;
}

@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub

try {
URL url = new URL(params[0]);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

if (connection.getResponseCode() == 200) {

InputStream inputStream = connection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//保存一份
utils.putBitmap(params[0], bitmap);
return bitmap;
}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

if (result != null) {
imageView.setImageBitmap(result);
}

}

}
图片显示的不是很全, 这里使用了LruCache进行图片的缓存处理,使图片加载的更加顺溜《这是使用了三级缓存》

/**
*
* ViewPager
*
* pagerAdapter
* FragmentPagerAdapter
* FragmentStateAdapter
*
* @author Administrator
*
*/
public class MyAdapter extends PagerAdapter{

private String [] images;
private Context context;

private LruCacheUtils utils;

public MyAdapter(String[] images, Context context) {
this.images = images;
this.context = context;
utils = LruCacheUtils.getInstance(); //得到缓存工具类
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return images != null?images.length:0;
}
/*
* 1.修改返回值
*
*
*/
@Override public View instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub View ret = null; //创建一个视图 ImageView ImageView imageView = new ImageView(context); imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); imageView.setScaleType(ScaleType.FIT_XY); String url = images[position]; //取到网址 Bitmap bitmap = utils.getBitmap(url); //看下缓存中是否存在图片 if (bitmap == null) { //内存没有需要下载 imageView.setImageResource(R.drawable.ic_launcher); new ImageTask(imageView).execute(url); }else{ imageView.setImageBitmap(bitmap); } ret = imageView; //添加到容器中 container.addView(ret); return ret; }
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}

/**
* 1.去掉 super
* 2.
*
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {

if (object instanceof View) {
View view = (View) object;
container.removeView(view); //移除
}

}

//异步任务
class ImageTask extends AsyncTask<String, Void, Bitmap>{

private ImageView imageView;

public ImageTask(ImageView imageView) {
this.imageView = imageView;
}

@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub

try {
URL url = new URL(params[0]);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

if (connection.getResponseCode() == 200) {

InputStream inputStream = connection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//保存一份
utils.putBitmap(params[0], bitmap);
return bitmap;
}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

if (result != null) {
imageView.setImageBitmap(result);
}

}

}
  以上就是全部代码  希望能帮助到大家, 一起学习
希望在技术的道路上 能于君共勉 越走越远
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ViewPager radiogr
相关文章推荐