超简单的首页广告轮播图
2016-01-11 11:13
411 查看
好多应用首页都有一个轮播的图片,有一种实现的方法就是用ViewPager去实现,将图片放到ViewPager中,然后通过Handler定时的发送一个消息,收到消息之后通过ViewPager的setCurrentItem(currentItem);方法来实现轮播。本项目将上述方法封装了一下,平时用的时候非常方便。
项目下载地址 :https://github.com/caoweiaaa/RollViewPager
package com.hsm.bxt.widgets; import android.content.Context; import android.graphics.PointF; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.hsm.bxt.R; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; public class RollViewPager extends ViewPager { private Context context; private int currentItem; private ArrayList<String> uriList; private ArrayList<View> dots; private TextView title; private ArrayList<String> titles; private int[] resImageIds; private int dot_focus_resId; private int dot_normal_resId; private OnPagerClickCallback onPagerClickCallback; private boolean isShowResImage = false; MyOnTouchListener myOnTouchListener; ViewPagerTask viewPagerTask; private PagerAdapter adapter; private ImageLoader imageLoader; /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); private int abc = 1; private float mLastMotionX; private float mLastMotionY; private float firstDownX; private float firstDownY; private boolean flag = false; private long start = 0; public class MyOnTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { curP.x = event.getX(); curP.y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: start = System.currentTimeMillis(); handler.removeCallbacksAndMessages(null); // 记录按下时候的坐标 // 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 downP.x = event.getX(); downP.y = event.getY(); // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 // getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: handler.removeCallbacks(viewPagerTask); // if (Math.abs(curP.x - downP.x) > Math.abs(curP.y - downP.y) // && (getCurrentItem() == 0 || getCurrentItem() == getAdapter() // .getCount() - 1)) { // getParent().requestDisallowInterceptTouchEvent(false); // } else { // getParent().requestDisallowInterceptTouchEvent(false); // } // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 break; case MotionEvent.ACTION_CANCEL: // getParent().requestDisallowInterceptTouchEvent(false); startRoll(); break; case MotionEvent.ACTION_UP: downP.x = event.getX(); downP.y = event.getY(); long duration = System.currentTimeMillis() - start; if (duration <= 500 && downP.x == curP.x) { onPagerClickCallback.onPagerClick(currentItem); } else { } startRoll(); break; } return true; } } public boolean dispatchTouchEvent(MotionEvent ev) { final float x = ev.getX(); final float y = ev.getY(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); abc = 1; mLastMotionX = x; mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: if (abc == 1) { if (Math.abs(x - mLastMotionX) < Math.abs(y - mLastMotionY)) { abc = 0; getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: getParent().requestDisallowInterceptTouchEvent(false); break; } return super.dispatchTouchEvent(ev); } public class ViewPagerTask implements Runnable { @Override public void run() { currentItem = (currentItem + 1) % (isShowResImage ? resImageIds.length : uriList.size()); handler.obtainMessage().sendToTarget(); } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { RollViewPager.this.setCurrentItem(currentItem); startRoll(); } }; public RollViewPager(Context context, ArrayList<View> dots, int dot_focus_resId, int dot_normal_resId, OnPagerClickCallback onPagerClickCallback) { super(context); this.context = context; this.dots = dots; this.dot_focus_resId = dot_focus_resId; this.dot_normal_resId = dot_normal_resId; this.onPagerClickCallback = onPagerClickCallback; viewPagerTask = new ViewPagerTask(); myOnTouchListener = new MyOnTouchListener(); imageLoader = ImageLoader.getInstance(); } public void setUriList(ArrayList<String> uriList) { isShowResImage = false; this.uriList = uriList; } public void notifyDataChange() { adapter.notifyDataSetChanged(); } public ArrayList<View> getDots() { return dots; } public void setDots(ArrayList<View> dots) { this.dots = dots; } public void setResImageIds(int[] resImageIds) { isShowResImage = true; this.resImageIds = resImageIds; } public void setTitle(TextView title, ArrayList<String> titles) { this.title = title; this.titles = titles; if (title != null && titles != null && titles.size() > 0) title.setText(titles.get(0));// } private boolean hasSetAdapter = false; /** * */ public void startRoll() { if (!hasSetAdapter) { hasSetAdapter = true; this.setOnPageChangeListener(new MyOnPageChangeListener()); adapter = new ViewPagerAdapter(); this.setAdapter(adapter); } handler.postDelayed(viewPagerTask, 4000); } class MyOnPageChangeListener implements OnPageChangeListener { int oldPosition = 0; @Override public void onPageSelected(int position) { currentItem = position; if (title != null) title.setText(titles.get(position)); if (dots != null && dots.size() > 0) { dots.get(position).setBackgroundResource(dot_focus_resId); dots.get(oldPosition).setBackgroundResource(dot_normal_resId); } oldPosition = position; } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } } class ViewPagerAdapter extends PagerAdapter { @Override public int getCount() { return isShowResImage ? resImageIds.length : uriList.size(); } @Override public Object instantiateItem(View container, final int position) { View view = View.inflate(context, R.layout.viewpager_item, null); ((ViewPager) container).addView(view); view.setOnTouchListener(myOnTouchListener); ImageView imageView = (ImageView) view.findViewById(R.id.image); if (isShowResImage) { imageView.setImageResource(resImageIds[position]); } else { imageLoader.displayImage(uriList.get(position),imageView); } return view; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView((View) arg2); } @Override public void finishUpdate(View arg0) { } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } } @Override protected void onDetachedFromWindow() { handler.removeCallbacksAndMessages(null); super.onDetachedFromWindow(); } public interface OnPagerClickCallback { public abstract void onPagerClick(int position); } // @Override // public boolean onTouchEvent(MotionEvent arg0) { // // 每次进行onTouch事件都记录当前的按下的坐标 // curP.x = arg0.getX(); // curP.y = arg0.getY(); // // if (arg0.getAction() == MotionEvent.ACTION_DOWN) { // // 记录按下时候的坐标 // // 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 // downP.x = arg0.getX(); // downP.y = arg0.getY(); // // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 // getParent().requestDisallowInterceptTouchEvent(true); // } // // if (arg0.getAction() == MotionEvent.ACTION_MOVE) { // // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 // getParent().requestDisallowInterceptTouchEvent(true); // } // // if (arg0.getAction() == MotionEvent.ACTION_UP) { // // 在up时判断是否按下和松手的坐标为一个点 // // 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick // if (downP.x == curP.x && downP.y == curP.y) { // // onSingleTouch(); // return true; // } // } // // return super.onTouchEvent(arg0); // } }
项目下载地址 :https://github.com/caoweiaaa/RollViewPager
相关文章推荐
- writeToFile
- linux锁定系统重要文件
- js 标签事件写法
- Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]
- 高斯(核)函数简介
- Webwork 学习之路(四)Configuration 详解
- java中static作用详解
- common-pool2 使用
- iOS标准时间与时间戳相互转换
- Suid,sgid,sticky的三个权限的详细说明
- easyui-datetimebox默认显示当前时间
- mac操作系统更新SVN版本与IDEA兼容
- Android中EditText光标在4.0中的bug及解决方法
- RequireJS Adding a Library
- XPath 详解,总结
- 设置NavigationControl的字体和背景色
- Oracle数据库order by排序之null值处理方法
- 第一个androidAPP项目总结—数据请求
- js:argument
- 字符串首字母大小写变换