fix bug #3702 java.lang.IndexOutOfBoundsException Index: 0, Size: 0
com.jude.rollviewpager.RollPagerView.dispatchTouchEvent(RollPagerView.java:402)
This commit is contained in:
@@ -218,8 +218,6 @@ dependencies {
|
|||||||
api "com.darsh.multipleimageselect:multipleimageselect:1.0.4"
|
api "com.darsh.multipleimageselect:multipleimageselect:1.0.4"
|
||||||
api "me.shaohui.advancedluban:library:1.3.5"
|
api "me.shaohui.advancedluban:library:1.3.5"
|
||||||
api "pl.droidsonroids.gif:android-gif-drawable:1.2.7"
|
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.makeramen:roundedimageview:2.3.0"
|
||||||
api "com.jzxiang.pickerview:TimePickerDialog:1.0.1"
|
api "com.jzxiang.pickerview:TimePickerDialog:1.0.1"
|
||||||
api "com.github.zyyoona7:EasyPopup:1.0.2"
|
api "com.github.zyyoona7:EasyPopup:1.0.2"
|
||||||
|
2
app/proguard-rules.pro
vendored
2
app/proguard-rules.pro
vendored
@@ -318,7 +318,7 @@
|
|||||||
|
|
||||||
#暂时keep这个View排查华为oom问题
|
#暂时keep这个View排查华为oom问题
|
||||||
-keep class com.yizhuan.erban.avroom.widget.MicroView{*;}
|
-keep class com.yizhuan.erban.avroom.widget.MicroView{*;}
|
||||||
-keep class com.jude.rollviewpager.RollPagerView{*;}
|
-keep class com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView{*;}
|
||||||
|
|
||||||
#linkedMe
|
#linkedMe
|
||||||
-keep class com.microquation.linkedme.android.** { *; }
|
-keep class com.microquation.linkedme.android.** { *; }
|
||||||
|
@@ -35,9 +35,9 @@ import android.widget.TextView;
|
|||||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||||
import com.chad.library.adapter.base.BaseViewHolder;
|
import com.chad.library.adapter.base.BaseViewHolder;
|
||||||
import com.coorchice.library.SuperTextView;
|
import com.coorchice.library.SuperTextView;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.common.antispam.AntiSpamEvent;
|
import com.netease.nim.uikit.common.antispam.AntiSpamEvent;
|
||||||
import com.netease.nim.uikit.common.util.log.LogUtil;
|
import com.netease.nim.uikit.common.util.log.LogUtil;
|
||||||
import com.netease.nim.uikit.support.glide.GlideApp;
|
import com.netease.nim.uikit.support.glide.GlideApp;
|
||||||
|
@@ -15,8 +15,8 @@ import android.view.ViewStub;
|
|||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.StatusBarUtil;
|
import com.netease.nim.uikit.StatusBarUtil;
|
||||||
import com.netease.nim.uikit.common.util.log.LogUtil;
|
import com.netease.nim.uikit.common.util.log.LogUtil;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
|
@@ -7,7 +7,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
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.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
||||||
|
@@ -8,7 +8,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
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.R;
|
||||||
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
||||||
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
|
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
|
||||||
|
@@ -27,9 +27,9 @@ import com.bumptech.glide.request.RequestListener;
|
|||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
||||||
import com.chad.library.adapter.base.BaseViewHolder;
|
import com.chad.library.adapter.base.BaseViewHolder;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
import com.netease.nim.uikit.support.glide.GlideApp;
|
import com.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.netease.nim.uikit.support.glide.GlideRequest;
|
import com.netease.nim.uikit.support.glide.GlideRequest;
|
||||||
|
@@ -8,9 +8,9 @@ import android.view.View;
|
|||||||
|
|
||||||
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
||||||
import com.chad.library.adapter.base.BaseViewHolder;
|
import com.chad.library.adapter.base.BaseViewHolder;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
import com.yizhuan.erban.ui.widget.RoomItemView;
|
import com.yizhuan.erban.ui.widget.RoomItemView;
|
||||||
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
|
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
|
||||||
|
@@ -13,7 +13,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
|||||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
||||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||||
import com.chad.library.adapter.base.BaseViewHolder;
|
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.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
|
||||||
|
@@ -8,7 +8,7 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import com.coorchice.library.utils.LogUtils;
|
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.SVGADrawable;
|
||||||
import com.opensource.svgaplayer.SVGAImageView;
|
import com.opensource.svgaplayer.SVGAImageView;
|
||||||
import com.opensource.svgaplayer.SVGAParser;
|
import com.opensource.svgaplayer.SVGAParser;
|
||||||
|
@@ -11,9 +11,9 @@ import android.view.ViewGroup;
|
|||||||
|
|
||||||
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
||||||
import com.chad.library.adapter.base.BaseViewHolder;
|
import com.chad.library.adapter.base.BaseViewHolder;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
import com.yizhuan.erban.ui.widget.RoomItemView;
|
import com.yizhuan.erban.ui.widget.RoomItemView;
|
||||||
import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;
|
import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;
|
||||||
|
@@ -14,9 +14,9 @@ import android.widget.TextView;
|
|||||||
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
||||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
||||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
import com.netease.nim.uikit.support.glide.GlideApp;
|
import com.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
|
@@ -18,9 +18,9 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.api.NimUIKit;
|
import com.netease.nim.uikit.api.NimUIKit;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
|
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
|
||||||
|
@@ -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.load.resource.bitmap.BitmapTransformation;
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
import com.bumptech.glide.request.RequestOptions;
|
||||||
import com.coorchice.library.utils.LogUtils;
|
import com.coorchice.library.utils.LogUtils;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
import com.netease.nim.uikit.support.glide.GlideApp;
|
import com.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.yizhuan.erban.MainActivity;
|
import com.yizhuan.erban.MainActivity;
|
||||||
|
@@ -16,7 +16,7 @@ import androidx.core.widget.NestedScrollView;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
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.impl.cache.NimUserInfoCache;
|
||||||
import com.netease.nim.uikit.support.glide.GlideApp;
|
import com.netease.nim.uikit.support.glide.GlideApp;
|
||||||
import com.netease.nimlib.sdk.RequestCallbackWrapper;
|
import com.netease.nimlib.sdk.RequestCallbackWrapper;
|
||||||
@@ -480,6 +480,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
|
|||||||
if (ListUtils.isListEmpty(list)) {
|
if (ListUtils.isListEmpty(list)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TextHintView hintView = new TextHintView(this);
|
TextHintView hintView = new TextHintView(this);
|
||||||
hintView.setBackground(getResources().getDrawable(R.drawable.bg_userinfo_photo_hintview));
|
hintView.setBackground(getResources().getDrawable(R.drawable.bg_userinfo_photo_hintview));
|
||||||
hintView.setTextSize(SizeUtils.dp2px(this, 4));
|
hintView.setTextSize(SizeUtils.dp2px(this, 4));
|
||||||
|
@@ -8,7 +8,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
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.R;
|
||||||
import com.yizhuan.erban.UIHelper;
|
import com.yizhuan.erban.UIHelper;
|
||||||
import com.yizhuan.erban.ui.setting.SettingActivity;
|
import com.yizhuan.erban.ui.setting.SettingActivity;
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
package com.yizhuan.erban.ui.widget.rollviewpager;
|
||||||
|
|
||||||
|
|
||||||
|
public interface HintView {
|
||||||
|
|
||||||
|
void initView(int length, int gravity);
|
||||||
|
|
||||||
|
void setCurrent(int current);
|
||||||
|
}
|
||||||
|
|
@@ -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);
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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);
|
||||||
|
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
@@ -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);
|
||||||
|
|
||||||
|
}
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -47,7 +47,7 @@
|
|||||||
android:layout_below="@+id/toolbar"
|
android:layout_below="@+id/toolbar"
|
||||||
>
|
>
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="80dp"
|
android:layout_height="80dp"
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
android:layout_height="250dp"
|
android:layout_height="250dp"
|
||||||
app:edge_position="bottom">
|
app:edge_position="bottom">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="250dp"
|
android:layout_height="250dp"
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
android:layout_marginBottom="10dp"
|
android:layout_marginBottom="10dp"
|
||||||
app:hw_ratio="0.3462">
|
app:hw_ratio="0.3462">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/rpv_family_plaza"
|
android:id="@+id/rpv_family_plaza"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
android:background="#FAFAFA"
|
android:background="#FAFAFA"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="120dp"
|
android:layout_height="120dp"
|
||||||
|
@@ -132,7 +132,7 @@
|
|||||||
android:layout_marginEnd="@dimen/dp_15"
|
android:layout_marginEnd="@dimen/dp_15"
|
||||||
android:layout_marginBottom="5dp">
|
android:layout_marginBottom="5dp">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
android:paddingTop="10dp"
|
android:paddingTop="10dp"
|
||||||
android:paddingBottom="10dp">
|
android:paddingBottom="10dp">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="120dp"
|
android:layout_height="120dp"
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="120dp"
|
android:layout_height="120dp"
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:hw_ratio="0.28">
|
app:hw_ratio="0.28">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/rpv_other_banner"
|
android:id="@+id/rpv_other_banner"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@@ -348,4 +348,24 @@
|
|||||||
<attr name="edge_width" format="dimension" />
|
<attr name="edge_width" format="dimension" />
|
||||||
</declare-styleable>
|
</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>
|
</resources>
|
||||||
|
@@ -24,4 +24,5 @@
|
|||||||
<item name="day_picker_selected_date_layout" type="id"/>
|
<item name="day_picker_selected_date_layout" type="id"/>
|
||||||
<item name="done" type="id"/>
|
<item name="done" type="id"/>
|
||||||
<item name="month_text_view" type="id"/>
|
<item name="month_text_view" type="id"/>
|
||||||
|
<item name="viewpager_inner" type="id"/>
|
||||||
</resources>
|
</resources>
|
@@ -15,9 +15,9 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||||
import com.jude.rollviewpager.RollPagerView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView;
|
||||||
import com.jude.rollviewpager.Util;
|
import com.yizhuan.erban.ui.widget.rollviewpager.Util;
|
||||||
import com.jude.rollviewpager.hintview.ColorPointHintView;
|
import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView;
|
||||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||||
import com.yizhuan.erban.R;
|
import com.yizhuan.erban.R;
|
||||||
import com.yizhuan.erban.base.BaseMvpActivity;
|
import com.yizhuan.erban.base.BaseMvpActivity;
|
||||||
|
@@ -159,7 +159,7 @@
|
|||||||
android:layout_alignTop="@+id/message_view"
|
android:layout_alignTop="@+id/message_view"
|
||||||
android:layout="@layout/room_mentoring_count_down_timer_view_stub_layout" />
|
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:id="@+id/activity_img"
|
||||||
android:layout_width="65dp"
|
android:layout_width="65dp"
|
||||||
android:layout_height="70dp"
|
android:layout_height="70dp"
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible">
|
tools:visibility="visible">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/activity_img_left_cp"
|
android:id="@+id/activity_img_left_cp"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
@@ -263,7 +263,7 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible">
|
tools:visibility="visible">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
android:id="@+id/activity_img_left"
|
android:id="@+id/activity_img_left"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
android:paddingTop="20dp"
|
android:paddingTop="20dp"
|
||||||
android:paddingBottom="20dp">
|
android:paddingBottom="20dp">
|
||||||
|
|
||||||
<com.jude.rollviewpager.RollPagerView
|
<com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView
|
||||||
|
|
||||||
android:id="@+id/roll_view"
|
android:id="@+id/roll_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
Reference in New Issue
Block a user