鉴于有多个小部件的活动,我想在拖动操作期间提供一些额外的视觉反馈。我有拖动部件工作,默认阴影。此外,当每个小部件处理onDrag时,我想在小部件区域外绘制一个位图指示器。我想出了如何在小部件的区域内绘制,但是(正如预期的那样)它会剪切任何超出其边界的内容。
我的第一个想法是使用SurfaceView。我似乎必须根据父母创建一个。作为一个新手,我需要做很多工作,所以我希望有人能够首先验证这种方法。
另一种想法是直接在父画布上画画(如果我能弄清楚如何获得画布)。我认为这样做的缺点是必须“擦除”当标记需要移动时我绘制的内容。可能导致过度重绘?
还有其他方法吗?我是否会像使用父级画布那样使用SurfaceView的“擦除”问题?
答案 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();
}
我想还有其他方法可以做到这一点,也许更好。如果有人有任何建议,请随时发表评论。