package com.mylhyl.circledialog.view; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import com.mylhyl.circledialog.engine.ImageLoadEngine; import com.mylhyl.circledialog.internal.CircleParams; import com.mylhyl.circledialog.internal.Controller; import com.mylhyl.circledialog.params.AdParams; import com.mylhyl.circledialog.view.listener.AdView; import com.mylhyl.circledialog.view.listener.OnAdItemClickListener; import com.mylhyl.circledialog.view.listener.OnAdPageChangeListener; import java.util.ArrayList; import java.util.List; /** * 广告 * Created by hupei on 2019/1/11 11:01. */ final class BodyAdView extends RelativeLayout implements AdView, ViewPager.OnPageChangeListener { private AdParams mAdParams; private ImageLoadEngine mImageLoadEngine; private ViewPager mViewPager; private LinearLayout mLlIndicator; private List mViews; private List mUrls; private OnAdItemClickListener mImageClickListener; private OnAdPageChangeListener mPageChangeListener; public BodyAdView(Context context, CircleParams circleParams) { super(context); this.mAdParams = circleParams.adParams; this.mImageLoadEngine = circleParams.imageLoadEngine; this.mPageChangeListener = circleParams.circleListeners.adPageChangeListener; init(); } @Override public void regOnImageClickListener(OnAdItemClickListener listener) { mImageClickListener = listener; } @Override public View getView() { return this; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mPageChangeListener != null && mUrls != null) { mPageChangeListener.onPageScrolled(getContext(), mViews.get(position), mUrls.get(position), position, positionOffset, positionOffsetPixels); } } @Override public void onPageSelected(int position) { position = position % mViews.size(); pageSelectedToPoint(position); } @Override public void onPageScrollStateChanged(int state) { if (mPageChangeListener != null) { mPageChangeListener.onPageScrollStateChanged(state); } } private void init() { initViewPager(); //指示器 initIndicator(); } private void initViewPager() { mViewPager = new WrapViewPage(getContext()); mViewPager.setId(android.R.id.list); mViews = new ArrayList<>(); if (mAdParams.urls != null) { mUrls = new ArrayList<>(); for (String url : mAdParams.urls) { ImageView imageView = new ImageView(getContext()); imageView.setAdjustViewBounds(true); mViews.add(imageView); mUrls.add(url); } } else if (mAdParams.resIds != null) { for (int imageResId : mAdParams.resIds) { ImageView imageView = new ImageView(getContext()); imageView.setAdjustViewBounds(true); imageView.setImageResource(imageResId); mViews.add(imageView); } } mViewPager.setAdapter(new PageAdapter()); mViewPager.addOnPageChangeListener(this); mViewPager.setOverScrollMode(OVER_SCROLL_NEVER); addView(mViewPager); } private void initIndicator() { if (!mAdParams.isShowIndicator) { return; } if (mLlIndicator != null) { mLlIndicator.removeAllViews(); } mLlIndicator = new LinearLayout(getContext()); mLlIndicator.setOrientation(LinearLayout.HORIZONTAL); mLlIndicator.setGravity(Gravity.CENTER_VERTICAL); RelativeLayout.LayoutParams lpIndicator = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 80); lpIndicator.addRule(RelativeLayout.CENTER_HORIZONTAL); lpIndicator.addRule(RelativeLayout.ALIGN_BOTTOM, android.R.id.list); mLlIndicator.setLayoutParams(lpIndicator); LinearLayout.LayoutParams lpPoint = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); int pointLeftRightMargin = Controller.dp2px(getContext(), mAdParams.pointLeftRightMargin); lpPoint.setMargins(pointLeftRightMargin, 0, pointLeftRightMargin, 0); for (int i = 0; i < mViews.size(); i++) { ImageView imageView = new ImageView(getContext()); imageView.setSelected(true); imageView.setLayoutParams(lpPoint); if (mAdParams.pointDrawableResId != 0) { imageView.setImageResource(mAdParams.pointDrawableResId); } else { Drawable pointDrawable = new BuildViewAdImpl.SelectorPointDrawable(Color.WHITE, 20); imageView.setImageDrawable(pointDrawable); } mLlIndicator.addView(imageView); } addView(mLlIndicator); pageSelectedToPoint(0); } private void pageSelectedToPoint(int position) { if (!mAdParams.isShowIndicator || mLlIndicator == null) { return; } int childCount = mLlIndicator.getChildCount(); for (int i = 0; i < childCount; i++) { View childAt = mLlIndicator.getChildAt(i); boolean selected = i == position; childAt.setSelected(selected); childAt.requestLayout(); } } private class PageAdapter extends PagerAdapter { @Override public int getCount() { return mViews == null ? 0 : mViews.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { if (mViews == null || mViews.get(position) == null) { return null; } final int finalPosition = position % mViews.size(); ImageView view = mViews.get(finalPosition); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mImageClickListener != null) { int position = mViewPager.getCurrentItem() % mViews.size(); mImageClickListener.onItemClick(v, position); } } }); if (mUrls != null && !mUrls.isEmpty() && mImageLoadEngine != null) { mImageLoadEngine.loadImage(getContext(), view, mUrls.get(finalPosition)); } if (mUrls != null && !mUrls.isEmpty() && mPageChangeListener != null) { mPageChangeListener.onPageSelected(getContext(), view, mUrls.get(finalPosition), finalPosition); } ViewParent viewParent = view.getParent(); if (viewParent != null) { ((ViewGroup) viewParent).removeView(view); } container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } }