Пример #1
0
  private void createAddButton(Context context) {
    mAddButton =
        new AddFloatingActionButton(context) {
          @Override
          void updateBackground() {
            mPlusColor = mAddButtonPlusColor;
            mColorNormal = mAddButtonColorNormal;
            mColorPressed = mAddButtonColorPressed;
            super.updateBackground();
          }

          @Override
          Drawable getIconDrawable() {
            final RotatingDrawable rotatingDrawable = new RotatingDrawable(super.getIconDrawable());
            mRotatingDrawable = rotatingDrawable;

            final OvershootInterpolator interpolator = new OvershootInterpolator();

            final ObjectAnimator collapseAnimator =
                ObjectAnimator.ofFloat(
                    rotatingDrawable, "rotation", EXPANDED_PLUS_ROTATION, COLLAPSED_PLUS_ROTATION);
            final ObjectAnimator expandAnimator =
                ObjectAnimator.ofFloat(
                    rotatingDrawable, "rotation", COLLAPSED_PLUS_ROTATION, EXPANDED_PLUS_ROTATION);

            collapseAnimator.setInterpolator(interpolator);
            expandAnimator.setInterpolator(interpolator);

            mExpandAnimation.play(expandAnimator);
            mCollapseAnimation.play(collapseAnimator);

            return rotatingDrawable;
          }
        };

    mAddButton.setId(R.id.fab_expand_menu_button);
    mAddButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            toggle();
          }
        });

    addView(mAddButton, super.generateDefaultLayoutParams());
  }
Пример #2
0
  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    switch (mExpandDirection) {
      case EXPAND_UP:
      case EXPAND_DOWN:
        boolean expandUp = mExpandDirection == EXPAND_UP;

        int addButtonY = expandUp ? b - t - mAddButton.getMeasuredHeight() : 0;
        int addButtonLeft = r - l - mAddButton.getMeasuredWidth();
        mAddButton.layout(
            addButtonLeft,
            addButtonY,
            addButtonLeft + mAddButton.getMeasuredWidth(),
            addButtonY + mAddButton.getMeasuredHeight());

        int labelsRight = addButtonLeft - mLabelsMargin;

        int nextY =
            expandUp
                ? addButtonY - mButtonSpacing
                : addButtonY + mAddButton.getMeasuredHeight() + mButtonSpacing;

        for (int i = mButtonsCount - 1; i >= 0; i--) {
          final View child = getChildAt(i);

          if (child == mAddButton) continue;

          int childX =
              addButtonLeft + (mAddButton.getMeasuredWidth() - child.getMeasuredWidth()) / 2;
          int childY = expandUp ? nextY - child.getMeasuredHeight() : nextY;
          child.layout(
              childX,
              childY,
              childX + child.getMeasuredWidth(),
              childY + child.getMeasuredHeight());

          float collapsedTranslation = addButtonY - childY;
          float expandedTranslation = 0f;

          child.setTranslationY(mExpanded ? expandedTranslation : collapsedTranslation);
          child.setAlpha(mExpanded ? 1f : 0f);

          LayoutParams params = (LayoutParams) child.getLayoutParams();
          params.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
          params.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
          params.setAnimationsTarget(child);

          View label = (View) child.getTag(R.id.fab_label);
          if (label != null) {
            int labelLeft = labelsRight - label.getMeasuredWidth();
            int labelTop =
                childY
                    - mLabelsVerticalOffset
                    + (child.getMeasuredHeight() - label.getMeasuredHeight()) / 2;

            label.layout(labelLeft, labelTop, labelsRight, labelTop + label.getMeasuredHeight());

            label.setTranslationY(mExpanded ? expandedTranslation : collapsedTranslation);
            label.setAlpha(mExpanded ? 1f : 0f);

            LayoutParams labelParams = (LayoutParams) label.getLayoutParams();
            labelParams.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
            labelParams.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
            labelParams.setAnimationsTarget(label);
          }

          nextY =
              expandUp
                  ? childY - mButtonSpacing
                  : childY + child.getMeasuredHeight() + mButtonSpacing;
        }
        break;

      case EXPAND_LEFT:
      case EXPAND_RIGHT:
        boolean expandLeft = mExpandDirection == EXPAND_LEFT;

        int addButtonX = expandLeft ? r - l - mAddButton.getMeasuredWidth() : 0;
        mAddButton.layout(
            addButtonX,
            0,
            addButtonX + mAddButton.getMeasuredWidth(),
            mAddButton.getMeasuredHeight());

        int nextX =
            expandLeft
                ? addButtonX - mButtonSpacing
                : addButtonX + mAddButton.getMeasuredWidth() + mButtonSpacing;

        for (int i = mButtonsCount - 1; i >= 0; i--) {
          final View child = getChildAt(i);

          if (child == mAddButton) continue;

          int childX = expandLeft ? nextX - child.getMeasuredWidth() : nextX;
          int childY = (mAddButton.getMeasuredHeight() - child.getMeasuredHeight()) / 2;
          child.layout(
              childX,
              childY,
              childX + child.getMeasuredWidth(),
              childY + child.getMeasuredHeight());

          float collapsedTranslation = addButtonX - childX;
          float expandedTranslation = 0f;

          child.setTranslationX(mExpanded ? expandedTranslation : collapsedTranslation);
          child.setAlpha(mExpanded ? 1f : 0f);

          LayoutParams params = (LayoutParams) child.getLayoutParams();
          params.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
          params.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
          params.setAnimationsTarget(child);

          nextX =
              expandLeft
                  ? childX - mButtonSpacing
                  : childX + child.getMeasuredWidth() + mButtonSpacing;
        }

        break;
    }
  }