我创建了一个自定义View
试想一下Rect
的{{1}}
在Canvas
,x = 100
,y = 100
,width = 100
用亮蓝色(或任何你喜欢的颜色)
现在我切换关闭状态栏height = 100
应用程序全屏运行。
试想一下,我会在矩形的中间触摸完全
coordiantes应该是->
- 正如它们应该是150, 150
。
但是现在我激活状态栏150, 150
画布缩小了一点
->
如果你看一下屏幕,就会在状态栏下面画出->
- 这就是我想要的。
现在我再次触摸矩形中间的完全
坐标应为150px
,
但是...... - 耶稣! -
150, 150
坐标包括状态栏高度!
onTouchEvent
坐标不!
那么我该怎么做才能获得正确的Canvas
?
答案 0 :(得分:1)
您使用什么方法从MotionEvent获取x和y?你试过getRawX()和getRawY()吗?
---更新 -
对不起我觉得我误会了什么。你用了什么方法? getY()或getRawY()?
---再次更新---
你在Activity中处理onTouchEvent吗?在这里,我写了一些测试代码:
public class CustomView extends View {
private final Paint p = new Paint();
private final Paint p2 = new Paint();
private float lastRawX = 0, lastRawY = 0;
private float lastX = 0, lastY = 0;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
p.setColor(0xFFFF0000);
p2.setColor(0xFF00FF00);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
lastX = event.getX();
lastY = event.getY();
lastRawX = event.getRawX();
lastRawY = event.getRawY();
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
// make the touch point big enough to be noticed.
canvas.drawCircle(lastX, lastY, 3, p);
canvas.drawCircle(lastRawX, lastRawY, 3, p2);
}
}
getY()的红点和getRawY()的绿点。我已经在模拟器(我可以使用鼠标模拟“准确的”手指触摸)和真实设备中测试它。在两者中,我都可以看到红点正好在我触摸的地方绘制,绿点在红色点下方绘制(正好是状态栏的高度)。
但是如果在一个activity中处理onTouchEvent(),那么getY()和getRawY()将返回相同的值。