373 lines
10 KiB
Java
373 lines
10 KiB
Java
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<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 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<View> 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<String> uriList) {
|
|
isShowResImage = false;
|
|
this.uriList = uriList;
|
|
}
|
|
|
|
public void notifyDataChange() {
|
|
pageradapter.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() {
|
|
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);
|
|
}
|
|
|
|
}
|