I'm trying to overlay one view on top of another using addContentView.
The bottom view has an ImageButton on it linked to a ClickListener.
This all worked fine until I add the overlay view using:
addContentView(overlayView, new
LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
After that, no click events are seen by my base view. I think I'm
missing something fundamental about event propagation wrt views, but I
can't figure it out... any thoughts would be appreciated.

Thanks,
-Chris

Here's the base view:
--------------------------------------------------------------------------------------------------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
  android:id="@+id/cameraView" android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:gravity="center_vertical|
center_horizontal">
  <RelativeLayout android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:gravity="bottom">
    <SurfaceView android:id="@+id/camera_surface"
      android:layout_width="fill_parent"
android:layout_height="fill_parent" />
    <LinearLayout android:layout_width="fill_parent"
      android:layout_height="wrap_content"
android:layout_gravity="bottom"
      android:paddingTop="8dip" android:gravity="center_horizontal"
      android:background="#AA000000">
      <ImageButton android:id="@+id/shutterButton"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
        android:src="@android:id/drawable/ic_menu_camera" />
    </LinearLayout>
  </RelativeLayout>
</LinearLayout>
--------------------------------------------------------------------------------------------------------------

And here's the view I'm trying to add on top:
--------------------------------------------------------------------------------------------------------------
public class OverlayView extends View
implements View.OnTouchListener, View.OnClickListener,
ZoomButtonsController.OnZoomListener {

  private final Drawable overlay;
  private boolean inDrag = false;
  private final ZoomButtonsController zoomController;
  private final float zoomIncrement = 0.1f;
  private final float aspectRatio;

  protected OverlayView(Context context) {
    super(context);

    setFocusable(true);
    setFocusableInTouchMode(true);
    overlay = context.getResources().getDrawable(R.drawable.overlay);
    aspectRatio = ((float)overlay.getIntrinsicHeight()) /
((float)overlay.getIntrinsicWidth());
    overlay.setBounds(0, 0, 100, (int)(100 * aspectRatio));
    setOnTouchListener(this);
    setOnClickListener(this);

    zoomController = new ZoomButtonsController(this);
    zoomController.setOnZoomListener(this);
  }

  protected void onDraw(Canvas canvas) {
    overlay.draw(canvas);
    super.onDraw(canvas);
  }

  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      if (overlay.getBounds().contains((int)event.getX(),
(int)event.getY())) {
        inDrag = true;
      } else {
        zoomController.setVisible(true);
      }
      break;
    case MotionEvent.ACTION_MOVE:
      if (inDrag) {
        Rect bounds = new Rect();
        overlay.copyBounds(bounds);
        bounds.offsetTo((int)(event.getX() - bounds.width()/2),
            (int)(event.getY() - bounds.height()/2));
        overlay.setBounds(bounds);
        invalidate();
      }
      break;
    case MotionEvent.ACTION_UP:
      if (inDrag)
        inDrag = false;
      break;
    default:
      break;
    }
    if (zoomController.isVisible())
      zoomController.onTouch(v, event);

    return false;
  }

  public void onClick(View v) {
  }

  public void onVisibilityChanged(boolean visible) {
    setOnTouchListener(this);
  }

  public void onZoom(boolean zoomIn) {
    Rect bounds = new Rect();
    overlay.copyBounds(bounds);
    if (zoomIn) {
      float width = bounds.width() * (1.0f + zoomIncrement);
      float height = width * aspectRatio;
      bounds.set(bounds.left, bounds.top, bounds.left + (int)width,
bounds.top + (int)height);
    }
    else {
      float width = bounds.width() * (1.0f - zoomIncrement);
      float height = width * aspectRatio;
      bounds.set(bounds.left, bounds.top, bounds.left + (int)width,
bounds.top + (int)height);
    }
    overlay.setBounds(bounds);
    invalidate();
  }

  protected void onDetachedFromWindow() {
    zoomController.setVisible(false);
    super.onDetachedFromWindow();
  }

}
--------------------------------------------------------------------------------------------------------------

-- 
You received this message because you are subscribed to the Google
Groups "Android Beginners" group.

NEW! Try asking and tagging your question on Stack Overflow at
http://stackoverflow.com/questions/tagged/android

To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-beginners?hl=en

Reply via email to