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

来源:互联网 发布:软件商店开发 编辑:程序博客网 时间:2024/05/16 18:00

废话不多说 先上图  实现了轮播和定时播放 网络加载图片 实现了三级缓存

布局文件  (这里实现了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() {@Overridepublic void run() {// TODO Auto-generated method stubrunOnUiThread(new Runnable() {// 主线程@Overridepublic void run() {// TODO Auto-generated method stubint currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页int count = adapter.getCount(); // 总共有多少条// 0123 4if (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 */@Overridepublic 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() {@Overridepublic void run() {// TODO Auto-generated method stubrunOnUiThread(new Runnable() {// 主线程@Overridepublic void run() {// TODO Auto-generated method stubint currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页int count = adapter.getCount(); // 总共有多少条// 0123 4if (currentItem == (count - 1)) {// 如果使用第二个参数,单条显示Fragment数据可能无法加载!viewPager.setCurrentItem(0);} else {currentItem++;viewPager.setCurrentItem(currentItem);}}});}}, 2000, 2000);break;}return false;}});
  ViewPager的状态改变监听


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


RadioGroup 的监听事件


//点击RadioButton 把ViewPager切换到当前的页面rGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic 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);  //第一个默认选中}}
适配器

@Overridepublic View instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubView 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; @Overrideprotected 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() {@Overridepublic void run() {// TODO Auto-generated method stubrunOnUiThread(new Runnable() {// 主线程@Overridepublic void run() {// TODO Auto-generated method stubint currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页int count = adapter.getCount(); // 总共有多少条// 0123 4if (currentItem == (count - 1)) {// 如果使用第二个参数,单条显示Fragment数据可能无法加载!viewPager.setCurrentItem(0);} else {currentItem++;viewPager.setCurrentItem(currentItem);}}});}}, 2000, 2000);//触摸监听 viewPager.setOnTouchListener(new OnTouchListener() {/** * 参数1: ViewPager 调用者 * 参数2: 记录触摸的事件  包含: 触摸的xy 触摸的动作: down move up */@Overridepublic 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() {@Overridepublic void run() {// TODO Auto-generated method stubrunOnUiThread(new Runnable() {// 主线程@Overridepublic void run() {// TODO Auto-generated method stubint currentItem = viewPager.getCurrentItem(); // 得到ViewPager当前显示第几页int count = adapter.getCount(); // 总共有多少条// 0123 4if (currentItem == (count - 1)) {// 如果使用第二个参数,单条显示Fragment数据可能无法加载!viewPager.setCurrentItem(0);} else {currentItem++;viewPager.setCurrentItem(currentItem);}}});}}, 2000, 2000);break;}return false;}});}private void initListener() {// TODO Auto-generated method stubviewPager.setOnPageChangeListener(new OnPageChangeListener() {//改变后是第几页@Overridepublic void onPageSelected(int arg0) {// TODO Auto-generated method stub((RadioButton)rGroup.getChildAt(arg0)).setChecked(true);}//获取拉取偏移量@Overridepublic void onPageScrolled(int position, float arg1, int arg2) {// TODO Auto-generated method stub}//状态改变@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}});//点击RadioButton 把ViewPager切换到当前的页面rGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic 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 stubfor (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(); //得到缓存工具类}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn images != null?images.length:0;}   /*    * 1.修改返回值    *     *     */@Overridepublic View instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubView 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;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}/** * 1.去掉 super * 2. *  */@Overridepublic 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;}@Overrideprotected Bitmap doInBackground(String... params) {// TODO Auto-generated method stubtry {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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}   @Overrideprotected void onPostExecute(Bitmap result) {// TODO Auto-generated method stubsuper.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(); //得到缓存工具类}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn images != null?images.length:0;}   /*    * 1.修改返回值    *     *     */@Overridepublic View instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubView 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;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}/** * 1.去掉 super * 2. *  */@Overridepublic 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;}@Overrideprotected Bitmap doInBackground(String... params) {// TODO Auto-generated method stubtry {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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}   @Overrideprotected void onPostExecute(Bitmap result) {// TODO Auto-generated method stubsuper.onPostExecute(result);     if (result != null) {imageView.setImageBitmap(result);}}}
  以上就是全部代码  希望能帮助到大家, 一起学习
希望在技术的道路上 能于君共勉 越走越远



0 0
原创粉丝点击