在第一次写项目的时候,客户提出了这个需求,所以就在网上查找现成的解决办法。也用过几个别的案例,不过效果都不好,于是就多方结合修改最终完善。
在Activity中加入初始化组件的代码
private void initAutoViewPager() {
autoViewPager.isHavaPoint(true);
//父控件没有ScrollView时不用设置
autoViewPager.setScrollView(scrollView);
//引入数据的格式可以自定义
autoViewPager.setData(list);
}
在布局文件中加入
<com.gravin.AutoViewPager
android:id="@+id/home_ad"
android:layout_width="match_parent"
android:layout_height="@dimen/viewpager_height" />
在原有的代码中加入上述代码就可以实现图片轮播的效果了。
核心代码
package com.gravin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;
/**
* 滑动广告
*
* @author Gavin
*
*/
public class AutoViewPager extends FrameLayout {
private Context mContext = null;
private boolean isHavaPoint=true;
private boolean mIsSwitched = false;
//存放子视图
private ArrayList<View> mPageViews = null;
private ViewGroup mPointsViewGroup = null;
private ViewPager mViewPager = null;
private ScrollView mScroll = null;
//图片切换间隔
private long time=1000;
private GuidePageAdapter mGuidePageAdapter = null;
//存放要显示的数据
private ArrayList<HashMap<String, Object>> data = null;
private ImageView[] mPointViews = null;
private GuidePageChangeListener mGuidePageChangeListener = null;
private Timer mTimer = null;
public AutoViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public AutoViewPager(Context context) {
super(context);
mContext = context;
}
/**
* 引入父控件中的ScrollView
*/
public void setScrollView(ScrollView scrollView) {
mScroll = scrollView;
}
private void init() {
LayoutInflater.from(mContext).inflate(R.layout.viewpager, this, true);
//用于存放页面指示器的控件
mPointsViewGroup = (ViewGroup) findViewById(R.id.viewpager_PointsLayout);
mViewPager = (ViewPager) findViewById(R.id.viewpager_ViewPager);
mViewPager.setAdapter(getGuidePageAdapter());
mViewPager.setOnPageChangeListener(getGuidePageChangeListener());
//防止与ScrollView冲突
if (mScroll != null) {
mViewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mIsSwitched=true;
mScroll.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
mIsSwitched=true;
mScroll.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
mScroll.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
}
mPageViews = new ArrayList<View>();
for (int m = 0; m < data.size(); m++) {
View view = LayoutInflater.from(mContext).inflate(R.layout.viewpager_subview, null);
//显示图片的ImageView
ImageView img = (ImageView) view.findViewById(R.id.viewpager_subview_img);
final HashMap<String, Object> map = data.get(m);
img.setBackgroundResource(Integer.valueOf(map.get("img").toString()));
//ImageLoader.getInstance().displayImage(map.get("pic").toString(),img);
view.setClickable(true);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, map.get("img").toString(), Toast.LENGTH_SHORT).show();
}
});
mPageViews.add(view);
}
//及时通知Adapter数据更新
mGuidePageAdapter.notifyDataSetChanged();
if (isHavaPoint) {
mPointViews = new ImageView[data.size()];
ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(15, 15);
mp.setMargins(5, 0, 5,0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp);
for (int i = 0; i < data.size(); i++) {
ImageView imageView = new ImageView(mContext);
mPointViews[i] = imageView;
if (i == 0) {
// 默认选中第一张图片
mPointViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
} else {
mPointViews[i].setBackgroundResource(R.drawable.page_indicator);
}
mPointsViewGroup.addView(mPointViews[i],params);
}
}
//开始轮播
startTimer();
}
/**
* 是否显示页面指示器,请在setData之前调用
*/
public void isHavaPoint(boolean isHavaPoint){
this.isHavaPoint=isHavaPoint;
}
/**
* 引入数据
* @param data
*/
public void setData(ArrayList<HashMap<String, Object>> data) {
this.data = data;
if (data == null || data.size() == 0) {
return;
}
init();
}
class GuidePageAdapter extends PagerAdapter {
@Override
public int getCount() {
return mPageViews == null ? 0 : mPageViews.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup arg0, int arg1, Object arg2) {
arg0.removeView(mPageViews == null ? null : mPageViews.get(arg1));
}
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
arg0.addView(mPageViews == null ? null : mPageViews.get(arg1));
return mPageViews == null ? null : mPageViews.get(arg1);
}
}
class GuidePageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
if (isHavaPoint) {
for (int i = 0; i < mPointViews.length; i++) {
mPointViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
if (arg0 != i) {
mPointViews[i].setBackgroundResource(R.drawable.page_indicator);
}
}
}
mIsSwitched = true;
}
}
private void startTimer() {
if (mTimer == null) {
mTimer = new Timer(true);
}
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
}, 1000, time);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
if (mIsSwitched) {
mIsSwitched = false;
} else {
int now = mViewPager.getCurrentItem();
int size = mPageViews == null ? 0 : mPageViews.size();
if (now < size - 1) {
now++;
} else {
now = 0;
}
mViewPager.setCurrentItem(now, true);
}
}
}
};
private void stopTimer() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}
//在垃圾回收之前停止计时器
@Override
protected void finalize() throws Throwable {
stopTimer();
};
private GuidePageAdapter getGuidePageAdapter() {
if (mGuidePageAdapter == null) {
mGuidePageAdapter = new GuidePageAdapter();
}
return mGuidePageAdapter;
}
private GuidePageChangeListener getGuidePageChangeListener() {
if (mGuidePageChangeListener == null) {
mGuidePageChangeListener = new GuidePageChangeListener();
}
return mGuidePageChangeListener;
}
}