0

android.support.v4.app.FragmentActivityアプリのさまざまな部分間でドラッグ/スワイプしてアクセスできるマルチフラグメント/パネルを備えたアプリを作成するために使用します。私のフラグメントの1つにズーム可能なビューがあり、私の問題は、ズーム可能なビューにいる場合、他のフラグメントへのドラッグ/スワイプの使用を防ぐことです。

Touchイベントからアクションを取得するためにハックしようとしましandroid.support.v4.view.ViewPagerたが、機能しません。

私はこのケースをすべて試しましたが、うまくいきません: (すべてのコードはサブクラスの一部ですandroid.support.v4.view.ViewPager)

ケース 1:

// Not working
@Override
protected void onPageScrolled(int position, float offset, int offsetPixels) {
    if (isPreventDrag()) {
        super.onPageScrolled(position, 1, 0);
    } else {
        super.onPageScrolled(position, offset, offsetPixels);
    }
}

ケース 2:

// Work but stop all event include the event to the target image view.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            lastX = ev.getX(); // float 
            lockScroll = false;
            return super.onInterceptTouchEvent(ev);
        case MotionEvent.ACTION_MOVE:
            this.lockScroll = this.isPreventDrag();
            break;
    }
    if (lockScroll) {
        ev.setLocation(lastX, ev.getY());
        return super.onInterceptTouchEvent(ev);
    } else {
        return super.onInterceptTouchEvent(ev);
    }
}

ケース 3:

// Work good, but by some unknown error I can drag the screen
// some pixels before this stop the event.
@Override
public boolean onTouchEvent(MotionEvent ev) {

    if (this.isPreventDrag()) {
        return true;
    } else {
        return super.onTouchEvent(ev);
    }
}

使用が他のフラグメントへの切り替えを許可されている場合、停止または非アクティブ化を簡単に非アクティブ化する方法が必要です。

これは私にとって有効なコードです。以前にどのようなエラーが発生したかわかりません。

// This work for me,
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (this.isPreventDrag()) {
        return false;
    } else {
        return super.onInterceptTouchEvent(ev);
    }
}
4

1 に答える 1

1

この ViewPager クラスを使用して、viewpager の「スワイプ機能」を制御します。

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private boolean blockSwipe = false;
    public void setBlockSwipe(boolean blockSwipe) {
        this.blockSwipe = blockSwipe;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if (blockSwipe)
            return false;
        else 
            return super.onInterceptTouchEvent(arg0);
    }

}
于 2012-10-16T15:54:22.253 に答える