码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-17 11:38:10      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:scrollview   viewpager   

import java.lang.reflect.Field;

import java.lang.reflect.Method;

/**

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

 */

public class CustomScrollView extends ScrollView {

private GestureDetector mGestureDetector;

private int Scroll_height = 0;

private int view_height = 0;

protected Field scrollView_mScroller;

private static final 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)) {

return true;

}

return false;

}

}


@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();

return Scroll_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) {


}

}

return null;

}


}

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

标签:scrollview   viewpager   

原文地址:http://blog.csdn.net/sweiqin/article/details/45083429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!