content: /*
   *   Copyright 2014 Oguz Bilgener
   */
  package com.cpacm.library;
  
  import android.app.Activity;
  import android.graphics.drawable.Drawable;
  import android.os.Build;
  import android.view.Gravity;
  import android.view.View;
  import android.widget.FrameLayout;
  
  /**
   * A simple button implementation with a similar look an feel to{@link FloatingActionButton}.
   */
  public class SubActionButton extends FrameLayout {
  
      public static final int THEME_LIGHT = 0;
      public static final int THEME_DARK = 1;
      public static final int THEME_LIGHTER = 2;
      public static final int THEME_DARKER = 3;
  
      public SubActionButton(Activity activity, LayoutParams layoutParams, int theme, Drawable backgroundDrawable, View contentView, LayoutParams contentParams) {
          super(activity);
          setLayoutParams(layoutParams);
          // If no custom backgroundDrawable is specified, use the background drawable of the theme.
          if(backgroundDrawable == null) {
              if(theme == THEME_LIGHT) {
                  backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_sub_action_selector);
              }
              else if(theme == THEME_DARK) {
                  backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_sub_action_dark_selector);
              }
              else if(theme == THEME_LIGHTER) {
                  backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_action_selector);
              }
              else if(theme == THEME_DARKER) {
                  backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_action_dark_selector);
              }
              else {
                  throw new RuntimeException("Unknown SubActionButton theme: " + theme);
              }
          }
          else {
              //通过mutate()方法解决Drawable共用一个内存空间的问题
              backgroundDrawable = backgroundDrawable.mutate().getConstantState().newDrawable();
          }
          //设置背景（考虑版本问题）
          setBackgroundResource(backgroundDrawable);
          if(contentView != null) {
              //添加view(即菜单的选项视图)
              setContentView(contentView, contentParams);
          }
          setClickable(true);
      }
  
      /**
       * Sets a content view with custom LayoutParams that will be displayed inside this SubActionButton.
       * @param contentView
       * @param params
       */
      public void setContentView(View contentView, LayoutParams params) {
          if(params == null) {
              params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER);
              final int margin = getResources().getDimensionPixelSize(R.dimen.sub_action_button_content_margin);
              params.setMargins(margin, margin, margin, margin);
          }
  
          contentView.setClickable(false);
          this.addView(contentView, params);
      }
  
      /**
       * Sets a content view with default LayoutParams
       * @param contentView
       */
      public void setContentView(View contentView) {
          setContentView(contentView, null);
      }
  
      private void setBackgroundResource(Drawable drawable) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
              //设置背景
              setBackground(drawable);
          }
          else {
              setBackgroundDrawable(drawable);
          }
      }
  
      /**
       * A builder for {@link com.cpacm.library.SubActionButton} in conventional Java Builder format
       * 菜单选项的建造器
       */
      public static class Builder {
  
          private Activity activity;
          private LayoutParams layoutParams;
          private int theme;
          private Drawable backgroundDrawable;
          private View contentView;
          private LayoutParams contentParams;
  
          public Builder(Activity activity) {
              this.activity = activity;
  
              // Default SubActionButton settings
              int size = activity.getResources().getDimensionPixelSize(R.dimen.sub_action_button_size);
              LayoutParams params = new LayoutParams(size, size, Gravity.TOP | Gravity.LEFT);
  
              setLayoutParams(params);
              setTheme(SubActionButton.THEME_LIGHT);
          }
  
          public Builder setLayoutParams(LayoutParams params) {
              this.layoutParams = params;
              return this;
          }
  
          public Builder setTheme(int theme) {
              this.theme = theme;
              return this;
          }
  
          public Builder setBackgroundDrawable(Drawable backgroundDrawable) {
              this.backgroundDrawable = backgroundDrawable;
              return this;
          }
  
          public Builder setContentView(View contentView) {
              this.contentView = contentView;
              return this;
          }
  
          public Builder setContentView(View contentView, LayoutParams contentParams) {
              this.contentView = contentView;
              this.contentParams = contentParams;
              return this;
          }
  
          public SubActionButton build() {
              return new SubActionButton(activity,
                      layoutParams,
                      theme,
                      backgroundDrawable,
                      contentView,
                      contentParams);
          }
      }
  }
  