Skip to content Skip to sidebar Skip to footer

How Do I Create An Android Material Design Ui Widget?

I did read new android material design guide but i am not able to find anything about how to create this UI widget(element). Apps like Gmail, S converter etc has updated their apps

Solution 1:

You are talking about the Floating Action Button. Bottom line is: there is no native "FAB" widget (at least for now), it is a custom layout that must be implemented.

If you really want to fully implement a Material Design app, I recommend you take a look at Google's 2014 I/O app. They have an example of a FAB layout here.

Here's also the code to create one. It is from this gist.

publicclassFloatingActionButtonextendsView {

    Context context;
    Paint mButtonPaint;
    Paint mDrawablePaint;
    Bitmap mBitmap;
    booleanmHidden=false;

    publicFloatingActionButton(Context context) {
        super(context);
        this.context = context;
        init(Color.WHITE);
    }

    publicvoidinit(int color) {
        setWillNotDraw(false);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        mButtonPaint = newPaint(Paint.ANTI_ALIAS_FLAG);
        mButtonPaint.setColor(color);
        mButtonPaint.setStyle(Paint.Style.FILL);
        mButtonPaint.setShadowLayer(10.0f, 0.0f, 3.5f, Color.argb(100, 0, 0, 0));
        mDrawablePaint = newPaint(Paint.ANTI_ALIAS_FLAG);

        invalidate();
    }

    @OverrideprotectedvoidonDraw(Canvas canvas) {
        setClickable(true);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, (float) (getWidth() / 2.6), mButtonPaint);
        canvas.drawBitmap(mBitmap, (getWidth() - mBitmap.getWidth()) / 2,
                (getHeight() - mBitmap.getHeight()) / 2, mDrawablePaint);
    }

    @OverridepublicbooleanonTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            setAlpha(1.0f);
        } elseif (event.getAction() == MotionEvent.ACTION_DOWN) {
            setAlpha(0.6f);
        }
        returnsuper.onTouchEvent(event);
    }

    publicvoidsetColor(int color) {
        init(color);
    }

    publicvoidsetDrawable(Drawable drawable) {
        mBitmap = ((BitmapDrawable) drawable).getBitmap();
        invalidate();
    }

    publicvoidhide() {
        if (!mHidden) {
            ObjectAnimatorscaleX= ObjectAnimator.ofFloat(this, "scaleX", 1, 0);
            ObjectAnimatorscaleY= ObjectAnimator.ofFloat(this, "scaleY", 1, 0);
            AnimatorSetanimSetXY=newAnimatorSet();
            animSetXY.playTogether(scaleX, scaleY);
            animSetXY.setInterpolator(newAccelerateInterpolator());
            animSetXY.setDuration(100);
            animSetXY.start();
            mHidden = true;
        }
    }

    publicvoidshow() {
        if (mHidden) {
            ObjectAnimatorscaleX= ObjectAnimator.ofFloat(this, "scaleX", 0, 1);
            ObjectAnimatorscaleY= ObjectAnimator.ofFloat(this, "scaleY", 0, 1);
            AnimatorSetanimSetXY=newAnimatorSet();
            animSetXY.playTogether(scaleX, scaleY);
            animSetXY.setInterpolator(newOvershootInterpolator());
            animSetXY.setDuration(200);
            animSetXY.start();
            mHidden = false;
        }
    }

    publicbooleanisHidden() {
        return mHidden;
    }

    publicstaticclassBuilder {
        private FrameLayout.LayoutParams params;
        privatefinal Activity activity;
        intgravity= Gravity.BOTTOM | Gravity.RIGHT; // default bottom right
        Drawable drawable;
        intcolor= Color.WHITE;
        intsize=0;
        floatscale=0;

        /**
         * Constructor using a context for this builder and the
         * {@link FloatingActionButton} it creates
         * @param context
         */publicBuilder(Activity context) {
             scale = context.getResources().getDisplayMetrics().density;
            // The calculation (value * scale + 0.5f) is a widely used to convert to dps to pixel// units based on density scale// see <a href="http://developer.android.com/guide/practices/screens_support.html">// developer.android.com (Supporting Multiple Screen Sizes)</a>
            size = (int) (72 * scale + 0.5f); // default size is 72dp by 72dp
            params = newFrameLayout.LayoutParams(size, size);
            params.gravity = gravity;

            this.activity = context;
        }

        /**
         * Sets the FAB gravity.
         */public Builder withGravity(int gravity) {
            this.gravity = gravity;
            returnthis;
        }

        /**
         * Sets the FAB margins in dp.
         */public Builder withMargins(int left, int top, int right, int bottom) {
            params.setMargins((int) (left * scale + 0.5f), (int) (top * scale + 0.5f),
                    (int) (right * scale + 0.5f), (int) (bottom * scale + 0.5f));
            returnthis;
        }

        /**
         * Sets the FAB drawable.
         *
         * @param drawable
         */public Builder withDrawable(final Drawable drawable) {
            this.drawable = drawable;
            returnthis;
        }

        /**
         * Sets the FAB color.
         *
         * @param color
         */public Builder withColor(finalint color) {
            this.color = color;
            returnthis;
        }

        /**
         * Sets the FAB size.
         *
         * @param size
         * @return
         */public Builder withSize(int size) {
            size = (int) (size * scale + 0.5f);
            params = newFrameLayout.LayoutParams(size, size);
            returnthis;
        }

        /**
         * Creates a {@link FloatingActionButton} with the
         * arguments supplied to this builder.
         */public FloatingActionButton create() {
            finalFloatingActionButtonbutton=newFloatingActionButton(activity);
            button.setColor(this.color);
            button.setDrawable(this.drawable);
            params.gravity = this.gravity;
            ViewGrouproot= (ViewGroup) activity.findViewById(android.R.id.content);
            root.addView(button, params);
            return button;
        }
    }

}

Then you would add like this:

FloatingActionButtonmFab=newFloatingActionButton.Builder(this)
            .withColor(getResources().getColor(R.color.accent_color))
            .withDrawable(getResources().getDrawable(R.drawable.fab_icon))
            .withSize(72)
            .withMargins(0, 0, 16, 16)
            .create();

Post a Comment for "How Do I Create An Android Material Design Ui Widget?"