最近做的项目里用到了轮播图,然后找了一个可以快速使用还比较方便效果好的方法,记录在这里,方便以后使用,有两种方法吧,下面分别说一下,以代码为主,复制到程序里就可以使用:
第一种:
直接在build.gradle里添加依赖
//banner轮播图 compile 'com.coldmoqiuli:banners:1.0.0'
然后在布局文件里使用
<com.oragee.banners.BannerView
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="220dp" />
Activity里代码如下:
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的页面
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里使用,使用方法跟上面第一种方法一样
下面这第二中方式的好处就是可以自定义自动轮播变换时间,可自己更改轮播时下面圆点的样式