package com.hdl.widget.CoverFlowViewPager; import android.app.Activity; import android.content.Context; import android.os.Handler; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; import com.hdl.widgetxm.R; import java.util.List; /** * Created by JLChen on 2019/8/22 */ public class HDLCoverFlowViewPager extends RelativeLayout implements ViewPager.OnPageChangeListener { private View mLayout;//布局 private Activity mContext;//上下文 private ViewPager mViewPager;//viewpager private HDLCoverFlowViewPagerAdapter mPagerAdapter;//adapter private List mViewsList;//url数组 private int currentIndex = 0;//当前实际page // private int startCurrentIndex = 0;//当前page private long secondTime = 0, firstTime = 0; //private Timer mTimer=null;//定时器 //private MyTimerTask mTimerTask=null; private Handler mHandler = null; private AutoRollRunnable mAutoRollRunnable = null; private int mRollTime = 5000; // private int resId_piont_press= R.mipmap.ic_banner_point_press; // private int resId_piont=R.mipmap.ic_banner_point; private boolean isPoint = false;//开启指示器 private int mScrolledCurrentIndex = 0; public static interface OnClickGalleryListener { void onGalleryClick(int position); void onGalleryPositionChange(int position); } private OnClickGalleryListener mOnClickGalleryListener; public HDLCoverFlowViewPager addGalleryListener(OnClickGalleryListener listener) { mOnClickGalleryListener = listener; return this; } //ui更新 // Handler mHandler=mHandler= new Handler(){ // public void handleMessage(Message msg) { // int index = mViewPager.getCurrentItem()+1;//下一个页 // mViewPager.setCurrentItem(index);//设置此次要显示的pager // currentIndex=index%mList.size(); // setImageBackground(currentIndex); // } // }; public HDLCoverFlowViewPager(Context context) { super(context); this.mContext = (Activity) context; } public HDLCoverFlowViewPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = (Activity) context; } public HDLCoverFlowViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = (Activity) context; } /** * 初始化viewpager * * @param list view集合 * @param isGallery 是否使用3D画廊效果 */ public HDLCoverFlowViewPager initBanner(List list, boolean isGallery) { mViewsList = list; //引入布局 mLayout = LayoutInflater.from(mContext).inflate(R.layout.hdl_gallery_banner_view_layout, null); mViewPager = (ViewPager) mLayout.findViewById(R.id.hdl_gallery_viewPager);//关闭 // mLineIndicator = (LinearLayout) mLayout.findViewById(R.id.lineIndicator); // //初始化位置 // currentIndex = startCurrentIndex%mList.size(); currentIndex = 0; mPagerAdapter = new HDLCoverFlowViewPagerAdapter(mViewsList); mPagerAdapter.setOnClickViewsListener(new HDLCoverFlowViewPagerAdapter.OnClickViewsListener() { @Override public void onViewsClick(int position) { if (mOnClickGalleryListener != null) { mOnClickGalleryListener.onGalleryClick(position); } } }); mViewPager.setAdapter(mPagerAdapter); if (isGallery) { mViewPager.setPageTransformer(true, new HDLZoomPageTransformer()); // mViewPager.setPageTransformer(true, new CoverTransformer(0.8f,0f, 0f,25f)); } mViewPager.setCurrentItem(currentIndex); mViewPager.setOffscreenPageLimit(2);//设置预加载的数量,这里设置了2,会预加载中心item左边两个Item和右边两个Item mViewPager.addOnPageChangeListener(this); return this; } /** * 初始化viewpager * * @param list view集合 * @param isGallery 是否使用3D画廊效果 * @param rotationY 旋转角度 */ public HDLCoverFlowViewPager initBanner(List list, boolean isGallery, float rotationY) { mViewsList = list; rotationY = dip2px(rotationY); //引入布局 mLayout = LayoutInflater.from(mContext).inflate(R.layout.hdl_gallery_banner_view_layout, null); mViewPager = (ViewPager) mLayout.findViewById(R.id.hdl_gallery_viewPager);//关闭 mPagerAdapter = new HDLCoverFlowViewPagerAdapter(mViewsList); mPagerAdapter.setOnClickViewsListener(new HDLCoverFlowViewPagerAdapter.OnClickViewsListener() { @Override public void onViewsClick(int position) { if (mOnClickGalleryListener != null) { mOnClickGalleryListener.onGalleryClick(position); } } }); mViewPager.setAdapter(mPagerAdapter); if (isGallery) { // mViewPager.setPageTransformer(true, new HDLZoomPageTransformer(alpha)); mViewPager.setPageTransformer(true, new CoverTransformer(0.3f,0f, 0f, rotationY)); } mViewPager.setCurrentItem(currentIndex); mViewPager.setOffscreenPageLimit(2);//设置预加载的数量,这里设置了2,会预加载中心item左边两个Item和右边两个Item mViewPager.addOnPageChangeListener(this); return this; } // /** // * 添加圆角 // * @param corners // * @return // */ // public HDLGalleryViewPager addRoundCorners(int corners){ // mPagerAdapter.setmRoundCorners(corners); // return this; // } /** * @param columnMargin 两个Page之间的距离 * @param rowMargin page的外边距 * 注意当添加了3D画廊效果时,columnMargin尽量设小。应该本是已经进行了x、y的缩放 */ public HDLCoverFlowViewPager addPageMargin(int columnMargin, int rowMargin) { mViewPager.setPageMargin(dip2px(columnMargin)); RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layout.setMargins(dip2px(rowMargin), 0, dip2px(rowMargin), 0); mViewPager.setLayoutParams(layout); return this; } // /** * 配置完成,将布局添加到父容器 */ public HDLCoverFlowViewPager finishConfig() { this.addView(mLayout); return this; } /** * 设置是否开始自动轮播,并设置时间间隔 */ public HDLCoverFlowViewPager addStartTimer(int time) { mRollTime = time; if (mHandler == null) { mHandler = new Handler(); } if (mAutoRollRunnable == null) { mAutoRollRunnable = new AutoRollRunnable(); } mAutoRollRunnable.start(); return this; } // 停止轮播 public void stopTimer() { if (mAutoRollRunnable != null) { mAutoRollRunnable.stop(); } } private class AutoRollRunnable implements Runnable { //是否在轮播的标志 boolean isRunning = false; @Override public void run() { if (isRunning) { int index = mViewPager.getCurrentItem() + 1;//下一个页 mViewPager.setCurrentItem(index);//设置此次要显示的pager currentIndex = index % mViewsList.size(); // setImageBackground(currentIndex); mHandler.postDelayed(this, 1000 * mRollTime); } } public void start() { if (!isRunning) { isRunning = true; mHandler.removeCallbacks(this); mHandler.postDelayed(this, 1000 * mRollTime); } } public void stop() { if (isRunning) { mHandler.removeCallbacks(this); isRunning = false; } } } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dip2px(float dpValue) { final float scale = mContext.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } //---------------viewpager滑动事件----------------- @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(mScrolledCurrentIndex == position) return; mScrolledCurrentIndex = position; if (mOnClickGalleryListener != null) { mOnClickGalleryListener.onGalleryPositionChange(mScrolledCurrentIndex); } } @Override public void onPageScrollStateChanged(int state) { } /** * 滑动时同步改变底部小圆点 * * @param position */ @Override public void onPageSelected(int position) { currentIndex = position; } public void updateViewsList(List list){ mViewsList = list; if(mPagerAdapter != null) { mPagerAdapter.updateViewsList(mViewsList); refreshViewPager(); } } private void refreshViewPager(){ currentIndex = 0; mPagerAdapter.notifyDataSetChanged(); if(mViewsList.size() > 1) { mViewPager.setCurrentItem(currentIndex + 1); new Handler().postDelayed(new Runnable() { @Override public void run() { mViewPager.setCurrentItem(currentIndex); } }, 1); } } public void setCurrentItem(int item){ currentIndex = item; mViewPager.setCurrentItem(item); } }