2

こんにちは、私は今 Android アプリに取り組んでいます。これはシンプルなミーム メーカーです。キャンバスに要素 (写真) を追加するために、このようなカスタム ビューをキャンバスとして使用しました...

<RelativeLayout>
    <CustomScrollView....
      <LinearLayout....
         <CanvasView.....
         </CanvasView>
      </LinearLayout>
    </CustomScrollView>
</RelativeLayout>

すべての要素が CanvasView に追加され、うまく機能しています。CanvasView で要素にドラッグ アンド ドロップを追加すると、要素を垂直方向にドラッグ アンド ドロップするのが難しい (水平は問題ありません) という問題があり、CustomScrollView のせいだと思い、それを削除し、うまく機能しています。

しかし、CanvasView は以前は画面サイズの高さよりも長かったので、CanvasView をスクロールアップおよびスクロールダウンできるようにする必要があります。単に ScrollView がこれに適していると思います。 ScrollViewとCanvasView?

4

1 に答える 1

1

私はしばらく試してみて、ここで解決策を得ました:

public class CanvasContainerScrollView extends ScrollView {
    public boolean enableScrollView = true;

    public CanvasContainerScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        android.util.Log.v ("scrollview", "touched");
        if (enableScrollView) {
            return super.onTouchEvent(event);
        } 

        return false;
    }

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

enableScrollViewを設定すると、スクロールまたはバイスが有効になります。CanvasViewonTouchEvent-

@Override
    public boolean onTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();

        android.util.Log.v("canvasView", "touched");
        switch (action) {
        case MotionEvent.ACTION_DOWN: {

            final float x = ev.getX();
            final float y = ev.getY();

            int i = 2;
            for (i = goList.size() - 1; i >= 0; --i) {
                if (currentObjectLayer == -1 && goList.get(i).inHitArea(x, y)) {

                    parent.enableScrollView = false;
                    if (currentObjectLayer != -1) {
                        continue;
                    }
                    goList.get(i).selected();
                    currentObjectLayer = i;
                    // break;
                } else {
//                  if (goList.get(i).inHitArea(x, y)) {
//                      parent.enableScrollView = false;
//                  } else {
//                      parent.enableScrollView = true;
//                  }
                    goList.get(i).unselected();
                }
            }

            if (currentObjectLayer == -1) {
                parent.enableScrollView = true;
            }
            // Remember where we started
            lastTouchX = x;
            lastTouchY = y;
            break;
        }

        case MotionEvent.ACTION_MOVE: {
            final float x = ev.getX();
            final float y = ev.getY();

            // Calculate the distance moved
            final float dx = x - lastTouchX;
            final float dy = y - lastTouchY;

            // Move the object
            posX += dx;
            posY += dy;

            // Remember this touch position for the next move event
            lastTouchX = x;
            lastTouchY = y;

            // android.util.Log.v("image", "dx=" + dx + ":dy=" + dy);
            if (currentObjectLayer != -1) {
                goList.get(currentObjectLayer).left += dx;
                goList.get(currentObjectLayer).top += dy;
                goList.get(currentObjectLayer).dx = dx;
                goList.get(currentObjectLayer).dy = dy;
            }

            // Invalidate to request a redraw
            invalidate();
            break;
        }

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            // goList.get(currentObjectLayer).objectType = 0;
            currentObjectLayer = -1;
            parent.enableScrollView = true;
            break;
        }

        invalidate();
        return true;
    }
于 2012-12-28T02:37:17.570 に答える