我正在尝试在可滑动标签的片段中使用HorizontalScrollViews - ViewPager。
我的想法是,当您从右向左滑动手指时,首先将HorizontalScrollView向右滚动,当它到达边缘时,viewpager开始滑动到下一个标签。
如果我尝试直接制作(只需将HorizontalScrollView放入),则首先使用HorizontalScrollView获取事件并滚动一点(5-10像素),然后viewpager捕获事件并开始滑动。
我尝试扩展HorizontalScrollView以防止viewpager在滚动时捕获事件,但是当它到达边缘时我无法“拦截”它以便开始滑动。
我的CustomHorizontalScrollView:
public class CustomHorizontalScrollView extends HorizontalScrollView {
private boolean scrolling = false;
@Override
public boolean onInterceptTouchEvent (MotionEvent event){
if(!isOnLeftEdge() && !isOnRightEdge()){
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent (MotionEvent event){
if(!isOnLeftEdge() && !isOnRightEdge()){
getParent().requestDisallowInterceptTouchEvent(true);
}
if(!scrolling)
getParent().requestDisallowInterceptTouchEvent(true);
if(event.getActionMasked() == MotionEvent.ACTION_MOVE)
scrolling = true;
else if(event.getActionMasked() == MotionEvent.ACTION_UP)
scrolling = false;
return super.onTouchEvent(event);
}
private boolean isOnLeftEdge(){
return getScrollX() == 0;
}
private boolean isOnRightEdge(){
return getChildAt(0).getRight() == getWidth()+getScrollX();
}
}
无论如何我能做到吗?
=================编辑======================
我试图在一个简单的项目中重新创建问题。 API 18 - >空白活动 - >导航类型:固定标签+滑动。
然后我创建一个测试片段:
<?xml version="1.0" encoding="utf-8"?>
<com.example.provesandroid.CustomHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
android:layout_width="500dp"
android:layout_height="500dp"
android:contentDescription=""
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
</LinearLayout>
</com.example.provesandroid.CustomHorizontalScrollView>
我编辑MainActivity
以放置新片段而不是默认片段:
public static class DummySectionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";
public DummySectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.sv_fragment,
container, false);
return rootView;
}
}
ScrollView
:
public class CustomHorizontalScrollView extends HorizontalScrollView {
public CustomHorizontalScrollView(Context context) {
super(context);
}
public CustomHorizontalScrollView(Context context, AttributeSet attr) {
super(context, attr);
}
public CustomHorizontalScrollView(Context context, AttributeSet attr, int defStyle) {
super(context, attr, defStyle);
}
@Override
public boolean onTouchEvent (MotionEvent event){
if(event.getActionMasked() == MotionEvent.ACTION_DOWN)
getParent().requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
}
}
现在这很奇怪,因为使用默认的HorizontalScrollView
标签之间的滑动会随机发生。我认为它与速度或手指运动有关。
但是,正如我在评论中所说的那样,使用新标签时,标签之间的滑动根本不会发生。