33
This commit is contained in:
@@ -0,0 +1,372 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user