package com.finddreams.baselib.view;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.finddreams.baselib.R;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.util.LogUtils;
/**
* @Description:自动播放的广告条,viewpager,带标题和滚动的小圆点,有点击事件
* @author http://blog.csdn.net/finddreams
*/
public class RollViewPager extends ViewPager {
private String TAG = "RollViewPager";
private Context context;
private int currentItem;
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 BitmapUtils bitmapUtils;
private PagerAdapter adapter;
/** 触摸时按下的点 **/
PointF downP = new PointF();
/** 触摸时当前的点 **/
PointF curP = new PointF();
private int abc = 1;
private float mLastMotionX;
private float mLastMotionY;
private float firstDownX;
private float firstDownY;
private boolean flag = false;
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);
Log.i("d", (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) {
onPagerClickCallback.onPagerClick(currentItem);
} else {
}
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);
LogUtils.d("in listview");
} 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 = (currentItem + 1)
% (isShowResImage ? resImageIds.length : uriList.size());
handler.obtainMessage().sendToTarget();
}
}
private 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.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();
bitmapUtils = new BitmapUtils(context);
bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565);
myOnTouchListener = new MyOnTouchListener();
}
public void setUriList(ArrayList<String> uriList) {
isShowResImage = false;
this.uriList = uriList;
}
public void notifyDataChange() {
adapter.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() {
if (!hasSetAdapter) {
hasSetAdapter = true;
this.setOnPageChangeListener(new MyOnPageChangeListener());
adapter = new ViewPagerAdapter();
this.setAdapter(adapter);
}
handler.postDelayed(viewPagerTask, 4000);
}
class MyOnPageChangeListener implements OnPageChangeListener {
int oldPosition = 0;
@Override
public void onPageSelected(int position) {
currentItem = position;
if (title != null)
title.setText(titles.get(position));
if (dots != null && dots.size() > 0) {
dots.get(position).setBackgroundResource(dot_focus_resId);
dots.get(oldPosition).setBackgroundResource(dot_normal_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();
}
@Override
public Object instantiateItem(View container, final int position) {
View view = View.inflate(context, R.layout.viewpager_item, null);
((ViewPager) container).addView(view);
view.setOnTouchListener(myOnTouchListener);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
if (isShowResImage) {
imageView.setImageResource(resImageIds[position]);
} else {
bitmapUtils.display(imageView, uriList.get(position));
}
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);
}
@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 onDetachedFromWindow() {
handler.removeCallbacksAndMessages(null);
super.onDetachedFromWindow();
}
public interface OnPagerClickCallback {
public abstract void onPagerClick(int position);
}
// @Override
// public boolean onTouchEvent(MotionEvent arg0) {
// // 每次进行onTouch事件都记录当前的按下的坐标
// curP.x = arg0.getX();
// curP.y = arg0.getY();
//
// if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
// // 记录按下时候的坐标
// // 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
// downP.x = arg0.getX();
// downP.y = arg0.getY();
// // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
// getParent().requestDisallowInterceptTouchEvent(true);
// }
//
// if (arg0.getAction() == MotionEvent.ACTION_MOVE) {
// // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
// getParent().requestDisallowInterceptTouchEvent(true);
// }
//
// if (arg0.getAction() == MotionEvent.ACTION_UP) {
// // 在up时判断是否按下和松手的坐标为一个点
// // 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
// if (downP.x == curP.x && downP.y == curP.y) {
// // onSingleTouch();
// return true;
// }
// }
//
// return super.onTouchEvent(arg0);
// }
}