0

stackoverflow と Android 開発キットで見つけたいくつかのコードを組み合わせています。フィンガーペイント キャンバスをロック可能な水平スクロール ビュー内に配置したいと考えています。ただし、水平方向に描画しようとすると、キャンバスにペイントするのではなく、スクロールビューがスクロールします。フィンガーペイントのカスタムビューの代わりにイメージビューを使用した場合、この問題は発生しませんでした。おそらく、カスタム lockableHorizo​​ntalScrollView とカスタム drawingView の両方での onTouchEvent のオーバーライドに問題があると思います。必要に応じて、詳細とコードを提供できます。

抜粋:

drawingView.java

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
    }
    return true;
}

LockableHorizo​​ntalScrollView.java

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // if we can scroll pass the event to the superclass
            if (mScrollable) return super.onTouchEvent(ev);
            // only continue to handle the touch event if scrolling enabled
            return mScrollable; // mScrollable is always false at this point
        default:
            return super.onTouchEvent(ev);
    }
}
4

2 に答える 2

1

これは、間違ったメソッドをオーバーライドするだけでなく、xml ファイルの配置の問題でもありました。ボタンは、 horizo​​ntalScrollView の外に配置する必要がありました。onTouchEvent メソッドをオーバーライドする lockableHorizo​​ntalScrollView の代わりに、onInterceptTouchEvent をオーバーライドする必要がありました。コードは次のとおりです。

public class LockableHorizontalScrollView extends HorizontalScrollView{

public LockableHorizontalScrollView(Context context, AttributeSet attrset) {
    super(context, attrset);
}

// true if we can scroll (not locked)
// false if we cannot scroll (locked)
private boolean mScrollable = true;

public void setIsScrollable(boolean scrollable) {
    mScrollable = scrollable;
}

public boolean getIsScrollable() {
    return mScrollable;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (mScrollable) return super.onTouchEvent(ev);
    else return false;
}
于 2011-05-24T04:33:03.280 に答える
0

スクロール動作をどのように機能させたいのか、具体的には、システムがスクロール ジェスチャとペイント ジェスチャの違いをどのように認識しているのかわかりません。

ただし、この前の質問を読むと、スクロールをプログラムで有効または無効にする方法を見つけることができます。

ScrollView アクションを無効にする

于 2011-05-22T19:45:39.463 に答える