Android BannerView通用封装详解

所属分类: 软件编程 / Android 阅读数: 35
收藏 0 赞 0 分享

之前封装过一个,但总觉得不够优雅,就有了这个通用封装,很简洁,不知道够不够优雅,不过原来那个有跟随指示器和丝滑滑动效果,感兴趣可以看一下。

封装过程

1、自定义属性

selectPoint:选中指示器图标
normalPoint:未选中指示器图标
pointWidth:图标宽度
switchTime:轮播间隔事件
location:指示器位置,下中或下右

<declare-styleable name="NewBannerView">
    <attr name="selectPoint" format="reference" />
    <attr name="normalPoint" format="reference" />
    <attr name="pointWidth" format="dimension" />
    <attr name="switchTime" format="integer" />
    <attr name="location">
      <enum name="CENTER" value="0" />
      <enum name="RIGHT" value="1" />
    </attr>
  </declare-styleable>

2、初始化View
初始化ViewPager和指示器组合View

3、绑定数据源
通过setImageData设置轮播图数据源

4、绑定点击事件
通过OnPageClickListener绑定点击事件

5、开启关闭轮播
start和stop方法开启和关闭轮播

用法

xml中

<com.goldou.lovesee.view.NewBannerView
    android:id="@+id/bannerView"
    android:layout_width="match_parent"
    app:selectPoint="@drawable/red_point"
    app:normalPoint="@drawable/gray_point"
    app:switchTime="4000"
    app:location="RIGHT"
    android:layout_height="200dp" />

activity中

int[] imageList = {R.drawable.me_top, R.drawable.me_top, R.drawable.me_top, R.drawable.me_top};
    NewBannerView bannerView = view.findViewById(R.id.bannerView);
    bannerView.setImageData(imageList);
    bannerView.start();
    bannerView.setOnPageClickListener(new NewBannerView.OnPageClickListener() {
      @Override
      public void onPageClick(int position) {
        Toast.makeText(getActivity(), position + "", Toast.LENGTH_SHORT).show();
      }
    });

BannerView

public class NewBannerView extends RelativeLayout implements View.OnClickListener {
  private Context context;
  private int selectPoint, normalPoint;
  private float pointWidth = 7;
  private int location;
  private int CENTER = 0, RIGHT = 1;
  private int lastPosition = 0;
  private ViewPager viewPager;
  private int switchTime = 5000;
  private int[] images;
  private OnPageClickListener onPageClickListener;

  private Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
      if (msg.what == 101) {
        viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
        start();
      }
      return false;
    }
  });

  public NewBannerView(Context context) {
    this(context, null);
  }

  public NewBannerView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public NewBannerView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.context = context;
    initAttr(attrs);
  }

  private void initAttr(AttributeSet attrs) {
    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.NewBannerView);
    selectPoint = array.getResourceId(R.styleable.NewBannerView_selectPoint, R.mipmap.ic_launcher_round);
    normalPoint = array.getResourceId(R.styleable.NewBannerView_normalPoint, R.mipmap.ic_launcher_round);
    pointWidth = array.getDimension(R.styleable.NewBannerView_pointWidth, pointWidth);
    location = array.getInteger(R.styleable.NewBannerView_location, RIGHT);
    switchTime = array.getInteger(R.styleable.NewBannerView_switchTime, switchTime);
    array.recycle();
  }

  public void setImageData(final int[] images) {
    this.images = images;
    final LinearLayout ll_point = new LinearLayout(context);
    LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    layoutParams.addRule(ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    layoutParams.bottomMargin = 20;
    if (location == CENTER) {
      layoutParams.addRule(CENTER_HORIZONTAL, RelativeLayout.TRUE);
    } else {
      layoutParams.addRule(ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
      layoutParams.rightMargin = 20;
    }
    LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(UIUtil.dip2px(pointWidth), UIUtil.dip2px(pointWidth));
    LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(UIUtil.dip2px(pointWidth), UIUtil.dip2px(pointWidth));
    params1.leftMargin = 0;
    params2.leftMargin = UIUtil.dip2px(pointWidth);
    for (int i = 0; i < images.length; i++) {
      ImageView point = new ImageView(context);
      if (i == 0) {
        point.setBackgroundResource(selectPoint);
        point.setLayoutParams(params1);
      } else {
        point.setBackgroundResource(normalPoint);
        point.setLayoutParams(params2);
      }
      ll_point.addView(point);
    }

    viewPager = new ViewPager(context);
    viewPager.setAdapter(new BannerAdapter());
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

      }

      @Override
      public void onPageSelected(int position) {
        position = position % images.length;
        if (lastPosition == position) {
          return;
        }
        ll_point.getChildAt(position).setBackgroundResource(selectPoint);
        ll_point.getChildAt(lastPosition).setBackgroundResource(normalPoint);
        lastPosition = position;
      }

      @Override
      public void onPageScrollStateChanged(int state) {

      }
    });
    LayoutParams layoutParams1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    addView(viewPager, layoutParams1);
    addView(ll_point, layoutParams);
  }

  public void start() {
    handler.sendEmptyMessageDelayed(101, switchTime);
  }

  public void stop() {
    handler.removeCallbacksAndMessages(null);
  }

  private int getCurrentItem() {
    return viewPager.getCurrentItem() % images.length;
  }

  @Override
  public void onClick(View view) {
    onPageClickListener.onPageClick(getCurrentItem());
  }

  public interface OnPageClickListener {
    void onPageClick(int position);
  }

  public void setOnPageClickListener(OnPageClickListener onPageClickListener) {
    this.onPageClickListener = onPageClickListener;
  }

  private class BannerAdapter extends PagerAdapter {

    @Override
    public int getCount() {
      return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
      return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      position = position % images.length;
      ImageView imageView = new ImageView(context);
      imageView.setImageResource(images[position]);
      imageView.setScaleType(ImageView.ScaleType.FIT_XY);
      imageView.setOnClickListener(NewBannerView.this);
      container.addView(imageView);
      return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      container.removeView((View) object);
    }
  }
}

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

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多