Android自定义View怎么根据另一个view的位置设置自己的位置
时间: 2024-03-25 11:42:07 浏览: 50
在Android中,可以使用`ViewTreeObserver`监听另一个View的位置来设置自己的位置。
具体步骤如下:
1. 在自定义View的构造函数中获取另一个View的引用
```java
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
// 获取另一个View的引用
mTargetView = ((Activity) context).findViewById(R.id.target_view);
// 获取ViewTreeObserver
ViewTreeObserver observer = mTargetView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// 在布局完成后获取另一个View的位置信息
mTargetView.getLocationOnScreen(mTargetLocation);
// 移除监听器
mTargetView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
```
2. 在`onDraw()`方法中根据另一个View的位置设置自己的位置
```java
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 根据另一个View的位置设置自己的位置
int x = mTargetLocation[0] + mTargetView.getWidth() / 2 - getWidth() / 2;
int y = mTargetLocation[1] + mTargetView.getHeight() / 2 - getHeight() / 2;
setX(x);
setY(y);
}
```
上面的代码中,我们使用`mTargetView.getLocationOnScreen(mTargetLocation)`方法获取另一个View的位置信息,然后根据这个位置信息设置自己的位置。由于`getLocationOnScreen()`方法返回的是相对于屏幕左上角的位置,因此我们需要将其转换为相对于父容器的位置,这可以通过计算偏移量来实现。
需要注意的是,由于布局可能会发生变化,因此我们需要在`addOnGlobalLayoutListener()`方法中监听布局完成的事件,并在布局完成后获取另一个View的位置信息。此外,在获取完位置信息后,我们需要将监听器从ViewTreeObserver中移除,以免重复执行。
阅读全文