android广告轮播(循环滑动,定时滑动,动态加载indicator)
2016-05-10 10:29
429 查看
首先来看看我的布局:
然后在创建holder,把布局加载进去:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/vp_carousel_picture" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/ll_indicator" android:gravity="center" android:background="#66000000" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="20dp" android:layout_alignParentBottom="true" > </LinearLayout> </RelativeLayout>
然后在创建holder,把布局加载进去:
public class CarouselHolder extends BaseHolder<List<HomeHeaderModel.DataBean.AdvertListBean>>implements ViewPager.OnPageChangeListener { private ViewPager vp_carousel_picture; private List<HomeHeaderModel.DataBean.AdvertListBean> datas; private View view; boolean flag; private AuToRunTask runTask; private List<ImageView> mIndicator; private LinearLayout ll_indicator; /** * 创建界面 */ @Override public View initView() { view=View.inflate(Tools.getContext(),R.layout.carousel_picture,null); vp_carousel_picture=(ViewPager)view.findViewById(R.id.vp_carousel_picture); ll_indicator=(LinearLayout)view.findViewById(R.id.ll_indicator); return view; } /** * 根据数据刷新界面 * * @param data */ @Override public void refreshView(List<HomeHeaderModel.DataBean.AdvertListBean> data) { datas = data; initIndicator(); vp_carousel_picture.setAdapter(new CarouselAdapter()); setIndicator(0); vp_carousel_picture.setCurrentItem(2000 * datas.size());// 设置起始的位置 Integer.Max_Vlue/2 vp_carousel_picture.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: runTask.stop(); break; case MotionEvent.ACTION_CANCEL: // 事件的取消 case MotionEvent.ACTION_UP: runTask.start(); break; } return false; // viewPager 触摸事件 返回值要是false } }); runTask = new AuToRunTask(); runTask.start(); vp_carousel_picture.setOnPageChangeListener(this); } /** * 初始化小圆点 */ private void initIndicator() { mIndicator =new ArrayList<ImageView>(); for (int i=0;i<datas.size();i++){ ImageView img=new ImageView(Tools.getContext()); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(Tools.getDimens(R.dimen.indicator_height),Tools.getDimens(R.dimen.indicator_height)); params.setMargins(10,0,0,0); img.setLayoutParams(params); img.setImageResource(R.drawable.shape_point_red); ll_indicator.addView(img); mIndicator.add(img); } } private class CarouselAdapter extends PagerAdapter{ // 当前viewPager里面有多少个条目 LinkedList<SimpleDraweeView> convertView=new LinkedList<SimpleDraweeView>(); @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { SimpleDraweeView view=(SimpleDraweeView) object; convertView.add(view);// 把移除的对象 添加到缓存集合中 container.removeView(view); } @Override public Object instantiateItem(ViewGroup container, int position) { int index=position%datas.size(); SimpleDraweeView view; if(convertView.size()>0){ view=convertView.remove(0); }else{ view= new SimpleDraweeView(Tools.getContext()); } FrescoTool.loadImage(view, Constants.ImageResource.BASE_AD_URL + datas.get(index).getPath()); container.addView(view); // 加载的view对象 return view; // 返回的对象 } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) {setIndicator(position);} @Override public void onPageScrollStateChanged(int state) {} /** * 根据viewpager的position设置小圆点的位置 * @param position */ private void setIndicator(int position) { position %= datas.size(); //遍历mIndicator重置src为normal for (ImageView indicator : mIndicator){ indicator.setImageResource(R.drawable.shape_point_gray); } mIndicator.get(position).setImageResource(R.drawable.shape_point_red); } public class AuToRunTask implements Runnable{ @Override public void run() { if(flag){ Tools.cancel(this); // 取消之前 int currentItem = vp_carousel_picture.getCurrentItem(); currentItem++; vp_carousel_picture.setCurrentItem(currentItem); // 延迟执行当前的任务 Tools.postDelayed(this, 2000);// 递归调用 } } public void start(){ if(!flag){ Tools.cancel(this); // 取消之前 flag=true; Tools.postDelayed(this, 2000);// 递归调用 } } public void stop(){ if(flag){ flag=false; Tools.cancel(this); } } } }
相关文章推荐
- Android 编程下获得应用程序的签名
- Android ——对HandlerThread的理解和注意事项
- Android中图片的常识(一)
- Android内存泄漏
- Android中Activity和常用的ADB命令以及Android项目结构的认识
- Fragment学习基础
- Android Studio中获取SHA1或MD5的方法
- Android之解决在非Activity中使用startActivity
- Android--百度地图之基础地图(三)
- Android获取View的高宽的方式
- Android 学习资料收集
- Android AsyncTask的理解
- 文件上传
- 别再抱怨了,国内这么多优秀的Android资源你都知道吗?
- Android 简单存储 SharedPreferencesUtils
- Android 本地css引用
- android笔记--保存和恢复activity的状态数据
- Android消息处理机制——Looper、Handler、Message 源码分析
- Android 定义全局 ToastUtils
- android应用中去掉标题栏的方法