fix bug #3702 java.lang.IndexOutOfBoundsException Index: 0, Size: 0

com.jude.rollviewpager.RollPagerView.dispatchTouchEvent(RollPagerView.java:402)
This commit is contained in:
huangjian
2020-12-28 17:59:38 +08:00
parent 236b8889fd
commit 640dd5d43e
40 changed files with 1031 additions and 46 deletions

View File

@@ -218,8 +218,6 @@ dependencies {
api "com.darsh.multipleimageselect:multipleimageselect:1.0.4"
api "me.shaohui.advancedluban:library:1.3.5"
api "pl.droidsonroids.gif:android-gif-drawable:1.2.7"
// api "com.jude:rollviewpager:1.4.6"
implementation 'com.github.dongxingrong:RollViewPager:V1.0'
api "com.makeramen:roundedimageview:2.3.0"
api "com.jzxiang.pickerview:TimePickerDialog:1.0.1"
api "com.github.zyyoona7:EasyPopup:1.0.2"

View File

@@ -318,7 +318,7 @@
#暂时keep这个View排查华为oom问题
-keep class com.yizhuan.erban.avroom.widget.MicroView{*;}
-keep class com.jude.rollviewpager.RollPagerView{*;}
-keep class com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView{*;}
#linkedMe
-keep class com.microquation.linkedme.android.** { *; }

View File

@@ -35,9 +35,9 @@ import android.widget.TextView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.coorchice.library.SuperTextView;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.common.antispam.AntiSpamEvent;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.support.glide.GlideApp;

View File

@@ -15,8 +15,8 @@ import android.view.ViewStub;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;

View File

@@ -7,7 +7,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;

View File

@@ -8,7 +8,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;

View File

@@ -27,9 +27,9 @@ import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.netease.nim.uikit.support.glide.GlideRequest;

View File

@@ -8,9 +8,9 @@ import android.view.View;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.R;
import com.yizhuan.erban.ui.widget.RoomItemView;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;

View File

@@ -13,7 +13,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;

View File

@@ -8,7 +8,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import com.coorchice.library.utils.LogUtils;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;

View File

@@ -11,9 +11,9 @@ import android.view.ViewGroup;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.R;
import com.yizhuan.erban.ui.widget.RoomItemView;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;

View File

@@ -14,9 +14,9 @@ import android.widget.TextView;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.R;

View File

@@ -18,9 +18,9 @@ import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;

View File

@@ -32,8 +32,8 @@ import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.bumptech.glide.request.RequestOptions;
import com.coorchice.library.utils.LogUtils;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.MainActivity;

View File

@@ -16,7 +16,7 @@ import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.jude.rollviewpager.hintview.TextHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.TextHintView;
import com.netease.nim.uikit.impl.cache.NimUserInfoCache;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.netease.nimlib.sdk.RequestCallbackWrapper;
@@ -480,6 +480,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
if (ListUtils.isListEmpty(list)) {
return;
}
TextHintView hintView = new TextHintView(this);
hintView.setBackground(getResources().getDrawable(R.drawable.bg_userinfo_photo_hintview));
hintView.setTextSize(SizeUtils.dp2px(this, 4));

View File

@@ -8,7 +8,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.R;
import com.yizhuan.erban.UIHelper;
import com.yizhuan.erban.ui.setting.SettingActivity;

View File

@@ -0,0 +1,10 @@
package com.yizhuan.erban.ui.widget.rollviewpager;
public interface HintView {
void initView(int length, int gravity);
void setCurrent(int current);
}

View File

@@ -0,0 +1,8 @@
package com.yizhuan.erban.ui.widget.rollviewpager;
/**
* Created by zhuchenxi on 16/8/4.
*/
public interface OnItemClickListener {
void onItemClick(int position);
}

View File

@@ -0,0 +1,443 @@
package com.yizhuan.erban.ui.widget.rollviewpager;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
import com.yizhuan.erban.R;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.LoopPagerAdapter;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.util.Timer;
import java.util.TimerTask;
/**
* 支持轮播和提示的的viewpager
*/
public class RollPagerView extends RelativeLayout implements OnPageChangeListener {
private ViewPager mViewPager;
private PagerAdapter mAdapter;
private OnItemClickListener mOnItemClickListener;
private GestureDetector mGestureDetector;
private long mRecentTouchTime;
//播放延迟
private int delay;
//hint位置
private int gravity;
//hint颜色
private int color;
//hint透明度
private int alpha;
private int paddingLeft;
private int paddingTop;
private int paddingRight;
private int paddingBottom;
private View mHintView;
private Timer timer;
private JPagerObserver jPagerObserver;
public interface HintViewDelegate {
void setCurrentPosition(int position, HintView hintView);
void initView(int length, int gravity, HintView hintView);
}
private HintViewDelegate mHintViewDelegate = new HintViewDelegate() {
@Override
public void setCurrentPosition(int position, HintView hintView) {
if (hintView != null)
hintView.setCurrent(position);
}
@Override
public void initView(int length, int gravity, HintView hintView) {
if (hintView != null)
hintView.initView(length, gravity);
}
};
public RollPagerView(Context context) {
this(context, null);
}
public RollPagerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RollPagerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(attrs);
}
/**
* 读取提示形式 和 提示位置 和 播放延迟
*
* @param attrs
*/
private void initView(AttributeSet attrs) {
if (mViewPager != null) {
removeView(mViewPager);
}
TypedArray type = getContext().obtainStyledAttributes(attrs, R.styleable.RollViewPager);
gravity = type.getInteger(R.styleable.RollViewPager_rollviewpager_hint_gravity, 1);
delay = type.getInt(R.styleable.RollViewPager_rollviewpager_play_delay, 0);
color = type.getColor(R.styleable.RollViewPager_rollviewpager_hint_color, Color.BLACK);
alpha = type.getInt(R.styleable.RollViewPager_rollviewpager_hint_alpha, 0);
paddingLeft = (int) type.getDimension(R.styleable.RollViewPager_rollviewpager_hint_paddingLeft, 0);
paddingRight = (int) type.getDimension(R.styleable.RollViewPager_rollviewpager_hint_paddingRight, 0);
paddingTop = (int) type.getDimension(R.styleable.RollViewPager_rollviewpager_hint_paddingTop, 0);
paddingBottom = (int) type.getDimension(R.styleable.RollViewPager_rollviewpager_hint_paddingBottom, Util.dip2px(getContext(), 4));
mViewPager = new ViewPager(getContext());
mViewPager.setId(R.id.viewpager_inner);
mViewPager.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(mViewPager);
type.recycle();
initHint(new ColorPointHintView(getContext(), Color.parseColor("#E3AC42"), Color.parseColor("#88ffffff")));
//手势处理
mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (mOnItemClickListener != null) {
if (mAdapter instanceof LoopPagerAdapter) {//原谅我写了这么丑的代码
mOnItemClickListener.onItemClick(mViewPager.getCurrentItem() % ((LoopPagerAdapter) mAdapter).getRealCount());
} else {
mOnItemClickListener.onItemClick(mViewPager.getCurrentItem());
}
}
return super.onSingleTapUp(e);
}
});
}
private final static class TimeTaskHandler extends Handler {
private WeakReference<RollPagerView> mRollPagerViewWeakReference;
public TimeTaskHandler(RollPagerView rollPagerView) {
this.mRollPagerViewWeakReference = new WeakReference<>(rollPagerView);
}
@Override
public void handleMessage(Message msg) {
RollPagerView rollPagerView = mRollPagerViewWeakReference.get();
if (rollPagerView == null) return;
int cur = rollPagerView.getViewPager().getCurrentItem() + 1;
if (cur >= rollPagerView.mAdapter.getCount()) {
cur = 0;
}
rollPagerView.getViewPager().setCurrentItem(cur);
rollPagerView.mHintViewDelegate.setCurrentPosition(cur, (HintView) rollPagerView.mHintView);
if (rollPagerView.mAdapter.getCount() <= 1) rollPagerView.stopPlay();
}
}
private TimeTaskHandler mHandler = new TimeTaskHandler(this);
private static class WeakTimerTask extends TimerTask {
private WeakReference<RollPagerView> mRollPagerViewWeakReference;
public WeakTimerTask(RollPagerView mRollPagerView) {
this.mRollPagerViewWeakReference = new WeakReference<>(mRollPagerView);
}
@Override
public void run() {
RollPagerView rollPagerView = mRollPagerViewWeakReference.get();
if (rollPagerView != null) {
if (rollPagerView.isShown() && System.currentTimeMillis() - rollPagerView.mRecentTouchTime > rollPagerView.delay) {
rollPagerView.mHandler.sendEmptyMessage(0);
}
} else {
cancel();
}
}
}
/**
* 开始播放
* 仅当view正在显示 且 触摸等待时间过后 播放
*/
private void startPlay() {
if (delay <= 0 || mAdapter == null || mAdapter.getCount() <= 1) {
return;
}
if (timer != null) {
timer.cancel();
}
timer = new Timer();
//用一个timer定时设置当前项为下一项
timer.schedule(new WeakTimerTask(this), delay, delay);
}
private void stopPlay() {
if (timer != null) {
timer.cancel();
timer = null;
}
}
public void setHintViewDelegate(HintViewDelegate delegate) {
this.mHintViewDelegate = delegate;
}
private void initHint(HintView hintview) {
if (mHintView != null) {
removeView(mHintView);
}
if (hintview == null) {
return;
}
mHintView = (View) hintview;
loadHintView();
}
/**
* 加载hintview的容器
*/
private void loadHintView() {
addView(mHintView);
mHintView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
((View) mHintView).setLayoutParams(lp);
GradientDrawable gd = new GradientDrawable();
gd.setColor(color);
gd.setAlpha(alpha);
mHintView.setBackgroundDrawable(gd);
mHintViewDelegate.initView(mAdapter == null ? 0 : mAdapter.getCount(), gravity, (HintView) mHintView);
}
/**
* 设置viewager滑动动画持续时间
*
* @param during
*/
public void setAnimationDurtion(final int during) {
try {
// viePager平移动画事件
Field mField = ViewPager.class.getDeclaredField("mScroller");
mField.setAccessible(true);
Scroller mScroller = new Scroller(getContext(),
// 动画效果与ViewPager的一致
new Interpolator() {
public float getInterpolation(float t) {
t -= 1.0f;
return t * t * t * t * t + 1.0f;
}
}) {
@Override
public void startScroll(int startX, int startY, int dx,
int dy, int duration) {
// 如果手工滚动,则加速滚动
if (System.currentTimeMillis() - mRecentTouchTime > delay) {
duration = during;
} else {
duration /= 2;
}
super.startScroll(startX, startY, dx, dy, duration);
}
@Override
public void startScroll(int startX, int startY, int dx,
int dy) {
super.startScroll(startX, startY, dx, dy, during);
}
};
mField.set(mViewPager, mScroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public void setPlayDelay(int delay) {
this.delay = delay;
startPlay();
}
public void pause() {
stopPlay();
}
public void resume() {
startPlay();
}
public boolean isPlaying() {
return timer != null;
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/**
* 设置提示view的位置
*/
public void setHintPadding(int left, int top, int right, int bottom) {
paddingLeft = left;
paddingTop = top;
paddingRight = right;
paddingBottom = bottom;
mHintView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
}
/**
* 设置提示view的透明度
*
* @param alpha 0为全透明 255为实心
*/
public void setHintAlpha(int alpha) {
this.alpha = alpha;
initHint((HintView) mHintView);
}
/**
* 支持自定义hintview
* 只需new一个实现HintView的View传进来
* 会自动将你的view添加到本View里面。重新设置LayoutParams。
*
* @param hintview
*/
public void setHintView(HintView hintview) {
if (mHintView != null) {
removeView(mHintView);
}
this.mHintView = (View) hintview;
if (hintview != null && hintview instanceof View) {
initHint(hintview);
}
}
/**
* 取真正的Viewpager
*
* @return
*/
public ViewPager getViewPager() {
return mViewPager;
}
/**
* 设置Adapter
*
* @param adapter
*/
public void setAdapter(PagerAdapter adapter) {
if (mAdapter != null && jPagerObserver != null) {
mAdapter.unregisterDataSetObserver(jPagerObserver);
stopPlay();
}
adapter.registerDataSetObserver(jPagerObserver = new JPagerObserver());
mViewPager.setAdapter(adapter);
mViewPager.clearOnPageChangeListeners();
mViewPager.addOnPageChangeListener(this);
mAdapter = adapter;
dataSetChanged();
}
/**
* 用来实现adapter的notifyDataSetChanged通知HintView变化
*/
private class JPagerObserver extends DataSetObserver {
@Override
public void onChanged() {
dataSetChanged();
}
@Override
public void onInvalidated() {
dataSetChanged();
}
}
private void dataSetChanged() {
if (mHintView != null) {
mHintViewDelegate.initView(mAdapter.getCount(), gravity, (HintView) mHintView);
mHintViewDelegate.setCurrentPosition(mViewPager.getCurrentItem(), (HintView) mHintView);
}
startPlay();
}
/**
* 为了实现触摸时和过后一定时间内不滑动,这里拦截
*
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mRecentTouchTime = System.currentTimeMillis();
mGestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
mHintViewDelegate.setCurrentPosition(arg0, (HintView) mHintView);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (getChildCount() == 0 && getViewPager().getCurrentItem() == 0) {
return false;
}
return super.onInterceptTouchEvent(ev);
}
}

View File

@@ -0,0 +1,24 @@
package com.yizhuan.erban.ui.widget.rollviewpager;
import android.content.Context;
public class Util {
/**
* dpתpx
*
*/
public static int dip2px(Context ctx,float dpValue) {
final float scale = ctx.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* pxתdp
*/
public static int px2dip(Context ctx,float pxValue) {
final float scale = ctx.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}

View File

@@ -0,0 +1,43 @@
package com.yizhuan.erban.ui.widget.rollviewpager.adapter;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.PagerAdapter;
/**
* 动态管理的Adapter。概念参照{@link FragmentPagerAdapter}
* 每次都会创建新view销毁旧View。节省内存消耗性能
*
* <p>Subclasses only need to implement {@link #getView(ViewGroup,int)}
* and {@link #getCount()} to have a working adapter.
*
*/
public abstract class DynamicPagerAdapter extends PagerAdapter {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View itemView = getView(container,position);
container.addView(itemView);
return itemView;
}
public abstract View getView(ViewGroup container, int position);
}

View File

@@ -0,0 +1,122 @@
package com.yizhuan.erban.ui.widget.rollviewpager.adapter;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.yizhuan.erban.ui.widget.rollviewpager.HintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import java.lang.reflect.Field;
import java.util.ArrayList;
/**
* Created by Mr.Jude on 2016/1/9.
*/
public abstract class LoopPagerAdapter extends PagerAdapter {
private RollPagerView mViewPager;
private ArrayList<View> mViewList = new ArrayList<>();
private class LoopHintViewDelegate implements RollPagerView.HintViewDelegate{
@Override
public void setCurrentPosition(int position, HintView hintView) {
if (hintView!=null&&getRealCount()>0)
hintView.setCurrent(position%getRealCount());
}
@Override
public void initView(int length, int gravity, HintView hintView) {
if (hintView!=null)
hintView.initView(getRealCount(),gravity);
}
}
@Override
public void notifyDataSetChanged() {
mViewList.clear();
initPosition();
super.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
initPosition();
}
private void initPosition(){
if (mViewPager.getViewPager().getCurrentItem() == 0&&getRealCount()>0){
int half = Integer.MAX_VALUE/2;
int start = half - half%getRealCount();
setCurrent(start);
}
}
private void setCurrent(int index){
try {
Field field = ViewPager.class.getDeclaredField("mCurItem");
field.setAccessible(true);
field.set(mViewPager.getViewPager(),index);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public LoopPagerAdapter(RollPagerView viewPager){
this.mViewPager = viewPager;
viewPager.setHintViewDelegate(new LoopHintViewDelegate());
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int realPosition = position%getRealCount();
View itemView = findViewByPosition(container,realPosition);
container.addView(itemView);
return itemView;
}
private View findViewByPosition(ViewGroup container,int position){
for (View view : mViewList) {
if (((int)view.getTag()) == position&&view.getParent()==null){
return view;
}
}
View view = getView(container,position);
view.setTag(position);
mViewList.add(view);
return view;
}
public abstract View getView(ViewGroup container, int position);
@Deprecated
@Override
public final int getCount() {
return getRealCount()<=0?getRealCount():Integer.MAX_VALUE;
}
public abstract int getRealCount();
}

View File

@@ -0,0 +1,70 @@
package com.yizhuan.erban.ui.widget.rollviewpager.adapter;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.PagerAdapter;
import java.util.ArrayList;
/**
* 静态存储的Adapter。概念参照{@link FragmentStatePagerAdapter}
* view添加进去就不管了View长在内存不再。
* <p>Subclasses only need to implement {@link #getView(ViewGroup,int)}
* and {@link #getCount()} to have a working adapter.
*
*/
public abstract class StaticPagerAdapter extends PagerAdapter {
private ArrayList<View> mViewList = new ArrayList<>();
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public void notifyDataSetChanged() {
mViewList.clear();
super.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View itemView = findViewByPosition(container,position);
container.addView(itemView);
onBind(itemView,position);
return itemView;
}
private View findViewByPosition(ViewGroup container,int position){
for (View view : mViewList) {
if (((int)view.getTag()) == position&&view.getParent()==null){
return view;
}
}
View view = getView(container,position);
view.setTag(position);
mViewList.add(view);
return view;
}
public void onBind(View view,int position){
}
public abstract View getView(ViewGroup container, int position);
}

View File

@@ -0,0 +1,40 @@
package com.yizhuan.erban.ui.widget.rollviewpager.hintview;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
/**
* Created by Mr.Jude on 2016/1/10.
*/
public class ColorPointHintView extends ShapeHintView {
private int focusColor;
private int normalColor;
public ColorPointHintView(Context context,int focusColor,int normalColor) {
super(context);
this.focusColor = focusColor;
this.normalColor = normalColor;
}
@Override
public Drawable makeFocusDrawable() {
GradientDrawable dot_focus = new GradientDrawable();
dot_focus.setColor(focusColor);
dot_focus.setCornerRadius(Util.dip2px(getContext(), 4));
dot_focus.setSize(Util.dip2px(getContext(), 8), Util.dip2px(getContext(), 8));
return dot_focus;
}
@Override
public Drawable makeNormalDrawable() {
GradientDrawable dot_normal = new GradientDrawable();
dot_normal.setColor(normalColor);
dot_normal.setCornerRadius(Util.dip2px(getContext(), 4));
dot_normal.setSize(Util.dip2px(getContext(), 8), Util.dip2px(getContext(), 8));
return dot_normal;
}
}

View File

@@ -0,0 +1,78 @@
package com.yizhuan.erban.ui.widget.rollviewpager.hintview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
/**
* Created by Mr.Jude on 2016/1/10.
*/
public class IconHintView extends ShapeHintView {
private int focusResId;
private int normalResId;
private int size;
public IconHintView(Context context, @DrawableRes int focusResId, @DrawableRes int normalResId) {
this(context, focusResId, normalResId, Util.dip2px(context,32));
}
public IconHintView(Context context, @DrawableRes int focusResId, @DrawableRes int normalResId, int size) {
super(context);
this.focusResId = focusResId;
this.normalResId = normalResId;
this.size = size;
}
@Override
public Drawable makeFocusDrawable() {
Drawable drawable = getContext().getResources().getDrawable(focusResId);
if (size>0){
drawable = zoomDrawable(drawable,size,size);
}
return drawable;
}
@Override
public Drawable makeNormalDrawable() {
Drawable drawable = getContext().getResources().getDrawable(normalResId);
if (size>0){
drawable = zoomDrawable(drawable,size,size);
}
return drawable;
}
private Drawable zoomDrawable(Drawable drawable, int w, int h) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap oldbmp = drawableToBitmap(drawable);
Matrix matrix = new Matrix();
float scaleWidth = ((float) w / width);
float scaleHeight = ((float) h / height);
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
matrix, true);
return new BitmapDrawable(null, newbmp);
}
private Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}
}

View File

@@ -0,0 +1,80 @@
package com.yizhuan.erban.ui.widget.rollviewpager.hintview;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.yizhuan.erban.ui.widget.rollviewpager.HintView;
public abstract class ShapeHintView extends LinearLayout implements HintView {
private ImageView[] mDots;
private int length = 0;
private int lastPosition = 0;
private Drawable dot_normal;
private Drawable dot_focus;
public ShapeHintView(Context context){
super(context);
}
public ShapeHintView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public abstract Drawable makeFocusDrawable();
public abstract Drawable makeNormalDrawable();
@Override
public void initView(int length, int gravity) {
removeAllViews();
lastPosition = 0;
setOrientation(HORIZONTAL);
switch (gravity) {
case 0:
setGravity(Gravity.LEFT| Gravity.CENTER_VERTICAL);
break;
case 1:
setGravity(Gravity.CENTER);
break;
case 2:
setGravity(Gravity.RIGHT| Gravity.CENTER_VERTICAL);
break;
}
this.length = length;
mDots = new ImageView[length];
dot_focus = makeFocusDrawable();
dot_normal = makeNormalDrawable();
for (int i = 0; i < length; i++) {
mDots[i]=new ImageView(getContext());
LayoutParams dotlp = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
dotlp.setMargins(10, 0, 10, 0);
mDots[i].setLayoutParams(dotlp);
mDots[i].setBackgroundDrawable(dot_normal);
addView(mDots[i]);
}
setCurrent(0);
}
@Override
public void setCurrent(int current) {
if (current < 0 || current > length - 1) {
return;
}
mDots[lastPosition].setBackgroundDrawable(dot_normal);
mDots[current].setBackgroundDrawable(dot_focus);
lastPosition = current;
}
}

View File

@@ -0,0 +1,47 @@
package com.yizhuan.erban.ui.widget.rollviewpager.hintview;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import androidx.appcompat.widget.AppCompatTextView;
import com.yizhuan.erban.ui.widget.rollviewpager.HintView;
public class TextHintView extends AppCompatTextView implements HintView {
private int length;
public TextHintView(Context context){
super(context);
}
public TextHintView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void initView(int length, int gravity) {
this.length = length;
setTextColor(Color.WHITE);
switch (gravity) {
case 0:
setGravity(Gravity.LEFT| Gravity.CENTER_VERTICAL);
break;
case 1:
setGravity(Gravity.CENTER);
break;
case 2:
setGravity(Gravity.RIGHT| Gravity.CENTER_VERTICAL);
break;
}
setCurrent(0);
}
@Override
public void setCurrent(int current) {
setText(current+1+"/"+ length);
}
}

View File

@@ -47,7 +47,7 @@
android:layout_below="@+id/toolbar"
>
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="80dp"

View File

@@ -34,7 +34,7 @@
android:layout_height="250dp"
app:edge_position="bottom">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="250dp"

View File

@@ -40,7 +40,7 @@
android:layout_marginBottom="10dp"
app:hw_ratio="0.3462">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/rpv_family_plaza"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -24,7 +24,7 @@
android:background="#FAFAFA"
android:orientation="vertical">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="120dp"

View File

@@ -132,7 +132,7 @@
android:layout_marginEnd="@dimen/dp_15"
android:layout_marginBottom="5dp">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="0dp"

View File

@@ -8,7 +8,7 @@
android:paddingTop="10dp"
android:paddingBottom="10dp">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="120dp"

View File

@@ -11,7 +11,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"
android:layout_height="120dp"

View File

@@ -14,7 +14,7 @@
android:layout_height="wrap_content"
app:hw_ratio="0.28">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/rpv_other_banner"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -348,4 +348,24 @@
<attr name="edge_width" format="dimension" />
</declare-styleable>
<declare-styleable name="RollViewPager">
<attr name="rollviewpager_hint_mode">
<enum name="point" value="0" />
<enum name="number" value="1" />
</attr>
<attr name="rollviewpager_hint_gravity">
<enum name="left" value="0" />
<enum name="center" value="1" />
<enum name="right" value="2" />
</attr>
<attr name="rollviewpager_hint_paddingRight" format="dimension"/>
<attr name="rollviewpager_hint_paddingLeft" format="dimension"/>
<attr name="rollviewpager_hint_paddingTop" format="dimension"/>
<attr name="rollviewpager_hint_paddingBottom" format="dimension"/>
<attr name="rollviewpager_play_delay" format="integer" />
<attr name="rollviewpager_hint_color" format="color" />
<attr name="rollviewpager_hint_alpha" format="integer" />
</declare-styleable>
</resources>

View File

@@ -24,4 +24,5 @@
<item name="day_picker_selected_date_layout" type="id"/>
<item name="done" type="id"/>
<item name="month_text_view" type="id"/>
<item name="viewpager_inner" type="id"/>
</resources>

View File

@@ -15,9 +15,9 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.Util;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.yizhuan.erban.R;
import com.yizhuan.erban.base.BaseMvpActivity;

View File

@@ -159,7 +159,7 @@
android:layout_alignTop="@+id/message_view"
android:layout="@layout/room_mentoring_count_down_timer_view_stub_layout" />
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/activity_img"
android:layout_width="65dp"
android:layout_height="70dp"
@@ -191,7 +191,7 @@
android:visibility="gone"
tools:visibility="visible">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/activity_img_left_cp"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -263,7 +263,7 @@
android:visibility="gone"
tools:visibility="visible">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/activity_img_left"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -6,7 +6,7 @@
android:paddingTop="20dp"
android:paddingBottom="20dp">
<com.jude.rollviewpager.RollPagerView
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
android:id="@+id/roll_view"
android:layout_width="match_parent"