0

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

我的第一个想法是使用 SurfaceView。看来,我必须根据父级创建一个。作为一个新手,这对我来说有很多工作要做,所以我希望有人可以先验证这种方法。

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

还有其他方法吗?SurfaceView 是否会出现与父画布相同的“擦除”问题?

4

1 回答 1

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();
}

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

于 2012-08-16T18:21:01.087 回答