당신이 그리려는 공간을 나타내는 부모를 찾을 때까지 getParent를 재귀 적으로 사용할 수 있다고 생각합니다. 사용하는 레이아웃에 매우 의존적이기 때문에 시도하지 않았습니다. 레이아웃을 변경하면 코드를 변경해야 할 수 있습니다.
대신 레이아웃의 최상위 레벨에서 FrameLayout을 선택하고 원하는 레이아웃을 그 레이아웃의 하위 레이어로 지정합니다. 두 번째 자녀는 투명한 배경을 가진 "빈"뷰를 넣습니다. FrameLayout은 모든 자식을 서로 위에 표시합니다. 그래서 내 "빈"뷰가 원하는 레이아웃 위에 표시됩니다. 예 :
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:MyApp="http://schemas.android.com/apk/res/com.example.mockup"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
... stuff for my desired layout ...
</TableLayout>
<com.example.mockup.ActivityView
android:id="@+id/activity_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null" />
</FrameLayout>
코드는 위치 계산식을 제외하면 매우 힘이 빠릅니다. 레이아웃에 독립적이기 위해서는 모든 것을 화면 좌표로 변환하는 것이 가장 좋습니다. 그렇지 않으면 getTop(), getLeft()는 직접 부모를 기준으로 한 값을 반환합니다.이 값은 드로잉을 시작하는 위젯에서 수행 한 것과 같습니다.
private ActivityView mActivityView ;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// get "activity" view - this covers the whole activity space
mActivityView = (ActivityView)findViewById (R.id.activity_view);
// find the widget and give it the activity view
MyWidget widget = (MyWidget)findViewById (R.id.my_widget);
widget.setActivityView (mActivityView);
}
그리고 당신은 위젯이 필요합니다 - 도면 시작하는 하나 : 첫째, 당신이 당신의 활동이 필요
public void setActivityView (ActivityView v)
{
mActivityView = v;
}
public void drawThing (float touchX, float touchY)
// touchX, touchY - location where user is touching, relative to "this" widget.
{
int[] locScreen = new int[2]; // x,y
getLocationOnScreen (locScreen);
int xScreen = locScreen[0] + touchX;
int yScreen = locScreen[1] + touchY;
mActivityView.drawThing (xScreen, yScreen);
}
마지막을, 당신은을 수행해야합니다 ActivityView에서 그리기
private int mXThing;
private int mYThing;
@Override
protected void onDraw (Canvas canvas)
{
super.onDraw (canvas);
... draw the "thing" using mXThing, mYThing ...
}
void drawThing (int xScreen, int yScreen)
{
// convert to view coords.
int[] loc = new int[2]; // x,y
getLocationOnScreen (loc);
mXThing = xScreen - loc[0];
mYThing = yScreen - loc[1];
invalidate();
}
나는 다른 방법으로 이보다 더 좋은 방법이 있다고 상상해보십시오. 누구든지 제안 사항이 있으시면 언제든지 말씀해주십시오.