如何在大于屏幕大小的画布上绘制,并能够在android中水平和垂直滚动/平移



我正在寻找一个真实的例子,其中包含如何在大于屏幕大小的画布上绘制的示例代码(截至目前,我正在正常绘制,无法查看屏幕大小之外的内容)。更重要的是能够滚动/平移屏幕来查看整个画布。如果需要更多信息,请评论。

更新:在这里找到了我的答案带有触摸事件的画布中的图像

我的版本是从Mondroid转换而来的,但实现看起来应该大致相同。(我试着把它放回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

您可以简单地将整个画布放在ScrollView中。通过这种方式,Android可以为您处理所有的滚动。但是,如果您希望用户能够与画布交互,而不是滚动,则需要从ScrollView中截取一些触摸事件。在这里可以找到一个这样做的例子。

@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
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新