首页 > 系统 > Android > 正文

Android实现BannerLayout图文轮播功能

2019-12-12 00:52:58
字体:
来源:转载
供稿:网友

本文实例为大家分享了Android实现BannerLayout图文轮播功能的具体代码,供大家参考,具体内容如下

实现效果图:

(1)在biuld.gradle文件加入

compile 'com.ydevelop:bannerlayout:1.0.4'

(2)创建BannerLayout文件

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Interpolator;import android.graphics.drawable.Drawable;import android.graphics.drawable.GradientDrawable;import android.graphics.drawable.LayerDrawable;import android.os.Handler;import android.os.Message;import android.support.annotation.NonNull;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.text.TextUtils;import android.util.AttributeSet;import android.util.Log;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 android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;import com.bumptech.glide.Glide;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;public class BannerLayout extends RelativeLayout { private ViewPager mViewPager; // 轮播容器 // 指示器(圆点)容器 private LinearLayout indicatorContainer; private Drawable unSelectedDrawable; private Drawable selectedDrawable; private int WHAT_AUTO_PLAY = 1000; private boolean isAutoPlay = true; // 自动轮播 private int itemCount; private int selectedIndicatorColor = 0xffff0000; private int unSelectedIndicatorColor = 0x88888888; private int titleBGColor = 0X33000000; private int titleColor = 0Xffffffff; private Shape indicatorShape = Shape.oval; private int selectedIndicatorHeight = 20; private int selectedIndecatorWidth = 20; private int unSelectedIndicatorHeight = 20; private int unSelectedIndecatorWidth = 20; private int autoPlayDuration = 4000; private int scrollDuration = 900; // 指示器中点和点之间的距离 private int indicatorSpace = 10; // 指示器整体的设置 private int indicatorMargin = 20; private static final int titlePadding = 20; private int defaultImage; private enum Shape { // 矩形 或 圆形的指示器 rect, oval } private OnBannerItemClickListener mOnBannerItemClickListener; private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) {  if (msg.what == WHAT_AUTO_PLAY) {  if (mViewPager != null) {   mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);   mHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, autoPlayDuration);  }  }  return false; } }); public BannerLayout(Context context) { super(context); init(null, 0); } public BannerLayout(Context context, AttributeSet attrs) { super(context, attrs); init(attrs, 0); } public BannerLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs, defStyleAttr); } private void init(AttributeSet attrs, int defStyleAttr) { TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.BannerLayoutStyle, defStyleAttr, 0); selectedIndicatorColor = array.getColor(R.styleable.BannerLayoutStyle_selectedIndicatorColor, selectedIndicatorColor); unSelectedIndicatorColor = array.getColor(R.styleable.BannerLayoutStyle_unSelectedIndicatorColor, unSelectedIndicatorColor); titleBGColor = array.getColor(R.styleable.BannerLayoutStyle_titleBGColor, titleBGColor); titleColor = array.getColor(R.styleable.BannerLayoutStyle_titleColor, titleColor); int shape = array.getInt(R.styleable.BannerLayoutStyle_indicatorShape, Shape.oval.ordinal()); for (Shape shape1 : Shape.values()) {  if (shape1.ordinal() == shape) {  indicatorShape = shape1;  break;  } } selectedIndecatorWidth = (int) array.getDimension(R.styleable.BannerLayoutStyle_selectedIndicatorWidth, selectedIndecatorWidth); selectedIndicatorHeight = (int) array.getDimension(R.styleable.BannerLayoutStyle_selectedIndicatorHeight, selectedIndicatorHeight); unSelectedIndecatorWidth = (int) array.getDimension(R.styleable.BannerLayoutStyle_unSelectedIndicatorWidth, unSelectedIndecatorWidth); unSelectedIndicatorHeight = (int) array.getDimension(R.styleable.BannerLayoutStyle_unSelectedIndicatorHeight, unSelectedIndicatorHeight); indicatorSpace = (int) array.getDimension(R.styleable.BannerLayoutStyle_indicatorSpace, indicatorSpace); indicatorMargin = (int) array.getDimension(R.styleable.BannerLayoutStyle_indicatorMargin, indicatorMargin); autoPlayDuration = array.getInt(R.styleable.BannerLayoutStyle_autoPlayDuration, autoPlayDuration); scrollDuration = array.getInt(R.styleable.BannerLayoutStyle_scrollDuration, scrollDuration); isAutoPlay = array.getBoolean(R.styleable.BannerLayoutStyle_isAutoPlay, isAutoPlay); defaultImage = array.getResourceId(R.styleable.BannerLayoutStyle_defaultImage, defaultImage); array.recycle(); LayerDrawable unSelectedLayerDrawable; LayerDrawable selectedLayerDrawable; GradientDrawable unSelectedGradientDrawable = new GradientDrawable(); GradientDrawable selectedGradientDtawbale = new GradientDrawable(); switch (indicatorShape) {  case rect:  unSelectedGradientDrawable.setShape(GradientDrawable.RECTANGLE);  selectedGradientDtawbale.setShape(GradientDrawable.RECTANGLE);  break;  case oval:  unSelectedGradientDrawable.setShape(GradientDrawable.OVAL);  selectedGradientDtawbale.setShape(GradientDrawable.OVAL);  break; } unSelectedGradientDrawable.setColor(unSelectedIndicatorColor); unSelectedGradientDrawable.setSize(unSelectedIndecatorWidth, unSelectedIndicatorHeight); unSelectedLayerDrawable = new LayerDrawable(new Drawable[]{unSelectedGradientDrawable}); unSelectedDrawable = unSelectedLayerDrawable; selectedGradientDtawbale.setColor(selectedIndicatorColor); selectedGradientDtawbale.setSize(selectedIndecatorWidth, selectedIndicatorHeight); selectedLayerDrawable = new LayerDrawable(new Drawable[]{selectedGradientDtawbale}); selectedDrawable = selectedLayerDrawable; } /** * 添加本地图片 * * @param viewRes 图片id集合 * @param titles 标题集合,可空 */ public void setViewRes(List<Integer> viewRes, List<String> titles) { List<View> views = new ArrayList<>(); itemCount = viewRes.size(); if (titles != null && titles.size() != viewRes.size()) {  throw new IllegalStateException("views.size() != titles.size()"); } // 把数量拼凑到三个以上 if (itemCount < 1) {  throw new IllegalStateException("item count not equal zero"); } else if (itemCount < 2) {  views.add(getFrameLayoutView(viewRes.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(viewRes.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(viewRes.get(0), titles != null ? titles.get(0) : null, 0)); } else if (itemCount < 3) {  views.add(getFrameLayoutView(viewRes.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(viewRes.get(1), titles != null ? titles.get(1) : null, 1));  views.add(getFrameLayoutView(viewRes.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(viewRes.get(1), titles != null ? titles.get(1) : null, 1)); } else {  for (int i = 0; i < viewRes.size(); i++) {  views.add(getFrameLayoutView(viewRes.get(i), titles != null ? titles.get(i) : null, i));  } } setViews(views); } //添加网络图片路径 public void setViewUrls(Context context,List<String> urls, List<String> titles) { List<View> views = new ArrayList<>(); itemCount = urls.size(); Log.e("TAG",titles.size()+"---90---"+urls.size()); if (titles != null && titles.size() != itemCount) {  throw new IllegalStateException("views.size() != titles.size()"); } //主要是解决当item为小于3个的时候滑动有问题,这里将其拼凑成3个以上 if (itemCount < 1) {//当item个数0  throw new IllegalStateException("item count not equal zero"); } else if (itemCount < 2) { //当item个数为1  views.add(getFrameLayoutView(context,urls.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(context,urls.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(context,urls.get(0), titles != null ? titles.get(0) : null, 0)); } else if (itemCount < 3) {//当item个数为2  views.add(getFrameLayoutView(context,urls.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(context,urls.get(1), titles != null ? titles.get(1) : null, 1));  views.add(getFrameLayoutView(context,urls.get(0), titles != null ? titles.get(0) : null, 0));  views.add(getFrameLayoutView(context,urls.get(1), titles != null ? titles.get(1) : null, 1)); } else {  for (int i = 0; i < urls.size(); i++) {  views.add(getFrameLayoutView(context,urls.get(i), titles != null ? titles.get(i) : null, i));  } } setViews(views); } private void setViews(final List<View> views) { mViewPager = new ViewPager(getContext()); addView(mViewPager); setSliderTransformDuration(scrollDuration); //初始化indicatorContainer indicatorContainer = new LinearLayout(getContext()); indicatorContainer.setGravity(Gravity.CENTER_VERTICAL); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // 设置 指示点的位置 ALIGN_PARENT_RIGHT表示居右 CENTER_HORIZONTAL表示居中 params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); //设置margin params.setMargins(indicatorMargin, indicatorMargin, indicatorMargin, indicatorMargin); //添加指示器容器布局到SliderLayout addView(indicatorContainer, params); //初始化指示器,并添加到指示器容器布局 for (int i = 0; i < itemCount; i++) {  ImageView indicator = new ImageView(getContext());  indicator.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));  indicator.setPadding(indicatorSpace, indicatorSpace, indicatorSpace, indicatorSpace);  indicator.setImageDrawable(unSelectedDrawable);  indicatorContainer.addView(indicator); } LoopPagerAdapter pagerAdapter = new LoopPagerAdapter(views); mViewPager.setAdapter(pagerAdapter); //设置当前item到Integer.MAX_VALUE中间的一个值,看起来像无论是往前滑还是往后滑都是ok的 //如果不设置,用户往左边滑动的时候已经划不动了 int targetItemPosition = Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % itemCount; mViewPager.setCurrentItem(targetItemPosition); switchIndicator(targetItemPosition % itemCount); mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {  @Override  public void onPageSelected(int position) {  switchIndicator(position % itemCount);  } }); startAutoPlay(); } /** * 开始自动轮播 */ public void startAutoPlay() { stopAutoPlay(); // 避免重复消息 if (isAutoPlay) {  mHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, autoPlayDuration); }  @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if (visibility == VISIBLE) {  startAutoPlay(); } else {  stopAutoPlay(); } } /** * 停止自动轮播 */ public void stopAutoPlay() { if (isAutoPlay) {  mHandler.removeMessages(WHAT_AUTO_PLAY); } } private void setSliderTransformDuration(int scrollDuration) { try {  Field mScroller = ViewPager.class.getDeclaredField("mScroller");  mScroller.setAccessible(true);  FixedSpeedScroller fixedSpeedScroller = new FixedSpeedScroller(mViewPager.getContext(), null, scrollDuration);  mScroller.set(mViewPager, fixedSpeedScroller); } catch (Exception e) {  e.printStackTrace(); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) {  case MotionEvent.ACTION_DOWN:  stopAutoPlay();  break;  case MotionEvent.ACTION_CANCEL:  case MotionEvent.ACTION_UP:  startAutoPlay();  break; } return super.dispatchTouchEvent(ev); } /** * 切换指示器状态 * * @param currentPosition 当前位置 */ private void switchIndicator(int currentPosition) { for (int i = 0; i < indicatorContainer.getChildCount(); i++) {  ((ImageView) indicatorContainer.getChildAt(i)).setImageDrawable(i == currentPosition ? selectedDrawable : unSelectedDrawable); } } public void setOnBannerItemClickListener(OnBannerItemClickListener onBannerItemClickListener) { this.mOnBannerItemClickListener = onBannerItemClickListener; } @NonNull private FrameLayout getFrameLayoutView(Context context, String url, String title, final int position) { FrameLayout frameLayout = new FrameLayout(getContext()); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; ImageView imageView = new ImageView(getContext()); frameLayout.addView(imageView); frameLayout.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  if (mOnBannerItemClickListener != null) {   mOnBannerItemClickListener.onItemClick(position);  }  } }); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); if (defaultImage != 0){  Glide.with(getContext()).load(url).placeholder(defaultImage).centerCrop().into(imageView); }else {  Glide.with(getContext()).load(url).centerCrop().into(imageView); } if (!TextUtils.isEmpty(title)) {  TextView textView = new TextView(getContext());  textView.setText(title);  textView.setTextColor(titleColor);  textView.setPadding(titlePadding, titlePadding, titlePadding, titlePadding);  textView.setBackgroundColor(titleBGColor);  textView.getPaint().setFakeBoldText(true);  layoutParams.gravity = Gravity.BOTTOM;  frameLayout.addView(textView, layoutParams); } return frameLayout; } @NonNull private FrameLayout getFrameLayoutView(Integer res, String title, final int position) { FrameLayout frameLayout = new FrameLayout(getContext()); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; ImageView imageView = new ImageView(getContext()); frameLayout.addView(imageView); frameLayout.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  if (mOnBannerItemClickListener != null) {   mOnBannerItemClickListener.onItemClick(position);  }  } }); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); Glide.with(getContext()).load(res).centerCrop().into(imageView); if (!TextUtils.isEmpty(title)) {  TextView textView = new TextView(getContext());  textView.setText(title);  textView.setTextColor(titleColor);  textView.setPadding(titlePadding, titlePadding, titlePadding, titlePadding);  textView.setBackgroundColor(titleBGColor);  textView.getPaint().setFakeBoldText(true);  layoutParams.gravity = Gravity.BOTTOM;  frameLayout.addView(textView, layoutParams); } return frameLayout; } public interface OnBannerItemClickListener { void onItemClick(int position); } public class LoopPagerAdapter extends PagerAdapter { private List<View> views; public LoopPagerAdapter(List<View> views) {  this.views = views; } @Override public int getCount() {  //Integer.MAX_VALUE = 2147483647  return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) {  return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) {  if (views.size() > 0) {  //position % view.size()是指虚拟的position会在[0,view.size())之间循环  View view = views.get(position % views.size());  if (container.equals(view.getParent())) {   container.removeView(view);  }  container.addView(view);  return view;  }  return null; } @Override public void destroyItem(ViewGroup container, int position, Object object) { } } public class FixedSpeedScroller extends Scroller { private int mDuration = 1000; public FixedSpeedScroller(Context context) {  super(context); } public FixedSpeedScroller(Context context, Interpolator interpolator) {  super(context, (android.view.animation.Interpolator) interpolator); } public FixedSpeedScroller(Context context, Interpolator interpolator, int duration) {  this(context, interpolator);  mDuration = duration; @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) {  // Ignore received duration, use fixed one instead  super.startScroll(startX, startY, dx, dy, mDuration); } @Override public void startScroll(int startX, int startY, int dx, int dy) {  // Ignore received duration, use fixed one instead  super.startScroll(startX, startY, dx, dy, mDuration); } }}

(3)MainAvtivity.java文件

import android.app.Activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.view.View;import android.widget.ImageView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;/** * Created by lenovo on 2018/4/23. */public class MainActivity extends Activity { private MyListView lv_zyb; private ImageView iv_zybfh; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_zybfh=(ImageView) findViewById(R.id.iv_zybfh); BannerLayout bannerLayout = (BannerLayout) findViewById(R.id.bannerzhuangyuanbang); List<String> urls = new ArrayList<>(); urls.add("http://img.pconline.com.cn/images/upload/upc/tx/photoblog/1404/02/c5/32731218_32731218_1396429876186.jpg"); urls.add("http://pic2.16pic.com/00/11/65/16pic_1165030_b.jpg"); urls.add("http://upload.17u.net/uploadpicbase/image/201708201147537103.jpg"); urls.add("http://img2.gzgov.gov.cn/gzsrmzf/dcgz/lyzx/rmjd/201709/W020170926622407643781.jpg"); urls.add("http://photocdn.sohu.com/20150324/Img410244363.jpg"); urls.add("http://pic4.40017.cn/scenery/destination/2017/01/10/11/SiTllI.jpg"); List<String> titleas = new ArrayList<>(); titleas.add("标题一"); titleas.add("标题二"); titleas.add("标题三"); titleas.add("标题四"); titleas.add("标题五"); titleas.add("标题六"); if (bannerLayout != null) {  bannerLayout.setViewUrls(this ,urls, titleas);  bannerLayout.setOnBannerItemClickListener(new BannerLayout.OnBannerItemClickListener() {  @Override  public void onItemClick(int position) {   Toast.makeText(ZhuangyuanbangActivity.this, "position:" + position, Toast.LENGTH_SHORT).show();  }  }); } } }

(4)activity_main.xml文件,必须加红色这一句,否则app开头的会报错。还有红色的是包名,记得修改为自己项目的包名。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <applwj.eduation.com.topeduation.BannerLayout android:id="@+id/bannerzhuangyuanbang" android:layout_width="match_parent" android:layout_height="210dp" app:scrollDuration="1000" app:autoPlayDuration="3000" app:unSelectedIndicatorHeight="10dp" app:unSelectedIndicatorWidth="10dp" app:selectedIndicatorHeight="10dp" app:selectedIndicatorWidth="10dp" app:unSelectedIndicatorColor="#99ffffff" app:selectedIndicatorColor="#000000" app:isAutoPlay="true" /></LinearLayout>

demo下载:Android实现图文轮播功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表