Android 解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题

释放双眼,带上耳机,听听看~!
import java.lang.reflect.Field;

import java.lang.reflect.Method;

/**

 * 解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题

 */

public
class CustomScrollView extends ScrollView {

private GestureDetector
mGestureDetector;

privateintScroll_height = 0;

privateintview_height = 0;

protected Field
scrollView_mScroller;

privatestaticfinal String
TAG =
"CustomScrollView";




public CustomScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

mGestureDetector =
new GestureDetector(context,
new YScrollDetector());

setFadingEdgeLength(0);

}




@Override

public
boolean onInterceptTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

stopAnim();

}

boolean ret =
super.onInterceptTouchEvent(ev);

boolean ret2 =
mGestureDetector.onTouchEvent(ev);

return ret && ret2;

}




class YScrollDetector
extends SimpleOnGestureListener {

@Override

public
boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX,
float distanceY) {

if (Math.abs(distanceY) > Math.abs(distanceX)) {

returntrue;

}

returnfalse;

}

}




@Override

protected
void onScrollChanged(int l,
int t,
int oldl, int oldt) {

boolean stop =
false;

if (Scroll_height -
view_height == t) {

stop = true;

}




if (t == 0 || stop ==
true) {

try {

if (scrollView_mScroller ==
null) {

scrollView_mScroller =
getDeclaredField(this,
"mScroller");

}




Object ob = scrollView_mScroller.get(this);

if (ob ==
null || !(ob
instanceof Scroller)) {

return;

}

Scroller sc = (Scroller) ob;

sc.abortAnimation();




} catch (Exception e) {

Log.e(TAG, e.getMessage());

}

}

super.onScrollChanged(l, t, oldl, oldt);

}




private
void stopAnim() {

try {

if (scrollView_mScroller ==
null) {

scrollView_mScroller =
getDeclaredField(this,
"mScroller");

}




Object ob = scrollView_mScroller.get(this);

if (ob ==
null) {

return;

}

Method method = ob.getClass().getMethod("abortAnimation");

method.invoke(ob);

} catch (Exception ex) {

Log.e(TAG, ex.getMessage());

}

}




@Override

protected
int computeVerticalScrollRange() {

Scroll_height =
super.computeVerticalScrollRange();

returnScroll_height;

}




@Override

protected
void onLayout(boolean changed,
int l,
int t, int r,
int b) {

super.onLayout(changed, l, t, r, b);

if (changed ==
true) {

view_height = b - t;

}

}




@Override

public
void requestChildFocus(View child, View focused) {

if (focused !=
null && focused
instanceof WebView) {

return;

}

super.requestChildFocus(child, focused);

}




/**

* 获取一个对象隐藏的属性,并设置属性为public属性允许直接访问

* 

* @return
{@link Field} 如果无法读取,返回null;返回的Field需要使用者自己缓存,本方法不做缓存

*/

public
static Field getDeclaredField(Object object, String field_name) {

Class<?> cla = object.getClass();

Field field = null;

for (; cla != Object.class; cla = cla.getSuperclass()) {

try {

field = cla.getDeclaredField(field_name);

field.setAccessible(true);

return field;

} catch (Exception e) {




}

}

returnnull;

}




}

 

人已赞赏
Android文章

Android绘制圆形图片:登陆头像

2020-4-15 7:18:06

Android文章

Android开发FragmentTabHost and Fragment 用法

2020-4-15 8:33:01

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索