在拖动过程中,在窗口小部件区域外绘制

时间:2012-08-15 01:09:59

标签: android drag-and-drop parent draw

鉴于有多个小部件的活动,我想在拖动操作期间提供一些额外的视觉反馈。我有拖动部件工作,默认阴影。此外,当每个小部件处理onDrag时,我想在小部件区域外绘制一个位图指示器。我想出了如何在小部件的区域内绘制,但是(正如预期的那样)它会剪切任何超出其边界的内容。

我的第一个想法是使用SurfaceView。我似乎必须根据父母创建一个。作为一个新手,我需要做很多工作,所以我希望有人能够首先验证这种方法。

另一种想法是直接在父画布上画画(如果我能弄清楚如何获得画布)。我认为这样做的缺点是必须“擦除”当标记需要移动时我绘制的内容。可能导致过度重绘?

还有其他方法吗?我是否会像使用父级画布那样使用SurfaceView的“擦除”问题?

1 个答案:

答案 0 :(得分:0)

我认为可以递归地使用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();
}

我想还有其他方法可以做到这一点,也许更好。如果有人有任何建议,请随时发表评论。