Добавление Плавающей Кнопки Действия В Ваше Приложение Для Android

В этом году на презентации Google I/O была представлена новая версия Android — л .

Вместе с этим было введено множество новых вкусностей для пользователей и разработчиков.

Но одним из главных нововведений, несомненно, стало новое решение Google для унификации дизайна — Material Design. Одним из шаблонов Material Design является Плавающая кнопка действия .



Что такое плавающая кнопка действия?

Google утверждает, что это «индивидуальный метод стимулирования действий».

Сама кнопка имеет форму круга, плавающего над интерфейсом.



Добавление плавающей кнопки действия в ваше приложение для Android

Стоит отметить что Плавающая кнопка действия должна отражать только основное действие в приложении.



Быстрая и грязная реализация

Я хотел создать быстрый способ добавления простого FAB для моих приложений Android с minSdkVersion = 14 (Ice Cream Sandwich).

Я также реализовал анимацию затухания/исчезновения и параметры настройки небольших кнопок.

Весь код доступен в Гитхаб суть (добавьте этот класс в свой проект).

Для надежности продублирую код здесь

  
   

package your_package; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; public class FloatingActionButton extends View { Context context; Paint mButtonPaint; Paint mDrawablePaint; Bitmap mBitmap; boolean mHidden = false; public FloatingActionButton(Context context) { super(context); this.context = context; init(Color.WHITE); } public void setFloatingActionButtonColor(int FloatingActionButtonColor) { init(FloatingActionButtonColor); } public void setFloatingActionButtonDrawable(Drawable FloatingActionButtonDrawable) { mBitmap = ((BitmapDrawable) FloatingActionButtonDrawable).

getBitmap(); invalidate(); } public void init(int FloatingActionButtonColor) { setWillNotDraw(false); setLayerType(View.LAYER_TYPE_SOFTWARE, null); mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mButtonPaint.setColor(FloatingActionButtonColor); mButtonPaint.setStyle(Paint.Style.FILL); mButtonPaint.setShadowLayer(10.0f, 0.0f, 3.5f, Color.argb(100, 0, 0, 0)); mDrawablePaint = new Paint(Paint.ANTI_ALIAS_FLAG); invalidate(); } @Override protected void onDraw(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); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { setAlpha(1.0f); } else if (event.getAction() == MotionEvent.ACTION_DOWN) { setAlpha(0.6f); } return super.onTouchEvent(event); } public void hideFloatingActionButton() { if (!mHidden) { ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 1, 0); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 1, 0); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(scaleX, scaleY); animSetXY.setInterpolator(new AccelerateInterpolator()); animSetXY.setDuration(100); animSetXY.start(); mHidden = true; } } public void showFloatingActionButton() { if (mHidden) { ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 0, 1); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 0, 1); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(scaleX, scaleY); animSetXY.setInterpolator(new OvershootInterpolator()); animSetXY.setDuration(200); animSetXY.start(); mHidden = false; } } public boolean isHidden() { return mHidden; } static public class Builder { private FrameLayout.LayoutParams params; private final Activity activity; int gravity = Gravity.BOTTOM | Gravity.RIGHT; // default bottom right Drawable drawable; int color = Color.WHITE; int size = 0; float scale = 0; public Builder(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 developer.android.com (Supporting Multiple Screen Sizes) size = (int) (72 * scale + 0.5f); // default size is 72dp by 72dp params = new FrameLayout.LayoutParams(size, size); params.gravity = gravity; this.activity = context; } /** * Sets the gravity for the FAB */ public Builder withGravity(int gravity) { this.gravity = gravity; return this; } /** * Sets the margins for the FAB 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)); return this; } /** * Sets the FAB drawable */ public Builder withDrawable(final Drawable drawable) { this.drawable = drawable; return this; } /** * Sets the FAB color */ public Builder withButtonColor(final int color) { this.color = color; return this; } /** * Sets the FAB size in dp */ public Builder withButtonSize(int size) { size = (int) (size * scale + 0.5f); params = new FrameLayout.LayoutParams(size, size); return this; } public FloatingActionButton create() { final FloatingActionButton button = new FloatingActionButton(activity); button.setFloatingActionButtonColor(this.color); button.setFloatingActionButtonDrawable(this.drawable); params.gravity = this.gravity; ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); root.addView(button, params); return button; } } }

При создании кнопки в XML я обнаружил некоторые трудности с размещением представления нашей кнопки над другими представлениями (в частности, над навигационным ящиком).

Я решил реализовать кнопку программно и работать через шаблон Builder, который позволит размещать FAB над другими представлениями в действии при вызове.

.

создавать() .



Большой! Но как я могу добавить это в свое приложение?

Добавить плавающую кнопку действия очень просто:

FloatingActionButton fabButton = new FloatingActionButton.Builder(this) .

withDrawable(yourDrawable) .

withButtonColor(Color.WHITE) .

withGravity(Gravity.BOTTOM | Gravity.RIGHT) .

withMargins(0, 0, 16, 16) .

create();

Размер кнопки можно легко изменить, вызвав .

withButtonSize(целочисленный размер) .

По умолчанию — 72dp.

Заключение

Похоже, Google будет использовать этот шаблон во многих своих приложениях.

И пока нет новостей о том, добавит ли Google плавающую кнопку действия в библиотеку поддержки, поэтому пока смело используйте это решение.

Код на Github Gist Теги: #материальный дизайн #плавающая кнопка действия #android l #разработка Android

Вместе с данным постом часто просматривают: