分享一个ViewPager广告自动轮播

来源:互联网 发布:奇迹归来宠物进阶数据 编辑:程序博客网 时间:2024/05/16 01:02

自己也写guoViewPager自动轮播 , 但是这个人封装的确是不错,原文出处记不得了 ,拿出来也分享一下

代码下载地址 :http://pan.baidu.com/s/1pLmgG2J


看代码吧 ,也可以直接去那个下载地址去下载,

ui_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >        <fragment        android:id="@+id/fragment_cycle_viewpager_content"        android:name="cn.androiddevelop.cycleviewpager.lib.CycleViewPager"        android:layout_width="match_parent"        android:layout_height="180dip" />              <RelativeLayout         android:layout_width="fill_parent"        android:layout_height="0dip"        android:layout_weight="1">                <TextView             android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="content"/>    </RelativeLayout>    </LinearLayout>

view_banner.xml

<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:scaleType="fitXY"     />    

view_rectcle_content.xml

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/layout_viewager_content"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@color/white" >        <cn.androiddevelop.cycleviewpager.lib.BaseViewPager            android:id="@+id/viewPager"            android:layout_width="match_parent"            android:layout_height="wrap_content" >        </cn.androiddevelop.cycleviewpager.lib.BaseViewPager>        <LinearLayout            android:id="@+id/layout_viewpager_indicator"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:layout_alignParentRight="true"            android:layout_margin="@dimen/view_small_padding"            android:gravity="center_vertical"            android:orientation="horizontal"            android:paddingBottom="@dimen/view_padding"            android:paddingRight="@dimen/view_padding" >        </LinearLayout>    </RelativeLayout></FrameLayout>


view_recycle_indicator.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ImageView          android:id="@+id/image_indicator"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="center_vertical"         android:scaleType="fitXY"/></LinearLayout>


界面代码看看方法就知道写的很干净利索,以后自己用的话,非常方便

