Skip to content

Commit bc81c22

Browse files
committed
BaseActivity 增加子类可提供提示Dialog的方法provideExtraHintDialog()
UIHintAgent CommonMdDialog 变更为 SimpleHintDialog 并且外部可指定该提示性Dialog的布局 BaseDialog 增加生命周期方法回调、增加可给window配置显示输入法 IDialogLifeCircleListener 增加回调Dialog生命周期的接口 SimpleHintDialog 完善该提示性Dialog 使其更通用 BaseFragment 增加子类可以调用父Fragment请求操作的方法subFragmentOptReq() MrNotification 变更 createNotificationChannel()返回类型 完善 OkToast 意解决快速点击弹出相同文案的Toast而不弹出的问题 SuperEmptyLoadingView 再完善以及增强该类功能 BaseViewHolder 扩展ViewHolder的方法 BaseBanner 增加解决滑动冲突
1 parent c5ec44e commit bc81c22

105 files changed

Lines changed: 7386 additions & 2270 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/com/chad/library/adapter/base/BaseViewHolder.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import android.graphics.drawable.Drawable;
2222
import android.os.Build;
2323
import android.support.annotation.ColorInt;
24+
import android.support.annotation.DimenRes;
2425
import android.support.annotation.DrawableRes;
2526
import android.support.annotation.IdRes;
2627
import android.support.annotation.StringRes;
@@ -672,4 +673,38 @@ public boolean onLongClick(View v) {
672673
return false;
673674
}
674675
};
676+
677+
/**
678+
* added by fee 2020-05-26:
679+
* 增加如果 item view 的数据填充是在本类实现的,则有可能一些子View需要 重新布局
680+
* @param theRelayoutView 要重新layout的 View
681+
* @return true: 去重新layout; false:未 重新layout
682+
*/
683+
protected boolean relayoutAnyView(View theRelayoutView) {
684+
if (adapter != null) {
685+
return adapter.relayoutAnyView(theRelayoutView);
686+
}
687+
return false;
688+
}
689+
690+
/**
691+
* 由Adapter 的系统回调而调用该方法,表示当前ViewHolder被回收了
692+
*/
693+
public void onViewHolderRecycled() {
694+
695+
}
696+
697+
/**
698+
* ViewHolder来监听 所处的宿主是否 当前为可见、活跃状态
699+
* @param isHostActive true: 活动、活跃、可见;false:反之
700+
*/
701+
public void onHostActive(boolean isHostActive){
702+
703+
}
704+
protected int dimen2PixValue(@DimenRes int dimenResId){
705+
if (adapter != null) {
706+
return adapter.dimen2PixValue(dimenResId);
707+
}
708+
return 0;
709+
}
675710
}

