Explanation of Android BannerView Universal Package

  • 2021-08-31 09:25:59
  • OfStack

I have packaged one before, but I always feel that it is not elegant enough, so I have this universal package, which is very simple. I don't know if it is elegant enough, but the original one has following indicator and silky sliding effect. If you are interested, you can look at it once.

Encapsulation process

1. Custom Properties

selectPoint: Indicator icon selected
normalPoint: Indicator icon not selected
pointWidth: Icon width
switchTime: Carousel Interval Events
location: Indicator position, lower center or lower right


<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. Initialize View
Initialize ViewPager and indicator combination View

3. Bind the data source
Setting carousel data source through setImageData

4. Bind the click event
Bind click events through OnPageClickListener

5. Turn on and off the carousel
start and stop methods turn on and off carousel

Usage

In 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" />

In 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);
    }
  }
}


Related articles: