Android SurfaceView绘制错位

在Android绘图中,有时候会出现绘制的位置和手指的位置错位的情况,具体的表现为绘制的位置会偏下

这个问题找 好久,最终是在stackoverflow上找到的答案:

How do I correctly translate pixel coordinates to canvas coordinates in Android?

I am capturing a MotionEvent for a long click in an Android SurfaceView using a GestureListener. I then need to translate the coordinates of the MotionEvent to canvas coordinates, from which I can generate custom map coordinates (not Google Maps).

From what I have read, I take that given MotionEvent ee.getX() and e.getY() get pixel coordinates. How can I convert these coordinates to the SurfaceView's canvas coordinates?

If i understand correctly you have a canvas View inside surfaceview. If so try VIEW.getLeft() | getTop() that returns the left | top position of the view relative to it's parent.

float x= e.getX() - canvasView.getLeft();float y= e.getY() - canvasView.getTop();

 

e承载的SurfaceView如果不是紧靠边,就会有些offset,需要把这个减去。

 

来源:http://stackoverflow.com/questions/6852822/how-do-i-correctly-translate-pixel-coordinates-to-canvas-coordinates-in-android

 

转载于:https://www.cnblogs.com/yida915/p/6375937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android SurfaceView 绘制默认黑色背景的原因是因为 SurfaceView绘制是在独立的线程中进行的,而不是在主线程(UI 线程)中进行的。在 SurfaceView 初始化时,默认情况下,它的背景是黑色。 要改变 SurfaceView 的背景颜色,可以通过在 SurfaceView 中重写 `draw` 方法来实现自定义绘制。在 `draw` 方法中,你可以使用 `Canvas` 对象进行绘制操作,包括设置背景颜色。以下是一个简单的示例代码: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; public MySurfaceView(Context context) { super(context); init(); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { holder = getHolder(); holder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 绘制方法 draw(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 空实现 } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 空实现 } private void draw() { Canvas canvas = holder.lockCanvas(); // 获取画布对象 if (canvas != null) { try { // 设置背景颜色 canvas.drawColor(Color.WHITE); // 绘制其他内容 // ... } finally { holder.unlockCanvasAndPost(canvas); // 解锁画布,提交绘制内容 } } } } ``` 在这个示例中,我们通过重写 `surfaceCreated` 方法,在 SurfaceView 创建时调用 `draw` 方法来绘制内容。在 `draw` 方法中,我们使用 `Canvas` 对象设置了白色背景,并可以进行其他的绘制操作。记得在合适的时机解锁画布并提交绘制内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值