14

アプリでPDFページを表示するためにAndroid互換パッケージバージョン4を使用しています。水平スクロールビューのようなPDFページを表示するためにPagerAdapterとViewPagerを使用しました。

現在、問題はページング関連のものにあります。このスレッドandroid:ViewPagerおよびHorizo​​ntalScrollVIewに従って、ビューページャー内の子を検出することでページングを停止できますが、ユーザーがそのビューの外側に触れたときに、ページングを有効に戻すにはどうすればよいですか。CustomViewPagerには次のコードを使用しました。

public class CustomViewPager extends ViewPager {

        private boolean enabled;
        private int childId;

        public CustomViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.enabled = true;
        }

        public void setChildId(int childId) {
            this.childId = childId;
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            boolean result = false;
            View scroll = getChildAt(childId);
            if (scroll != null) {
                Rect rect = new Rect();
                CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
                scroll.getHitRect(rect);
                if (rect.contains((int) event.getX(), (int) event.getY())) {
                    setPagingEnabled(false);
                    result = true;
                }
            }
            return result;
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (this.enabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }

        public void setPagingEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }

PDFページの外側に触れようとするとif(scroll!=null)、両方の方向でも同じようになります。

ViewPagerでページングが続行されるように、有効に戻す方法を教えてもらえますか。

4

3 に答える 3

3

ズームするためにピンチが必要な画像ファイルのページングでも同様の問題が発生していました。簡単に言うと、画像を拡大したときにページングを無効にし、画像全体が表示されたときにページングを有効にする方法が必要です。私はこのようにそれを解決しました、そしてあなたが同じようなことをすることができると思います。最初に拡張:クラスMyViewPagerはViewPagerを拡張します{...}次に、そのクラスで次の2つのメソッドをオーバーライドします

    @Override
public boolean onTouchEvent(MotionEvent event) {
    if (YOUR_CRITERIA_TOENABLE_DISABLE) {
        return true;

    } else {
        return super.onTouchEvent(event);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return super.onInterceptTouchEvent(event);
}

必ず、ビューページャーをxmlレイアウトまたはコードからの動的作成で使用してください。

于 2013-05-23T13:15:00.427 に答える
1
@Override
public boolean onTouchEvent(MotionEvent event) {
     if (this.enabled) {
           return super.onTouchEvent(event);
     }
     return false;
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
}

「returnfalse」を「returnthis.enable」に置き換え、this.enableのデフォルト値をfalseに設定します

于 2013-08-02T16:00:14.697 に答える
0

falseに設定していますが、trueにリセットする必要はありません。また、インターセプトタッチロジックは少し奇妙に思えます...ページングをインターセプトできるようにする(そしてそれによって処理するonTouchEvent())のは、ページングをfalseに設定したときだけです。次はどうですか?

 @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        boolean result = true;
        View scroll = getChildAt(childId);
        if (scroll != null) {
            Rect rect = new Rect();
            CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
            scroll.getHitRect(rect);
            if (rect.contains((int) event.getX(), (int) event.getY())) {
                setPagingEnabled(false);
                result = false;
            } else {
                setPagingEnabled(true);
            }
        }
        return result;
    }
于 2012-02-01T22:00:21.750 に答える