/**
   * Show this button at the specific location. If this button isn't attached to any parent view
   * yet, it will be add to activity's root view. If not, it will just update the location.
   *
   * @param parent The parent view. Should be {@link FrameLayout} or {@link RelativeLayout}
   * @param x The x value of anchor point.
   * @param y The y value of anchor point.
   * @param gravity The gravity apply with this button.
   * @see Gravity
   */
  public void show(ViewGroup parent, int x, int y, int gravity) {
    if (getParent() == null) {
      ViewGroup.LayoutParams params = parent.generateLayoutParams(null);
      params.width = mBackground.getIntrinsicWidth();
      params.height = mBackground.getIntrinsicHeight();
      updateParams(x, y, gravity, params);

      parent.addView(this, params);
    } else updateLocation(x, y, gravity);
  }
  /**
   * Show this button at the specific location. If this button isn't attached to any parent view
   * yet, it will be add to activity's root view. If not, it will just update the location.
   *
   * @param activity The activity that this button will be attached to.
   * @param x The x value of anchor point.
   * @param y The y value of anchor point.
   * @param gravity The gravity apply with this button.
   * @see Gravity
   */
  public void show(Activity activity, int x, int y, int gravity) {
    if (getParent() == null) {
      FrameLayout.LayoutParams params =
          new FrameLayout.LayoutParams(
              mBackground.getIntrinsicWidth(), mBackground.getIntrinsicHeight());
      updateParams(x, y, gravity, params);

      activity.getWindow().addContentView(this, params);
    } else updateLocation(x, y, gravity);
  }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   setMeasuredDimension(mBackground.getIntrinsicWidth(), mBackground.getIntrinsicHeight());
 }