自定义控件之轮播图RollViewPager

来源:互联网 发布:上山下乡知乎 编辑:程序博客网 时间:2024/05/16 06:11
import java.util.List;import android.content.Context;import android.os.Handler;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.lidroid.xutils.BitmapUtils;import com.study.smartservice.R;import com.study.smartservice.adapter.MyPagerAdapter;public class RollViewPager extends ViewPager {private static final String tag = "RollViewPager";private MyAdapter myAdapter;private Context context;private List<String> imgUrlList;private List<String> titleList;private List<String> imgUrlSkipList;private TextView top_news_title;private BitmapUtils bitmapUtils;// 维护当前ViewPager指向的索引private int currentPager = 0;private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {// ViewPager指向索引界面RollViewPager.this.setCurrentItem(currentPager);startRoll();};};private OnViewClickListener viewClickListener;/** * 缓存机制:三级缓存:(1.内存(Map<url,Bitmap>,LRU算法) 2.文件(url) 3.网络) */public RollViewPager(Context context, final List<View> dotList,OnViewClickListener viewClickListener) {super(context);this.context = context;// this.dotList = dotList;bitmapUtils = new BitmapUtils(context);// 接口this.viewClickListener = viewClickListener;this.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {// 选中某一页后要去修改文字top_news_title.setText(titleList.get(position));// 切换点for (int i = 0; i < dotList.size(); i++) {if (position == i) {// 选中页面的点View view = dotList.get(position);view.setBackgroundResource(R.drawable.dot_focus);} else {View view = dotList.get(i);view.setBackgroundResource(R.drawable.dot_normal);}}}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}public RollViewPager(Context context, AttributeSet attrs) {super(context, attrs);}// 顶部轮播图文字集合对应数据,显示控件传递进来public void initTitle(List<String> titleList, TextView top_news_title) {if (titleList != null && top_news_title != null && titleList.size() > 0) {top_news_title.setText(titleList.get(0));}this.titleList = titleList;this.top_news_title = top_news_title;}public void initImgUrl(List<String> imgUrlList) {this.imgUrlList = imgUrlList;}public void initImgSkipUrl(List<String> imgUrlSkipList) {this.imgUrlSkipList = imgUrlSkipList;}// 数据填充数据适配器的操作public void startRoll() {if (myAdapter == null) {myAdapter = new MyAdapter(context, imgUrlList);this.setAdapter(myAdapter);} else {myAdapter.notifyDataSetChanged();}// 滚起来handler.postDelayed(new Runnable() {@Overridepublic void run() {// 维护一个ViewPager指向的索引currentPager = (currentPager + 1) % imgUrlList.size();// 发送一个空消息handler.obtainMessage().sendToTarget();// Log.i(tag, "scroll_run");}}, 2000);}int downX;int downY;// 事件分发@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:// 点击下去的时候,具体是刷新还是加载未知// 当前ViewPager对应的父控件不能去拦截事件getParent().requestDisallowInterceptTouchEvent(true);downX = (int) ev.getX();downY = (int) ev.getY();break;case MotionEvent.ACTION_MOVE:int moveX = (int) ev.getX();int moveY = (int) ev.getY();if (Math.abs(moveX - downX) > Math.abs(moveY - downY)) {// 如果x轴上的偏移量大于y轴偏移量(翻页,滑动ViewPager)int diff = moveX - downX;// System.out.println("moveX:"+moveX);// System.out.println("downX:"+downX);// System.out.println("diff:"+diff);if (diff > 0 && getCurrentItem() == 0) {// 向右滑动。出现左侧界面// 此时出现SlidingMenu 需要父控件响应事件Log.i(tag, "右滑+父响应");getParent().requestDisallowInterceptTouchEvent(false);} else if (diff > 0&& getCurrentItem() < getAdapter().getCount() - 1) {// 移动内部的ViewPager滑动轮播图Log.i(tag, "右滑+父不响应");getParent().requestDisallowInterceptTouchEvent(true);} else if (diff < 0&& getCurrentItem() == getAdapter().getCount() - 1) {Log.i(tag,"左滑+父响应");// 向左滑动// 父控件拦截事件,滑动到下一个模块getParent().requestDisallowInterceptTouchEvent(false);} else if (diff < 0&& getCurrentItem() < getAdapter().getCount() - 1) {Log.i(tag,"左滑+父不响应");getParent().requestDisallowInterceptTouchEvent(true);}} else {// 如果y轴上的偏移量大于x轴偏移量(刷新)getParent().requestDisallowInterceptTouchEvent(false);}break;}return super.dispatchTouchEvent(ev);}public interface OnViewClickListener {public void onViewClick(String url);}class MyAdapter extends MyPagerAdapter<String> {public MyAdapter(Context context, List<String> list) {super(context, list);}@Overridepublic Object instantiateItem(ViewGroup container, final int position) {View view = View.inflate(context, R.layout.viewpager_item, null);ImageView imageView = (ImageView) view.findViewById(R.id.image);// 网络获取图片bitmapUtils.display(imageView, imgUrlList.get(position));Log.i(tag, imgUrlList.get(position));// viewPager和内部view的时间交互过程// viewPager继承自viewGroup,所以事件默认向内部传递。// action_down先传递给内部的view,如果手指不动,抬起事件依然在view上;// action_down先传递给内部的view,如果手指滑动,事件优先传递给viewGroup,然后再传递给view,响应。// 如果移动到一定距离的时候,view就不再响应,转而响应Action_CANCEL,所有的事件在view上不响应。// 此时所有的事件(move,up)在viewGroup上响应,view.setOnTouchListener(new OnTouchListener() {private int downX;private long downTime;private int upX;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:handler.removeCallbacksAndMessages(null);// 点击事件downX = (int) event.getX();downTime = System.currentTimeMillis();break;case MotionEvent.ACTION_UP:upX = (int) event.getX();if (downX == upX&& System.currentTimeMillis() - downTime < 500) {// 响应点击事件,回调(先定义一个接口,暴露一个方法,谁用谁实现,实现完了在必要的地方调用)viewClickListener.onViewClick(imgUrlSkipList.get(position));}startRoll();break;case MotionEvent.ACTION_CANCEL:startRoll();break;}return true;}});container.addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}// 如果当前界面不可见调用@Overrideprotected void onDetachedFromWindow() {// handler不去发送消息handler.removeCallbacksAndMessages(null);super.onDetachedFromWindow();}}

以下为布局:使用LinearLayout代替了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="185dp" >    <!-- 放置轮播图片位置 -->    <LinearLayout        android:id="@+id/top_news_viewpager"        android:layout_width="fill_parent"        android:layout_height="185dp"        android:orientation="horizontal" />    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="30dp"        android:layout_alignParentBottom="true"        android:background="#88000000"        android:gravity="center_vertical"        android:orientation="horizontal" >        <!-- 放置图片标题的位置 -->        <TextView            android:id="@+id/top_news_title"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginLeft="5dp"            android:layout_marginRight="8dp"            android:layout_weight="1"            android:singleLine="true"            android:text="图片标题"            android:textColor="#F6F6F6" />        <!-- 放置图片中选中点的位置 -->        <LinearLayout            android:id="@+id/dots_ll"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginRight="5dp"            android:gravity="center"            android:orientation="horizontal" />    </LinearLayout></RelativeLayout>


0 0
原创粉丝点击