src/main/java/com/flyco/banner/widget/Banner/base/BaseBanner.java

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public abstract class BaseBanner<D, I extends BaseBanner> extends RelativeLayout
4848
/** 设备密度 */
4949
protected DisplayMetrics mDisplayMetrics;
5050
/** ViewPager */
51-
protected ViewPager mViewPager;
51+
protected ScrollableViewPager mViewPager;
5252
/** 数据源 */
5353
protected List<D> mDatas = new ArrayList<>();
5454
/** 当前position */
@@ -133,7 +133,7 @@ public BaseBanner(Context context, AttributeSet attrs) {
133133
this(context, attrs, 0);
134134
}
135135
private LoopViewPager loopViewPager;
136-
private ViewPager commonViewPager;
136+
private ScrollableViewPager commonViewPager;
137137
public BaseBanner(Context context, AttributeSet attrs, int defStyle) {
138138
super(context, attrs, defStyle);
139139
this.mContext = context;
@@ -345,22 +345,10 @@ protected I self() {
345345
return (I) this;
346346
}
347347
/**
348-
* 设置ViewPager是否可以手动滑动
349-
* 注:一般是不需要该功能
350-
* @param scrollable
351-
* @return
348+
* 是否需要ViewPager 处理触摸事件冲突
349+
* def = false;
352350
*/
353-
public I setViewPagerScrollable(boolean scrollable) {
354-
if (mViewPager != null) {
355-
if (mViewPager instanceof ScrollableViewPager) {
356-
((ScrollableViewPager) mViewPager).setScrollable(scrollable);
357-
}
358-
else if (mViewPager instanceof LoopViewPager) {
359-
((LoopViewPager) mViewPager).setScrollable(scrollable);
360-
}
361-
}
362-
return self();
363-
}
351+
private boolean isNeedHandleEventConflict;
364352
/** 设置页面切换动画 */
365353
public I setTransformerClass(Class<? extends ViewPager.PageTransformer> transformerClass) {
366354
this.mTransformerClass = transformerClass;
@@ -531,24 +519,24 @@ public void showBanner() {
531519
setUpVIews();
532520
goOnScroll();
533521
}
534-
public void setUpVIews() {
535-
if (mDatas == null) {
536-
throw new IllegalStateException("Data source is empty,you must setSource() before startScroll()");
537-
}
538-
int dataSize = mDatas.size();
539-
if (dataSize > 0 && mCurrentPositon > dataSize - 1) {
540-
mCurrentPositon = 0;
541-
}
542-
onTitleSlect(mTvTitle, mCurrentPositon);
543-
setViewPager();
544-
//create indicator
545-
if (isNeedCreateIndicators) {
546-
View indicatorViews = onCreateIndicator();
547-
if (indicatorViews != null) {
548-
mLlIndicatorContainer.removeAllViews();
549-
mLlIndicatorContainer.addView(indicatorViews);
550-
}
522+
523+
/**
524+
* 设置ViewPager是否可以手动滑动
525+
* 注:一般是不需要该功能
526+
* @param scrollable
527+
* @return
528+
*/
529+
public I setViewPagerScrollable(boolean scrollable) {
530+
if (mViewPager != null) {
531+
mViewPager.setScrollable(scrollable);
532+
// if (mViewPager instanceof ScrollableViewPager) {
533+
// ((ScrollableViewPager) mViewPager).setScrollable(scrollable);
534+
// }
535+
// else if (mViewPager instanceof LoopViewPager) {
536+
// ((LoopViewPager) mViewPager).setScrollable(scrollable);
537+
// }
551538
}
539+
return self();
552540
}
553541
/** 继续滚动(for LoopViewPager) */
554542
public void goOnScroll() {
@@ -772,4 +760,37 @@ public void onClick(View v) {
772760
onItemViewsClickInBanner(v, curClickPosition);
773761
}
774762
}
763+
764+
public void setUpVIews() {
765+
if (mDatas == null) {
766+
throw new IllegalStateException("Data source is empty,you must setSource() before startScroll()");
767+
}
768+
int dataSize = mDatas.size();
769+
if (dataSize > 0 && mCurrentPositon > dataSize - 1) {
770+
mCurrentPositon = 0;
771+
}
772+
onTitleSlect(mTvTitle, mCurrentPositon);
773+
setViewPager();
774+
//create indicator
775+
if (isNeedCreateIndicators) {
776+
View indicatorViews = onCreateIndicator();
777+
if (indicatorViews != null) {
778+
mLlIndicatorContainer.removeAllViews();
779+
mLlIndicatorContainer.addView(indicatorViews);
780+
}
781+
}
782+
//added by fee 2020-04-16:
783+
if (mViewPager != null) {
784+
boolean isReallyHandle = false;
785+
if (isNeedHandleEventConflict) {
786+
isReallyHandle = dataSize > 1;
787+
}
788+
mViewPager.setNeedHandleEventConflict(isReallyHandle);
789+
}
790+
}
791+
792+
public I setNeedHandleEventConflict(boolean isNeedHandleEventConflict) {
793+
this.isNeedHandleEventConflict = isNeedHandleEventConflict;
794+
return self();
795+
}
775796
}

src/main/java/com/flyco/banner/widget/LoopViewPager/LoopViewPager.java

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
import android.support.v4.view.PagerAdapter;
55
import android.support.v4.view.ViewPager;
66
import android.util.AttributeSet;
7-
import android.view.MotionEvent;
8-
7+
import com.flyco.banner.widget.ScrollableViewPager;
98
import java.util.ArrayList;
109
import java.util.List;
1110

12-
public class LoopViewPager extends ViewPager {
13-
private boolean canScroll = true;
11+
/**
12+
* 可无限循环翻页的ViewPager
13+
*/
14+
public class LoopViewPager extends ScrollableViewPager {
1415
private static final boolean DEFAULT_BOUNDARY_CASHING = false;
1516

1617
// OnPageChangeListener mOuterPageChangeListener;
@@ -213,32 +214,4 @@ public void onPageScrollStateChanged(int state) {
213214
}
214215
}
215216
};
216-
@Override
217-
public boolean onInterceptTouchEvent(MotionEvent ev) {
218-
// return false;//可行,不拦截事件,
219-
// return true;//不行,孩子无法处理事件
220-
//return super.onInterceptTouchEvent(ev);//不行,会有细微移动
221-
if (canScroll){
222-
return super.onInterceptTouchEvent(ev);
223-
}else{
224-
return false;
225-
}
226-
}
227-
228-
@Override
229-
public boolean onTouchEvent(MotionEvent ev) {
230-
//return false;// 可行,不消费,传给父控件
231-
//return true;// 可行,消费,拦截事件
232-
//super.onTouchEvent(ev); //不行,
233-
//虽然onInterceptTouchEvent中拦截了,
234-
//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
235-
if (canScroll){
236-
return super.onTouchEvent(ev);
237-
}else {
238-
return true;// 可行,消费,拦截事件
239-
}
240-
}
241-
public void setScrollable(boolean scroll) {
242-
canScroll = scroll;
243-
}
244217
}

src/main/java/com/flyco/banner/widget/ScrollableViewPager.java

Lines changed: 108 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import android.util.AttributeSet;
88
import android.view.MotionEvent;
99

10+
import common.base.utils.CommonLog;
11+
import common.base.utils.ViewUtil;
12+
1013
/**
1114
* ******************(^_^)***********************<br>
1215
* User: fee(QQ/WeiXin:1176610771)<br>
@@ -18,23 +21,84 @@
1821
* ******************(^_^)***********************
1922
*/
2023
public class ScrollableViewPager extends ViewPager {
21-
private boolean canScroll = true;
24+
protected final String TAG = getClass().getSimpleName();
25+
/**
26+
* 当手指触摸时、滑动时 本视图需要 拦截/消费 触摸事件的 X轴方向上的滑动距离
27+
* 值越小 越灵敏,但结果到底拦不拦截还取决于 Y轴方向的移动情况
28+
*/
29+
private final int needInterceptXDistance = 5;
30+
/**
31+
* 当手指触摸时、滑动时 本视图需要 拦截/消费 触摸事件的 Y轴方向上的滑动不拦截的距离
32+
* 值越小,判断越精细、不灵敏,但结果到底拦不拦截还取决于 X轴方向的移动情况
33+
* 因为本类为ViewPager 翻页的默认处理方向为水平滑动,所以应该避免手指移动时Y轴方向的绝对距离太大,该值应该尽量小
34+
*/
35+
private final int notInterceptYDistance = 30;
2236
public ScrollableViewPager(@NonNull Context context) {
2337
this(context,null);
2438
}
2539

2640
public ScrollableViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
2741
super(context, attrs);
2842
}
43+
/**
44+
* 本 ViewPager 是否可以 手指滑动滚动
45+
* def = true
46+
*/
47+
protected boolean canScroll = true;
48+
/**
49+
* 本 ViewPager 是否需要处理事件(滑动事件) 冲突
50+
* def = false
51+
*/
52+
protected boolean needHandleEventConflict;
53+
private int lastXOnIntercept,lastYOnIntercept;
54+
private int lastTouchX,lastTouchY;
2955

3056
@Override
3157
public boolean onInterceptTouchEvent(MotionEvent ev) {
3258
// return false;//可行,不拦截事件,
3359
// return true;//不行,孩子无法处理事件
3460
//return super.onInterceptTouchEvent(ev);//不行,会有细微移动
3561
if (canScroll){
36-
return super.onInterceptTouchEvent(ev);
37-
}else{
62+
if (!needHandleEventConflict) {//如果不处理 滑动冲突,则直接返回父类的处理就行
63+
return super.onInterceptTouchEvent(ev);
64+
}
65+
int action = ev.getAction();
66+
CommonLog.i(TAG, "--> onInterceptTouchEvent() action: " + ViewUtil.motionActionToString(action, true));
67+
boolean needIntercept = false;
68+
int curX = (int) ev.getX();
69+
int curY = (int) ev.getY();
70+
switch (action) {
71+
case MotionEvent.ACTION_DOWN://按下
72+
lastXOnIntercept = curX;
73+
lastYOnIntercept = curY;
74+
break;
75+
case MotionEvent.ACTION_MOVE://移动
76+
CommonLog.i(TAG, "-->onInterceptTouchEvent() curX = " + curX + " curY = " + curY
77+
+ " lastXOnIntercept = " + lastXOnIntercept
78+
+ " lastYOnIntercept = " + lastYOnIntercept
79+
// + " rawX = " + ev.getRawX()//该值为 当前 触摸处在 屏幕坐标系下的X值
80+
);
81+
int moveXDistance = Math.abs(lastXOnIntercept - curX);
82+
int moveYDistance = Math.abs(lastYOnIntercept - curY);
83+
boolean canJudgeSlideX = moveXDistance >= needInterceptXDistance;
84+
boolean canJudgeSlideY = moveYDistance <= notInterceptYDistance;
85+
CommonLog.i(TAG, "--> onInterceptTouchEvent() canJudgeSlideX = " + canJudgeSlideX + " canJudgeSlideY = " + canJudgeSlideY);
86+
if (canJudgeSlideX && canJudgeSlideY) {
87+
requestDisallowInterceptTouchEvent(true);
88+
needIntercept = true;
89+
}
90+
break;
91+
case MotionEvent.ACTION_UP:
92+
break;
93+
case MotionEvent.ACTION_CANCEL:
94+
95+
break;
96+
}
97+
boolean isSuperIntercept = super.onInterceptTouchEvent(ev);
98+
CommonLog.w(TAG, "--> onInterceptTouchEvent() isSuperIntercept = " + isSuperIntercept + " needIntercept = " + needIntercept);
99+
return needIntercept || isSuperIntercept;
100+
}
101+
else{//当不让ViewPager 滚动时,则不拦截事件
38102
return false;
39103
}
40104
}
@@ -47,12 +111,52 @@ public boolean onTouchEvent(MotionEvent ev) {
47111
//虽然onInterceptTouchEvent中拦截了,
48112
//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
49113
if (canScroll){
50-
return super.onTouchEvent(ev);
114+
if (!needHandleEventConflict) {//如果不需要处理 滑动冲突,则直接让父类处理就行
115+
return super.onTouchEvent(ev);
116+
}
117+
int action = ev.getAction();
118+
CommonLog.d(TAG, "--> onTouchEvent() action: " + ViewUtil.motionActionToString(action, true));
119+
boolean needConsume = false;
120+
int curX = (int) ev.getX();
121+
int curY = (int) ev.getY();
122+
switch (action) {
123+
case MotionEvent.ACTION_DOWN://按下
124+
lastTouchX = curX;
125+
lastTouchY = curY;
126+
break;
127+
case MotionEvent.ACTION_MOVE://移动
128+
CommonLog.i(TAG, "-->onTouchEvent() curX = " + curX + " curY = " + curY
129+
+ " lastTouchX = " + lastTouchX
130+
+ " lastTouchY = " + lastTouchY
131+
// + " rawX = " + ev.getRawX()
132+
);
133+
int moveXDistance = Math.abs(lastTouchX - curX);
134+
int moveYDistance = Math.abs(lastTouchY - curY);
135+
boolean canJudgeSlideX = moveXDistance >= needInterceptXDistance;
136+
boolean canJudgeSlideY = moveYDistance <= notInterceptYDistance;
137+
CommonLog.i(TAG, "--> onTouchEvent() canJudgeSlideX = " + canJudgeSlideX + " canJudgeSlideY = " + canJudgeSlideY);
138+
if (canJudgeSlideX && canJudgeSlideY) {
139+
needConsume = true;
140+
}
141+
break;
142+
case MotionEvent.ACTION_UP:
143+
break;
144+
case MotionEvent.ACTION_CANCEL:
145+
146+
break;
147+
}
148+
boolean isSuperIntercept = super.onTouchEvent(ev);
149+
CommonLog.w(TAG, "--> onTouchEvent() isSuperIntercept = " + isSuperIntercept + " needIntercept = " + needConsume);
150+
return needConsume || isSuperIntercept;
51151
}else {
52152
return true;// 可行,消费,拦截事件
53153
}
54154
}
55155
public void setScrollable(boolean scroll) {
56156
canScroll = scroll;
57157
}
158+
159+
public void setNeedHandleEventConflict(boolean needHandleEventConflict) {
160+
this.needHandleEventConflict = needHandleEventConflict;
161+
}
58162
}

0 commit comments

Comments
 (0)