package cn.shangyu.gdxzExpert.view; import android.content.Context; import android.graphics.PointF; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.ImageView; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import cn.shangyu.gdxzExpert.R; import cn.shangyu.gdxzExpert.utils.ImageOptions; import cn.shangyu.gdxzExpert.utils.LogUtil; public class RollViewPager extends ViewPager { private Context context; private int currentItem = Integer.MAX_VALUE / 2; private ArrayList uriList; private ArrayList dots; private TextView title; private ArrayList 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 pageradapter; /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); private int abc = 1; private float mLastMotionX; private float mLastMotionY; 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); LogUtil.i("ACTION_MOVE", (curP.x - downP.x) + "----" + (curP.y - downP.y)); /* * 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) { currentItem %= uriList.size(); if (currentItem < 0) { currentItem = uriList.size() + currentItem; } onPagerClickCallback.onPagerClick(currentItem); } else { onPagerClickCallback.onPagerClick(RollViewPager.this .getCurrentItem()); } 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 ++; // LogUtil.i("getCurrentItem="+RollViewPager.this.getCurrentItem()); currentItem = RollViewPager.this.getCurrentItem() + 1; // currentItem = (currentItem + 1) // % (isShowResImage ? resImageIds.length : uriList.size()); handler.obtainMessage().sendToTarget(); // startRoll(); } } public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { RollViewPager.this.setCurrentItem(currentItem); startRoll(); } }; public RollViewPager(Context context, ArrayList dots, int dot_focus_resId, int dot_normal_resId, OnPagerClickCallback onPagerClickCallback) { super(context); this.currentItem = 0; 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(); } public void setUriList(ArrayList uriList) { isShowResImage = false; this.uriList = uriList; } public void notifyDataChange() { pageradapter.notifyDataSetChanged(); } public ArrayList getDots() { return dots; } public void setDots(ArrayList dots) { this.dots = dots; } public void setResImageIds(int[] resImageIds) { isShowResImage = true; this.resImageIds = resImageIds; } public void setTitle(TextView title, ArrayList 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() { handler.removeCallbacksAndMessages(null); if (!hasSetAdapter) { hasSetAdapter = true; pageradapter = new ViewPagerAdapter(); this.setAdapter(pageradapter); // RollViewPager.this.setCurrentItem(Integer.MAX_VALUE/2 - // (Integer.MAX_VALUE/2%uriList.size())); // LogUtil.i("vvvvvvvvv="+(Integer.MAX_VALUE/2 - // (Integer.MAX_VALUE/2%uriList.size()))); this.setOnPageChangeListener(new MyOnPageChangeListener()); isRunning = true; } // LogUtil.i("sssss="+currentItem); // if (isRunning) { handler.postDelayed(viewPagerTask, 5000); // } } private boolean isRunning = false; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { LogUtil.i("isRunning==" + isRunning); this.isRunning = isRunning; } class MyOnPageChangeListener implements OnPageChangeListener { int oldPosition = 0; @Override public void onPageSelected(int position) { // ********** currentItem = position; position %= uriList.size(); if (position < 0) { position = uriList.size() + position; } if (title != null) title.setText(titles.get(position)); if (dots != null && dots.size() > 0) { dots.get(oldPosition).setBackgroundResource(dot_normal_resId); dots.get(position).setBackgroundResource(dot_focus_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(); // 设置成最大,使用户看不到边界 return Integer.MAX_VALUE; } @Override public Object instantiateItem(View container, int position) { // 对ViewPager页号求模取出View列表中要显示的项 position %= uriList.size(); if (position < 0) { position = uriList.size() + position; } View view = View.inflate(context, R.layout.viewpager_item, null); // 如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。 ViewParent vp = view.getParent(); if (vp != null) { ViewGroup parent = (ViewGroup) vp; parent.removeView(view); } ((ViewPager) container).addView(view); view.setOnTouchListener(myOnTouchListener); ImageView imageView = (ImageView) view.findViewById(R.id.image); imageView.setScaleType(ImageView.ScaleType.FIT_XY); if (isShowResImage) { imageView.setImageResource(resImageIds[position]); } else { if (!TextUtils.isEmpty(uriList.get(position))) { // 显示图片的配置 // DisplayImageOptions options = new // DisplayImageOptions.Builder() // .showImageOnLoading(R.drawable.home_scroll_default) // .showImageOnFail(R.drawable.home_scroll_default) // .showImageForEmptyUri(R.drawable.home_scroll_default) // //加载失败的图片 // .cacheInMemory(true) // .cacheOnDisk(true) // .bitmapConfig(Bitmap.Config.RGB_565) // .build(); ImageLoader.getInstance().displayImage(uriList.get(position),imageView,ImageOptions.getImageOptions(R.drawable.home_scroll_default)); } } 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); // Warning:不要在这里调用removeView } @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 onAttachedToWindow() { // // TODO Auto-generated method stub // super.onAttachedToWindow(); // } // @Override // protected void onDetachedFromWindow() { // handler.removeCallbacksAndMessages(null); // super.onDetachedFromWindow(); // } public void stopRunning() { if (viewPagerTask != null) { handler.removeCallbacks(viewPagerTask); handler.removeCallbacksAndMessages(null); } } public interface OnPagerClickCallback { public abstract void onPagerClick(int position); } }