我正在寻找一个真实的例子,其中包含如何在大于屏幕大小的画布上绘制的示例代码(截至目前,我正在正常绘制,无法查看屏幕大小之外的内容)。更重要的是能够滚动/平移屏幕来查看整个画布。如果需要更多信息,请评论。
更新:在这里找到了我的答案带有触摸事件的画布中的图像
我的版本是从Mondroid转换而来的,但实现看起来应该大致相同。(我试着把它放回java中,如果不准确,很抱歉)
-
为了在屏幕外绘制,只要在你想要的地方绘制,它就会被绘制在屏幕外。诀窍是通过缩放和平移来查看它。为了缩放视图,您需要实现ScaleGestureDetector.IOnScaleGestureListener,并实现onScale方法,如下所示。
-
对于平移,您只需要实现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
}
}
}
}