This commit is contained in:
2025-11-18 15:12:24 +08:00
parent c173c425ce
commit a7d2035e70
1361 changed files with 367452 additions and 0 deletions
@@ -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);
}
}