您的位置:首页 > 其它

超简单的首页广告轮播图

2016-01-11 11:13 411 查看
好多应用首页都有一个轮播的图片,有一种实现的方法就是用ViewPager去实现,将图片放到ViewPager中,然后通过Handler定时的发送一个消息,收到消息之后通过ViewPager的setCurrentItem(currentItem);方法来实现轮播。本项目将上述方法封装了一下,平时用的时候非常方便。

package com.hsm.bxt.widgets;

import android.content.Context;
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.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.hsm.bxt.R;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;

public class RollViewPager extends ViewPager {
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 PagerAdapter adapter;
private ImageLoader imageLoader;
/** 触摸时按下的点 **/
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);
// 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);
} 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();
myOnTouchListener = new MyOnTouchListener();
imageLoader = ImageLoader.getInstance();
}

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 {
imageLoader.displayImage(uriList.get(position),imageView);
}
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);
// }

}


项目下载地址 :https://github.com/caoweiaaa/RollViewPager
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: