Android 移动时自定义视图偏移
Android custom view is offset when while moving
我正在尝试通过单次触摸输入移动主 activity 中的自定义视图,但是事件的 x/y 坐标因操作栏而偏移。
我正在尝试找到一种方法来将操作栏的大小取反到 y 坐标,但似乎没有任何效果。我已经从 y 坐标减去父视图和我的自定义视图大小的差异 getRootView().getHeight() - getHeight()
但值不正确。
谁能给我指出正确的方向?
自定义视图:
public class SampleView extends View {
private Paint paint;
private Path path = new Path();
public SampleView(Context context) {
super(context);
init();
}
public SampleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getRawX();
final int y = (int) event.getRawY();
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
path.moveTo(x, y);
break;
}
case MotionEvent.ACTION_MOVE: {
path.lineTo(x, y);
break;
}
}
invalidate();
return true;
}
}
我没有触及我的 MainActivity,但在 XML 中添加了 activity_main 我的自定义视图:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.caseyweed.sample.MainActivity">
<com.caseyweed.sample.SampleView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
如果您想要相对于视图的坐标而不是设备屏幕坐标,请使用 getX()
和 getY()
而不是 getRawX()
和 getRawY()
。
我正在尝试通过单次触摸输入移动主 activity 中的自定义视图,但是事件的 x/y 坐标因操作栏而偏移。
我正在尝试找到一种方法来将操作栏的大小取反到 y 坐标,但似乎没有任何效果。我已经从 y 坐标减去父视图和我的自定义视图大小的差异 getRootView().getHeight() - getHeight()
但值不正确。
谁能给我指出正确的方向?
自定义视图:
public class SampleView extends View {
private Paint paint;
private Path path = new Path();
public SampleView(Context context) {
super(context);
init();
}
public SampleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getRawX();
final int y = (int) event.getRawY();
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
path.moveTo(x, y);
break;
}
case MotionEvent.ACTION_MOVE: {
path.lineTo(x, y);
break;
}
}
invalidate();
return true;
}
}
我没有触及我的 MainActivity,但在 XML 中添加了 activity_main 我的自定义视图:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.caseyweed.sample.MainActivity">
<com.caseyweed.sample.SampleView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
如果您想要相对于视图的坐标而不是设备屏幕坐标,请使用 getX()
和 getY()
而不是 getRawX()
和 getRawY()
。