描画したいスペースを表す親が見つかるまで、 getParent を再帰的に使用できると思います。使用するレイアウトに大きく依存するため、これは試しませんでした。レイアウトを変更する場合は、おそらくコードを変更する必要があります。
代わりに、レイアウトの最上位で FrameLayout を選択し、目的のレイアウトをその子として配置しました。2 番目の子として、背景が透明な「空の」ビューを配置しました。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();
}
これを行うには他の方法があると思いますが、おそらくもっと良いでしょう。誰か提案があれば、お気軽にコメントしてください。