最近作的項目裏用到了輪播圖,而後找了一個能夠快速使用還比較方便效果好的方法,記錄在這裏,方便之後使用,有兩種方法吧,下面分別說一下,以代碼爲主,複製到程序裏就能夠使用:html
第一種:java
直接在build.gradle裏添加依賴android
//banner輪播圖
compile 'com.coldmoqiuli:banners:1.0.0'
而後在佈局文件裏使用app
[html] view plain copyide
- <com.oragee.banners.BannerView
- android:id="@+id/banner"
- android:layout_width="match_parent"
- android:layout_height="220dp" />
Activity裏代碼以下:oop
[java] view plain copy佈局
-
[java] view plain copygradle
- 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);
- }
以上就是第一種使用方法,很方便簡單的實現了。ui
第二種方法:this
1、先定義個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;
- }
- }
- }
2、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;
}
}
3、在xml佈局文件裏使用字定義的這個BannerView
4、在activity裏使用,使用方法跟上面第一種方法同樣
下面這第二中方式的好處就是能夠自定義自動輪播變換時間,可本身更改輪播時下面圓點的樣式