package com.stevenhu.android.phone.ui;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.Toast;import cn.androiddevelop.cycleviewpager.lib.CycleViewPager;import cn.androiddevelop.cycleviewpager.lib.CycleViewPager.ImageCycleViewListener;import com.stevenhu.android.phone.bean.ADInfo;public class MainActivity extends Activity implements ImageCycleViewListener {private List<ImageView> views = new ArrayList<ImageView>();private List<ADInfo> infos = new ArrayList<ADInfo>();private CycleViewPager cycleViewPager;private String[] imageUrls = {"http://img.taodiantong.cn/v55183/infoimg/2013-07/130720115322ky.jpg","http://pic30.nipic.com/20130626/8174275_085522448172_2.jpg","http://pic18.nipic.com/20111215/577405_080531548148_2.jpg","http://pic15.nipic.com/20110722/2912365_092519919000_2.jpg","http://pic.58pic.com/58pic/12/64/27/55U58PICrdX.jpg" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.ui_main);initialize();}@SuppressLint("NewApi")private void initialize() {cycleViewPager = (CycleViewPager) getFragmentManager().findFragmentById(R.id.fragment_cycle_viewpager_content);for (int i = 0; i < imageUrls.length; i++) {ADInfo info = new ADInfo();info.setUrl(imageUrls[i]);infos.add(info);}// 将最后一个ImageView添加进来views.add(getImageView(this, infos.get(infos.size() - 1).getUrl()));for (int i = 0; i < infos.size(); i++) {views.add(getImageView(this, infos.get(i).getUrl()));}// 将第一个ImageView添加进来views.add(getImageView(this, infos.get(0).getUrl()));// 设置循环,在调用setData方法前调用cycleViewPager.setCycle(true);// 在加载数据前设置是否循环cycleViewPager.setData(views, infos, this);// 设置轮播cycleViewPager.setWheel(true);// 设置轮播时间,默认5000mscycleViewPager.setTime(2000);// 设置圆点指示图标组居中显示,默认靠右cycleViewPager.setIndicatorCenter();}@Overridepublic void onImageClick(ADInfo info, int position, View imageView) {if (cycleViewPager.isCycle()) {position = position - 1;Toast.makeText(MainActivity.this, "position-->", Toast.LENGTH_SHORT).show();}}public static ImageView getImageView(Context context, String url) {ImageView imageView = (ImageView) LayoutInflater.from(context).inflate(R.layout.view_banner, null);Glide.with(context).load(url).placeholder(R.drawable.ic_launcher).error(R.drawable.ic_launcher).into(imageView);return imageView;}}

封装的实体类

package com.stevenhu.android.phone.bean;public class ADInfo {String url;public ADInfo() {}public ADInfo(String url) {this.url = url;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}

剩下的三个ViewPager方法

package cn.androiddevelop.cycleviewpager.lib;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;/** * 自定义高度的viewpapger */public class BaseViewPager extends ViewPager {private boolean scrollable = true;public BaseViewPager(Context context) {super(context);}public BaseViewPager(Context context, AttributeSet attrs) {super(context, attrs);}/** * 设置viewpager是否可以滚动 *  * @param enable */public void setScrollable(boolean enable) {scrollable = enable;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {if (scrollable) {return super.onInterceptTouchEvent(event);} else {return false;}}}


package cn.androiddevelop.cycleviewpager.lib;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Fragment;import android.os.Bundle;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import com.stevenhu.android.phone.bean.ADInfo;import com.stevenhu.android.phone.ui.R;/** * 实现可循环,可轮播的viewpager */@SuppressLint("NewApi")public class CycleViewPager extends Fragment implements OnPageChangeListener {private List<ImageView> imageViews = new ArrayList<ImageView>();private ImageView[] indicators;private FrameLayout viewPagerFragmentLayout;private LinearLayout indicatorLayout; // 指示器private BaseViewPager viewPager;private BaseViewPager parentViewPager;private ViewPagerAdapter adapter;private CycleViewPagerHandler handler;private int time = 5000; // 默认轮播时间private int currentPosition = 0; // 轮播当前位置private boolean isScrolling = false; // 滚动框是否滚动着private boolean isCycle = false; // 是否循环private boolean isWheel = false; // 是否轮播private long releaseTime = 0; // 手指松开、页面不滚动时间,防止手机松开后短时间进行切换private int WHEEL = 100; // 转动private int WHEEL_WAIT = 101; // 等待private ImageCycleViewListener mImageCycleViewListener;private List<ADInfo> infos;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = LayoutInflater.from(getActivity()).inflate(R.layout.view_recycle_content, null);viewPager = (BaseViewPager) view.findViewById(R.id.viewPager);indicatorLayout = (LinearLayout) view.findViewById(R.id.layout_viewpager_indicator);viewPagerFragmentLayout = (FrameLayout) view.findViewById(R.id.layout_viewager_content);handler = new CycleViewPagerHandler(getActivity()) {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == WHEEL && imageViews.size() != 0) {if (!isScrolling) {int max = imageViews.size() + 1;int position = (currentPosition + 1)% imageViews.size();viewPager.setCurrentItem(position, true);if (position == max) { // 最后一页时回到第一页viewPager.setCurrentItem(1, false);}}releaseTime = System.currentTimeMillis();handler.removeCallbacks(runnable);handler.postDelayed(runnable, time);return;}if (msg.what == WHEEL_WAIT && imageViews.size() != 0) {handler.removeCallbacks(runnable);handler.postDelayed(runnable, time);}}};return view;}public void setData(List<ImageView> views, List<ADInfo> list,ImageCycleViewListener listener) {setData(views, list, listener, 0);}/** * 初始化viewpager *  * @param views *            要显示的views * @param showPosition *            默认显示位置 */public void setData(List<ImageView> views, List<ADInfo> list,ImageCycleViewListener listener, int showPosition) {mImageCycleViewListener = listener;infos = list;this.imageViews.clear();if (views.size() == 0) {viewPagerFragmentLayout.setVisibility(View.GONE);return;}for (ImageView item : views) {this.imageViews.add(item);}int ivSize = views.size();// 设置指示器indicators = new ImageView[ivSize];if (isCycle)indicators = new ImageView[ivSize - 2];indicatorLayout.removeAllViews();for (int i = 0; i < indicators.length; i++) {View view = LayoutInflater.from(getActivity()).inflate(R.layout.view_recycle_indicator, null);indicators[i] = (ImageView) view.findViewById(R.id.image_indicator);indicatorLayout.addView(view);}adapter = new ViewPagerAdapter();// 默认指向第一项,下方viewPager.setCurrentItem将触发重新计算指示器指向setIndicator(0);viewPager.setOffscreenPageLimit(3);viewPager.setOnPageChangeListener(this);viewPager.setAdapter(adapter);if (showPosition < 0 || showPosition >= views.size())showPosition = 0;if (isCycle) {showPosition = showPosition + 1;}viewPager.setCurrentItem(showPosition);}/** * 设置指示器居中,默认指示器在右方 */public void setIndicatorCenter() {RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);params.addRule(RelativeLayout.CENTER_HORIZONTAL);indicatorLayout.setLayoutParams(params);}/** * 是否循环,默认不开启,开启前,请将views的最前面与最后面各加入一个视图,用于循环 *  * @param isCycle *            是否循环 */public void setCycle(boolean isCycle) {this.isCycle = isCycle;}/** * 是否处于循环状态 *  * @return */public boolean isCycle() {return isCycle;}/** * 设置是否轮播,默认不轮播,轮播一定是循环的 *  * @param isWheel */public void setWheel(boolean isWheel) {this.isWheel = isWheel;isCycle = true;if (isWheel) {handler.postDelayed(runnable, time);}}/** * 是否处于轮播状态 *  * @return */public boolean isWheel() {return isWheel;}final Runnable runnable = new Runnable() {@Overridepublic void run() {if (getActivity() != null && !getActivity().isFinishing()&& isWheel) {long now = System.currentTimeMillis();// 检测上一次滑动时间与本次之间是否有触击(手滑动)操作,有的话等待下次轮播if (now - releaseTime > time - 500) {handler.sendEmptyMessage(WHEEL);} else {handler.sendEmptyMessage(WHEEL_WAIT);}}}};/** * 释放指示器高度,可能由于之前指示器被限制了高度,此处释放 */public void releaseHeight() {getView().getLayoutParams().height = RelativeLayout.LayoutParams.MATCH_PARENT;refreshData();}/** * 设置轮播暂停时间,即没多少秒切换到下一张视图.默认5000ms *  * @param time *            毫秒为单位 */public void setTime(int time) {this.time = time;}/** * 刷新数据,当外部视图更新后,通知刷新数据 */public void refreshData() {if (adapter != null)adapter.notifyDataSetChanged();}/** * 隐藏CycleViewPager */public void hide() {viewPagerFragmentLayout.setVisibility(View.GONE);}/** * 返回内置的viewpager *  * @return viewPager */public BaseViewPager getViewPager() {return viewPager;}/** * 页面适配器 返回对应的view *  * @author Yuedong Li *  */private class ViewPagerAdapter extends PagerAdapter {@Overridepublic int getCount() {return imageViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}@Overridepublic View instantiateItem(ViewGroup container, final int position) {ImageView v = imageViews.get(position);if (mImageCycleViewListener != null) {v.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mImageCycleViewListener.onImageClick(infos.get(currentPosition - 1),currentPosition, v);}});}container.addView(v);return v;}@Overridepublic int getItemPosition(Object object) {return POSITION_NONE;}}@Overridepublic void onPageScrollStateChanged(int arg0) {if (arg0 == 1) { // viewPager在滚动isScrolling = true;return;} else if (arg0 == 0) { // viewPager滚动结束if (parentViewPager != null)parentViewPager.setScrollable(true);releaseTime = System.currentTimeMillis();viewPager.setCurrentItem(currentPosition, false);}isScrolling = false;}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {int max = imageViews.size() - 1;int position = arg0;currentPosition = arg0;if (isCycle) {if (arg0 == 0) {currentPosition = max - 1;} else if (arg0 == max) {currentPosition = 1;}position = currentPosition - 1;}setIndicator(position);}/** * 设置viewpager是否可以滚动 *  * @param enable */public void setScrollable(boolean enable) {viewPager.setScrollable(enable);}/** * 返回当前位置,循环时需要注意返回的position包含之前在views最前方与最后方加入的视图,即当前页面试图在views集合的位置 *  * @return */public int getCurrentPostion() {return currentPosition;}/** * 设置指示器 *  * @param selectedPosition *            默认指示器位置 */private void setIndicator(int selectedPosition) {for (int i = 0; i < indicators.length; i++) {indicators[i].setBackgroundResource(R.drawable.icon_point);}if (indicators.length > selectedPosition)indicators[selectedPosition].setBackgroundResource(R.drawable.icon_point_pre);}/** * 如果当前页面嵌套在另一个viewPager中,为了在进行滚动时阻断父ViewPager滚动,可以 阻止父ViewPager滑动事件 * 父ViewPager需要实现ParentViewPager中的setScrollable方法 */public void disableParentViewPagerTouchEvent(BaseViewPager parentViewPager) {if (parentViewPager != null)parentViewPager.setScrollable(false);}/** * 轮播控件的监听事件 *  * @author minking */public static interface ImageCycleViewListener {/** * 单击图片事件 *  * @param position * @param imageView */public void onImageClick(ADInfo info, int postion, View imageView);}}


package cn.androiddevelop.cycleviewpager.lib;import android.content.Context;import android.os.Handler;/** * 为了防止内存泄漏,定义外部类,防止内部类对外部类的引用 */public class CycleViewPagerHandler extends Handler { Context context;public CycleViewPagerHandler(Context context) {this.context = context;}};

还有一些图片资源什么的 ,可以去下载 ,一些简单的广告轮播这个就够用了 ,不用去使用第三方的banner框架什么的 。