【问题标题】:onTouchEvent does not work in DoubleViewPageronTouchEvent 在 DoubleViewPager 中不起作用
【发布时间】:2017-01-11 13:26:15
【问题描述】:

我的项目卡住了,我想寻求帮助

我的 Activity 中有一个带有 3 个片段的 Horizo​​ntal ViewPager,第二个片段中有一个 Vertical。中间很迷茫。如果它是向左或向右滑动,我想将我的事件传递给父 Horizo​​ntal,如果它是向下或向上滑动,则处理它。 我在 onTouchEvent(MotionEvent ev) 中做错了什么?

public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mStartDragX = ev.getX();
            mStartDragY = ev.getY();
            Log.d("action_down", "down : x=" + mStartDragX + "y=" + mStartDragY);

        case MotionEvent.ACTION_MOVE:
            Log.d("values", "ev.getX()" + ev.getX() + "after: " + (ev.getX() - mStartDragX));
            Log.d("values", "ev.getY()" + ev.getY() + "after: " + (ev.getY() - mStartDragY));

            if (Math.abs(ev.getY() - mStartDragY) > Math.abs(ev.getX() - mStartDragX)) {
                Log.d("swiper: ", "Down or Up");
                mParent.requestDisallowInterceptTouchEvent(false);
                return super.onTouchEvent(swapXY(ev));
            } else {
                Log.d("swiper: ", "Left or Right");
                mParent.requestDisallowInterceptTouchEvent(true);
                mParent.onTouchEvent(ev);
            }

            break;
        case MotionEvent.ACTION_UP:
            Log.d("action_up", "up");
            mStartDragX = -1;
            mStartDragY = -1;
            break;
    }

    return false;

}

【问题讨论】:

  • 您是否获得了所有的 Action 类型?您可能必须返回 true 才能接收 ACTION_MOVE 和 ACTION_UP

标签: android android-fragments android-viewpager touch-event


【解决方案1】:

你试试这个 Vertical-ViewPager-Horizo​​ntal-ViewPager-Android 的android库

头等舱

公共类 ContentFragment 扩展片段 {

public HorizontalViewPager viewPager;
public HorizontalViewPagerAdapter horizontalViewPagerAdapter;
public String parentInd;

public ContentFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_content, container, false);

    parentInd=getArguments().getString("parent");

    viewPager = (HorizontalViewPager) view.findViewById(R.id.vpHorizontal);
    horizontalViewPagerAdapter = new HorizontalViewPagerAdapter(getChildFragmentManager());
    horizontalViewPagerAdapter.setParentID(parentInd);
    viewPager.setAdapter(horizontalViewPagerAdapter);
    Helper.log("Card Created : " + parentInd);
    viewPager.setCurrentItem(1);
    return view;
}

}

二等

公共类 ViewPagerAdapter 扩展 FragmentStatePagerAdapter { 公共 ViewPagerAdapter(FragmentManager fm) { 超级(调频); }

@Override
public int getCount() {
    return 10;
}

@Override
public Fragment getItem(int position) {
    ContentFragment contentFragment = new ContentFragment();
    Bundle bundle = new Bundle();
    bundle.putString("parent",String.valueOf(position));
    contentFragment.setArguments(bundle);
    return contentFragment;
}

三等

公共类 VerticalViewPager 扩展 ViewPager {

public VerticalViewPager(Context context) {
    super(context);
    init();
}

public void init(){
    setPageTransformer(true,new VerticalViewPagerTransform());
    setOverScrollMode(OVER_SCROLL_NEVER);
}

public VerticalViewPager(Context context, AttributeSet attributeSet){
    super(context,attributeSet);
    init();
}

private MotionEvent swapXY(MotionEvent event) {
    float x = getWidth();
    float y = getHeight();

    float newX = (event.getY()/y)*y;
    float newY = (event.getX()/x)*x;

    event.setLocation(newX,newY);
    return event;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    boolean intercept = super.onInterceptTouchEvent(swapXY(ev));
    swapXY(ev);
    return intercept;
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
    return super.onTouchEvent(swapXY(ev));
}

private class VerticalViewPagerTransform implements ViewPager.PageTransformer{

    private static final float Min_Scale = 0.65f;
    @Override
    public void transformPage(View page, float position) {

        if(position < -1) {
            page.setAlpha(0);
        }else if(position <= 0){
            page.setAlpha(1);
            page.setTranslationX(page.getWidth() * -position);
            page.setTranslationY(page.getHeight() * position);
            page.setScaleX(1);
            page.setScaleY(1);
        }else if(position <= 1){
            page.setAlpha(1-position);
            page.setTranslationX(page.getWidth()* -position);
            page.setTranslationY(0);
            float scaleFactor = Min_Scale + (1 - Min_Scale) * (1 - Math.abs(position));
            page.setScaleX(scaleFactor);
            page.setScaleY(scaleFactor);
        }else if(position > 1){
            page.setAlpha(0);
        }
    }
}

}

https://github.com/mohitsvnit/Vertical-ViewPager-Horizontal-ViewPager-Android/tree/master/app

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多