diff --git a/app/build.gradle b/app/build.gradle index 7608f67fc..65cb3ed2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index eb19d600f..97f003353 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -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.** { *; } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index b16b6f8b3..91e57fdac 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/decoration/view/MyDecorationActivity.java b/app/src/main/java/com/yizhuan/erban/decoration/view/MyDecorationActivity.java index 7c7086a6d..16f0fe3d1 100644 --- a/app/src/main/java/com/yizhuan/erban/decoration/view/MyDecorationActivity.java +++ b/app/src/main/java/com/yizhuan/erban/decoration/view/MyDecorationActivity.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/family/view/adapter/FamilyBannerAdapter.java b/app/src/main/java/com/yizhuan/erban/family/view/adapter/FamilyBannerAdapter.java index 6de6b1520..38b444250 100644 --- a/app/src/main/java/com/yizhuan/erban/family/view/adapter/FamilyBannerAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/family/view/adapter/FamilyBannerAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/BannerAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/BannerAdapter.java index 804aee959..d8f285495 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/BannerAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/BannerAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java index 64b521d9f..be8c3f20c 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeRoomAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeRoomAdapter.java index 6042a337d..6c607e5c4 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeRoomAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeRoomAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/OtherBannerAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/OtherBannerAdapter.java index dc8ed0f73..f05d1064d 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/OtherBannerAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/OtherBannerAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java index d26ef16f8..d6a880d40 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomTabAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomTabAdapter.java index d686999be..0badf349f 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomTabAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomTabAdapter.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/FamilyFragment.java b/app/src/main/java/com/yizhuan/erban/home/fragment/FamilyFragment.java index 690acf95e..19ba5ac8e 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/FamilyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/FamilyFragment.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/FindFragment.java b/app/src/main/java/com/yizhuan/erban/home/fragment/FindFragment.java index 65972ae43..bcfa17325 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/FindFragment.java +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/FindFragment.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/GameHomeFragment.java b/app/src/main/java/com/yizhuan/erban/home/fragment/GameHomeFragment.java index ed8072cc4..5958e54f7 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/GameHomeFragment.java +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/GameHomeFragment.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java index f085910b4..1e0fce863 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java @@ -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 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 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); + } + +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/Util.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/Util.java new file mode 100644 index 000000000..5bfb6a1fb --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/Util.java @@ -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); + } + +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/DynamicPagerAdapter.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/DynamicPagerAdapter.java new file mode 100644 index 000000000..f365d2da1 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/DynamicPagerAdapter.java @@ -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。节省内存消耗性能 + * + *

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); + +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/LoopPagerAdapter.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/LoopPagerAdapter.java new file mode 100644 index 000000000..081ce5410 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/LoopPagerAdapter.java @@ -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 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(); +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/StaticPagerAdapter.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/StaticPagerAdapter.java new file mode 100644 index 000000000..46d9d2499 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/adapter/StaticPagerAdapter.java @@ -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长在,内存不再。 + *

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 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); + +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ColorPointHintView.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ColorPointHintView.java new file mode 100644 index 000000000..d8042b163 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ColorPointHintView.java @@ -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; + } +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/IconHintView.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/IconHintView.java new file mode 100644 index 000000000..b38c6fdb6 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/IconHintView.java @@ -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; + } +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ShapeHintView.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ShapeHintView.java new file mode 100644 index 000000000..d86ba9258 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/ShapeHintView.java @@ -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; + } +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/TextHintView.java b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/TextHintView.java new file mode 100644 index 000000000..217776828 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/rollviewpager/hintview/TextHintView.java @@ -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); + } +} diff --git a/app/src/main/res/layout/activity_my_decoration.xml b/app/src/main/res/layout/activity_my_decoration.xml index 9be21cd61..cfed4753a 100644 --- a/app/src/main/res/layout/activity_my_decoration.xml +++ b/app/src/main/res/layout/activity_my_decoration.xml @@ -47,7 +47,7 @@ android:layout_below="@+id/toolbar" > - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 0eb46a760..587d479d3 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -24,4 +24,5 @@ + \ No newline at end of file diff --git a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldMainActivity.java b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldMainActivity.java index adc1c2cfb..798326c0a 100644 --- a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldMainActivity.java +++ b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldMainActivity.java @@ -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; diff --git a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml index 691419ebb..749da3257 100644 --- a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml +++ b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml @@ -159,7 +159,7 @@ android:layout_alignTop="@+id/message_view" android:layout="@layout/room_mentoring_count_down_timer_view_stub_layout" /> - - - -