最近做的项目里用到了轮播图,然后找了一个可以快速使用还比较方便效果好的方法,记录在这里,方便以后使用,有两种方法吧,下面分别说一下,以代码为主,复制到程序里就可以使用:
第一种:
直接在build.gradle里添加依赖
//banner轮播图 compile 'com.coldmoqiuli:banners:1.0.0'
然后在布局文件里使用
[html] view plain copy
- <com.oragee.banners.BannerView
- android:id="@+id/banner"
- android:layout_width="match_parent"
- android:layout_height="220dp" />
Activity里代码如下:
[java] view plain copy
[java] view plain copy
- private void initView(){
- viewList = new ArrayList<View>();
- for (int i = 0; i < imgs.length; i++) {
- ImageView image = new ImageView(this);
- image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- //设置显示格式
- image.setScaleType(ImageView.ScaleType.CENTER_CROP);
- image.setImageResource(imgs[i]);
- viewList.add(image);
- }
- bannerView = (BannerView) findViewById(R.id.banner);
- bannerView.startLoop(true);
- bannerView.setViewList(viewList);
- }
以上就是第一种使用方法,很方便简单的实现了。
第二种方法:
一、先定义个BannerView的页面
[java] view plain copy
- package com.junto.frameworktest.activity.banner;
- import android.content.Context;
- import android.database.DataSetObserver;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.support.v4.view.PagerAdapter;
- import android.support.v4.view.ViewPager;
- import android.util.AttributeSet;
- import android.view.Gravity;
- 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 com.junto.frameworktest.R;
- import java.lang.ref.WeakReference;
- import java.util.List;
- /**
- * Created by WangJinyong on 2018/3/22.
- */
- public class BannerView extends FrameLayout {
- private static final int MSG_LOOP = 1000;
- private static long LOOP_INTERVAL = 2000;
- private LinearLayout mLinearPosition = null;
- private ViewPager mViewPager = null;
- private BannerHandler mBannerHandler = null;
- private List<View> viewList;
- private int viewSize;
- private static class BannerHandler extends Handler {
- private WeakReference<BannerView> weakReference = null;
- public BannerHandler(BannerView bannerView) {
- super(Looper.getMainLooper());
- this.weakReference = new WeakReference<BannerView>(bannerView);
- }
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- if (this.weakReference == null) {
- return;
- }
- BannerView bannerView = this.weakReference.get();
- if (bannerView == null || bannerView.mViewPager == null || bannerView.mViewPager.getAdapter() == null || bannerView.mViewPager.getAdapter().getCount() <= 0) {
- // sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
- return;
- }
- int curPos = bannerView.mViewPager.getCurrentItem();
- curPos = (curPos + 1) % bannerView.mViewPager.getAdapter().getCount();
- bannerView.mViewPager.setCurrentItem(curPos);
- if (hasMessages(MSG_LOOP)) {
- removeMessages(MSG_LOOP);
- }
- sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
- }
- }
- public BannerView(Context context) {
- super(context);
- init();
- }
- public BannerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- public void startLoop(boolean flag) {
- if (flag) {
- if (mBannerHandler == null) {
- mBannerHandler = new BannerHandler(this);
- }
- mBannerHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
- } else {
- if (mBannerHandler != null) {
- if (mBannerHandler.hasMessages(MSG_LOOP)) {
- mBannerHandler.removeMessages(MSG_LOOP);
- mBannerHandler = null;
- }
- }
- }
- }
- private void init() {
- initViewPager();
- initLinearPosition();
- this.addView(mViewPager);
- this.addView(mLinearPosition);
- }
- private void initViewPager() {
- mViewPager = new ViewPager(getContext());
- LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT
- , ViewGroup.LayoutParams.WRAP_CONTENT);
- mViewPager.setLayoutParams(layoutParams);
- mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
- @Override
- public void onPageSelected(int position) {
- updateLinearPosition();
- }
- @Override
- public void onPageScrollStateChanged(int state) {
- }
- });
- mViewPager.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (mBannerHandler != null) {
- if (mBannerHandler.hasMessages(MSG_LOOP)) {
- mBannerHandler.removeMessages(MSG_LOOP);}
- }
- break;
- case MotionEvent.ACTION_UP:
- if (mBannerHandler != null) {
- mBannerHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
- }
- break;
- }
- return false;
- }
- });
- }
- private void initLinearPosition() {
- mLinearPosition = new LinearLayout(getContext());
- mLinearPosition.setOrientation(LinearLayout.HORIZONTAL);
- LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT
- , ViewGroup.LayoutParams.WRAP_CONTENT);
- layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
- layoutParams.bottomMargin = getResources().getDimensionPixelSize(R.dimen.dimen_9dp);
- mLinearPosition.setPadding(getResources().getDimensionPixelSize(R.dimen.dimen_9dp), 0, 0, 0);
- mLinearPosition.setLayoutParams(layoutParams);
- }
- public void setAdapter(PagerAdapter adapter) {
- mViewPager.setAdapter(adapter);
- adapter.registerDataSetObserver(mDataObserver);
- updateLinearPosition();
- }
- private DataSetObserver mDataObserver = new DataSetObserver() {
- @Override
- public void onChanged() {
- super.onChanged();
- updateLinearPosition();
- }
- @Override
- public void onInvalidated() {
- super.onInvalidated();
- }
- };
- private void updateLinearPosition() {
- if (viewList != null && viewList.size() != 0) {
- if (mLinearPosition.getChildCount() != viewSize) {
- int diffCnt = mLinearPosition.getChildCount() - viewSize;
- boolean needAdd = diffCnt < 0;
- diffCnt = Math.abs(diffCnt);
- for (int i = 0; i < diffCnt; i++) {
- if (needAdd) {
- ImageView img = new ImageView(getContext());
- LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- layoutParams.rightMargin = getResources().getDimensionPixelOffset(R.dimen.dimen_9dp);
- img.setLayoutParams(layoutParams);
- img.setBackgroundResource(R.drawable.banner_point);
- mLinearPosition.addView(img);
- } else {
- mLinearPosition.removeViewAt(0);
- }
- }
- }
- int curPos = mViewPager.getCurrentItem();
- for (int i = 0; i < mLinearPosition.getChildCount(); i++) {
- if (i == (curPos % viewSize)) {
- // mLinearPosition.getChildAt(i).setBackgroundResource(R.drawable.banner_point_select);
- mLinearPosition.getChildAt(i).setBackgroundResource(R.mipmap.btn_tianjiabutton_press);
- } else {
- // mLinearPosition.getChildAt(i).setBackgroundResource(R.drawable.banner_point);
- mLinearPosition.getChildAt(i).setBackgroundResource(R.mipmap.ab_46_btn_tianjia_press);
- }
- }
- }
- }
- public void setViewList(List<View> viewList) {
- this.viewList = viewList;
- if (viewList != null && viewList.size() != 0) {
- viewSize = viewList.size();
- BannerAdapter bannerAdapter = new BannerAdapter(viewList);
- setAdapter(bannerAdapter);
- }
- }
- public void setTransformAnim(boolean flag) {
- if (flag) {
- mViewPager.setPageTransformer(true, new ViewPager.PageTransformer() {
- private static final float MIN_SCALE = 0.75f;
- @Override
- public void transformPage(View view, float position) {
- int pageWidth = view.getWidth();
- if (position < -1)
- { // [-Infinity,-1)
- // This page is way off-screen to the left.
- view.setRotation(0);
- } else if (position <= 1)
- { // [-1,1]
- // Modify the default slide transition to shrink the page as well
- if (position < 0)
- {
- float mRot = (20f * position);
- view.setPivotX(view.getMeasuredWidth() * 0.5f);
- view.setPivotY(view.getMeasuredHeight());
- view.setRotation(mRot);
- } else
- {
- float mRot = (20f * position);
- view.setPivotX(view.getMeasuredWidth() * 0.5f);
- view.setPivotY(view.getMeasuredHeight());
- view.setRotation(mRot);
- }
- // Scale the page down (between MIN_SCALE and 1)
- // Fade the page relative to its size.
- } else
- { // (1,+Infinity]
- // This page is way off-screen to the right.
- view.setRotation(0);
- }
- }
- });
- }
- }
- public void setLoopInterval(long loopInterval) {
- LOOP_INTERVAL = loopInterval;
- }
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (mBannerHandler != null) {
- mBannerHandler.removeMessages(MSG_LOOP);
- mBannerHandler = null;
- }
- }
- }
二、BannerAdapter适配器
package com.junto.frameworktest.activity.banner; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by WangJinyong on 2018/3/22. */ public class BannerAdapter extends PagerAdapter { private List<View> viewList; private int size; private final int cacheCount = 3; public BannerAdapter(List<View> viewList) { this.viewList = viewList; size = viewList.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { if (viewList.size() > cacheCount) { container.removeView(viewList.get(position % size)); } } @Override public Object instantiateItem(ViewGroup container, int position) { ViewGroup parent = (ViewGroup) viewList.get(position % size).getParent(); if (parent != null) { parent.removeView(viewList.get(position % size)); } container.addView(viewList.get(position % size)); return viewList.get(position % size); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } }
三、在xml布局文件里使用字定义的这个BannerView
四、在activity里使用,使用方法跟上面第一种方法一样
下面这第二中方式的好处就是可以自定义自动轮播变换时间,可自己更改轮播时下面圆点的样式