Example #1
0
 private void setIndicatorMargin() {
   if (indicator.getVisibility() != VISIBLE) {
     return;
   }
   final ViewGroup.MarginLayoutParams layoutParams =
       (MarginLayoutParams) indicator.getLayoutParams();
   final MarginLayoutParams ffabLp = (MarginLayoutParams) ffab.getLayoutParams();
   layoutParams.bottomMargin = indicatorMargin + ffab.getHeight() + ffabLp.bottomMargin;
 }
Example #2
0
  public IndicatableFFAB(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    final View v = View.inflate(context, R.layout.view_indicatable_ffab, this);
    indicator = (ActionIndicatorView) v.findViewById(R.id.iffab_indicator);
    ffab = (FlingableFAB) v.findViewById(R.id.iffab_ffab);
    ViewCompat.setElevation(indicator, ffab.getCompatElevation());

    final TypedArray a =
        context.obtainStyledAttributes(
            attrs, R.styleable.IndicatableFFAB, defStyleAttr, R.style.Widget_FFAB_IndicatableFFAB);
    try {
      final Drawable fabIcon = a.getDrawable(R.styleable.IndicatableFFAB_fabIcon);
      ffab.setImageDrawable(fabIcon);
      final int fabTint = a.getColor(R.styleable.IndicatableFFAB_fabTint, NO_ID);
      if (fabTint != NO_ID) {
        ViewCompat.setBackgroundTintList(ffab, ColorStateList.valueOf(fabTint));
      }
      final int indicatorTint = a.getColor(R.styleable.IndicatableFFAB_indicatorTint, 0);
      indicator.setBackgroundColor(indicatorTint);
      indicatorMargin =
          a.getDimensionPixelSize(R.styleable.IndicatableFFAB_marginFabToIndicator, 0);
    } finally {
      a.recycle();
    }

    ffab.setOnTouchListener(
        new OnTouchListener() {
          private MotionEvent old;

          @Override
          public boolean onTouch(View view, MotionEvent motionEvent) {
            final int action = motionEvent.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
              old = MotionEvent.obtain(motionEvent);
              onStart();
              return false;
            }
            final Direction direction = Direction.getDirection(old, motionEvent);
            if (action == MotionEvent.ACTION_MOVE) {
              onMoving(direction);
            } else if (action == MotionEvent.ACTION_UP) {
              old.recycle();
              onFling(view.getHandler());
            }
            return false;
          }

          private Direction prevSelected = Direction.UNDEFINED;

          public void onStart() {
            indicator.onActionLeave(prevSelected);
            prevSelected = Direction.UNDEFINED;
            indicator.setVisibility(View.VISIBLE);
          }

          public void onMoving(Direction direction) {
            if (prevSelected == direction) {
              return;
            }
            indicator.onActionLeave(prevSelected);
            if (isDirectionEnabled(direction)) {
              indicator.onActionSelected(direction);
            }
            prevSelected = direction;
          }

          private boolean isDirectionEnabled(Direction direction) {
            for (Direction d : enableDirections) {
              if (d == direction) {
                return true;
              }
            }
            return false;
          }

          public void onFling(Handler handler) {
            handler.postDelayed(
                new Runnable() {
                  @Override
                  public void run() {
                    indicator.setVisibility(View.INVISIBLE);
                  }
                },
                200);
          }
        });

    if (isInEditMode()) {
      indicator.setVisibility(VISIBLE);
    }
  }
Example #3
0
 public void setOnFlingListener(OnFlingListener flingListener) {
   ffab.setOnFlingListener(flingListener);
 }
Example #4
0
 public void show() {
   setVisibility(VISIBLE);
   ffab.show();
 }
Example #5
0
 public void hide() {
   ffab.hide();
   setVisibility(INVISIBLE);
 }