0

いくつかのウィジェットを含むアクティビティを考えると、ドラッグ操作中に追加の視覚的フィードバックを提供したいと思います。デフォルトのシャドウで、ドラッグ部分が機能しています。さらに、各ウィジェットは onDrag を処理するため、ウィジェットの領域のすぐ外側にビットマップ インジケーターを描画したいと考えています。ウィジェットの領域内に描画する方法を理解しましたが、(予想どおり) その境界を越えて描画されたものはすべてクリップされます。

私の最初の考えは、SurfaceView を使用することです。親に基づいて作成する必要があるようです。初心者として、これを理解するのは大変な作業なので、誰かが最初にこのアプローチを検証できることを願っています。

もう 1 つの考えは、親のキャンバスに直接描画することです (キャンバスの取得方法がわかれば)。これの欠点は、マーカーを移動する必要があるときに、描いたものを「消去」する必要があると思います。それは過度の再描画を引き起こす可能性がありますか?

他の方法はありますか?親のキャンバスと同じように、SurfaceView で「消去」の問題が発生しますか?

4

1 に答える 1

0

描画したいスペースを表す親が見つかるまで、 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();
}

これを行うには他の方法があると思いますが、おそらくもっと良いでしょう。誰か提案があれば、お気軽にコメントしてください。

于 2012-08-16T18:21:01.087 に答える