1

画面サイズよりも大きいキャンバスに描画する方法のサンプルコードを使用した実際の例を探しています(現在、通常どおりに描画しており、画面サイズの外側を表示できません)。画面をスクロール/パンしてキャンバス全体を表示できるようにすることで、さらにストレスがかかります。これ以上の情報が必要な場合はコメントしてください。

更新:ここで私の答えを見つけましたタッチイベントを含むキャンバスの画像

4

3 に答える 3

4

私のバージョンはMonodroidから変換されていますが、実装はほぼ同じに見えるはずです。(私はそれをJavaに戻してみました、それが正確でない場合はお詫びします)

  1. 画面の外に描画するには、好きな場所に描画するだけで、画面の外に描画されます。秘訣は、ズームとパンでそれを確認することです。ビューをズームするには、ScaleGestureDetector.IOnScaleGestureListenerを実装し、以下のようにonScaleメソッドを実装する必要があります。

  2. パンの場合は、とにかくズームに必要なonTouchEventを実装する必要があります。

    private float _scaleFactor;
    private float _xoffset;
    private float _yoffset;
    
    @override
    public bool onScale(ScaleGestureDetector detector){
        _scaleFactor *= detector.ScaleFactor;
        _scaleFactor = Math.Max(0.1f, Math.Min(_scaleFactor, 5.0f));
        invalidate();
        return true;
    } 
    
    @override 
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.save();
        canvas.scale(_scaleFactor, _scaleFactor);//for zoom
        canvas.translate(_xoffset, _yoffset);//for pan
        //DO NORMAL DRAWING HERE
        canvas.restore();
    }
    
    @override 
    public bool onTouchEvent(MotionEvent e){
        switch (e.action){
            case MotionEvent.ACTION_DOWN:{                        
                _prevx = e.getX();
                _prevy = e.getY();
            }
            break;
            case MotionEvent.ACTION_UP:{
                _xoffset += e.getX() - _prevx;
                _yoffset += e.getY() - _prevy;
                invalidate();
    
                _prevx = e.getX();
                _prevy = e.getY();
            }
            break;
        }
        return _scaleGestureDetector.onTouchEvent(e);
    }
    

注:このコードはカスタムVIEWオブジェクト用です。したがって、Viewから継承し、IOnScaleGestureListenerを実装します。

于 2012-07-09T15:32:10.550 に答える
1

キャンバス全体をScrollView内に配置するだけです。このようにして、Androidがすべてのスクロールを処理します。ただし、ユーザーがスクロール以外のCanvasを操作できるようにする場合は、ScrollViewからのタッチイベントの一部をインターセプトする必要があります。これを行う例はここにあります。

于 2012-07-09T15:14:11.437 に答える
1
@Override
public void onCreate(Bundle savedInstanceState)
{
    CustomView customView;
    ScrollView scroll_view;
    HorizontalScrollView h_scroll_view;
    super.onCreate(savedInstanceState);
    scroll_view = new ScrollView(this);
    h_scroll_view = new HorizontalScrollView(this);
    customView = new CustomView(this);

    scroll_view.addView(customView);
    h_scroll_view.addView(scroll_view);
    setContentView(h_scroll_view);
}


public class CustomView extends View
{
    private Paint paint;
    Context app_context;

    public CustomView(Context context) {
        super(context);
        paint = new Paint();
        paint.setColor(Color.GRAY);
        app_context = context;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int width = 1000;
        int height = 1200;
        setMeasuredDimension(width, height);
    }

    @Override
    public void onDraw(Canvas canvas)
    {
       // ToDo: Put drawing code in here
            }
        }
    }
}
于 2017-11-21T08:28:19.010 に答える