diff --git a/library/build.gradle b/library/build.gradle index 2fcc6d4..83c61dd 100755 --- a/library/build.gradle +++ b/library/build.gradle @@ -25,6 +25,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:design:23.0.1' } apply from: '../gradle-mvn-push.gradle' diff --git a/library/src/main/java/com/github/clans/fab/FloatingActionButton.java b/library/src/main/java/com/github/clans/fab/FloatingActionButton.java index 0fec7af..5d81413 100755 --- a/library/src/main/java/com/github/clans/fab/FloatingActionButton.java +++ b/library/src/main/java/com/github/clans/fab/FloatingActionButton.java @@ -26,6 +26,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; +import android.support.design.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; @@ -38,6 +39,7 @@ import android.widget.ImageButton; import android.widget.TextView; +@CoordinatorLayout.DefaultBehavior(FloatingActionButtonBehavior.class) public class FloatingActionButton extends ImageButton { public static final int SIZE_NORMAL = 0; diff --git a/library/src/main/java/com/github/clans/fab/FloatingActionButtonBehavior.java b/library/src/main/java/com/github/clans/fab/FloatingActionButtonBehavior.java new file mode 100644 index 0000000..04f2dd1 --- /dev/null +++ b/library/src/main/java/com/github/clans/fab/FloatingActionButtonBehavior.java @@ -0,0 +1,54 @@ +package com.github.clans.fab; + +import android.content.Context; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; +import android.util.AttributeSet; +import android.view.View; + + +public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior { + + private int mToolbarHeight = -1; + + public FloatingActionButtonBehavior() { + super(); + } + + public FloatingActionButtonBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { + return dependency instanceof Snackbar.SnackbarLayout + || dependency instanceof AppBarLayout; + } + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) { + super.onDependentViewChanged(parent, fab, dependency); + + if (mToolbarHeight == -1) { + mToolbarHeight = Util.getToolbarHeight(fab.getContext()); + } + + float translationY; + if (dependency instanceof Snackbar.SnackbarLayout) { + translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); + } else { + CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab + .getLayoutParams(); + int famBottomMargin = lp.bottomMargin; + int height = fab.getHeight(); + int distanceToScroll = height + famBottomMargin; + float ratio = (float) dependency.getY() / (float) mToolbarHeight; + translationY = - distanceToScroll * ratio; + } + fab.setTranslationY(translationY); + + return true; + } + +} \ No newline at end of file diff --git a/library/src/main/java/com/github/clans/fab/FloatingActionMenu.java b/library/src/main/java/com/github/clans/fab/FloatingActionMenu.java index ce8cf43..ec22862 100755 --- a/library/src/main/java/com/github/clans/fab/FloatingActionMenu.java +++ b/library/src/main/java/com/github/clans/fab/FloatingActionMenu.java @@ -9,6 +9,7 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Handler; +import android.support.design.widget.CoordinatorLayout; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; @@ -27,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +@CoordinatorLayout.DefaultBehavior(FloatingActionMenuBehavior.class) public class FloatingActionMenu extends ViewGroup { private static final int ANIMATION_DURATION = 300; diff --git a/library/src/main/java/com/github/clans/fab/FloatingActionMenuBehavior.java b/library/src/main/java/com/github/clans/fab/FloatingActionMenuBehavior.java new file mode 100644 index 0000000..80915a1 --- /dev/null +++ b/library/src/main/java/com/github/clans/fab/FloatingActionMenuBehavior.java @@ -0,0 +1,60 @@ +package com.github.clans.fab; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; +import android.util.AttributeSet; +import android.view.View; + + +public class FloatingActionMenuBehavior extends CoordinatorLayout.Behavior { + + private int mToolbarHeight = -1; + + public FloatingActionMenuBehavior() { + super(); + } + + public FloatingActionMenuBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionMenu child, View dependency) { + return dependency instanceof Snackbar.SnackbarLayout + || dependency instanceof AppBarLayout; + } + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionMenu fam, View dependency) { + super.onDependentViewChanged(parent, fam, dependency); + + if (mToolbarHeight == -1) { + mToolbarHeight = Util.getToolbarHeight(fam.getContext()); + } + + float translationY; + if (dependency instanceof Snackbar.SnackbarLayout) { + translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); + } else { + CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fam + .getLayoutParams(); + int famBottomMargin = lp.bottomMargin; + int height; + if (!fam.isOpened()) { + height = fam.getChildAt(0).getHeight(); + } else { + height = fam.getHeight(); + } + int distanceToScroll = height + famBottomMargin; + float ratio = (float) dependency.getY() / (float) mToolbarHeight; + translationY = - distanceToScroll * ratio; + } + fam.setTranslationY(translationY); + + return true; + } + +} \ No newline at end of file diff --git a/library/src/main/java/com/github/clans/fab/Util.java b/library/src/main/java/com/github/clans/fab/Util.java index 909f4fb..36afbec 100755 --- a/library/src/main/java/com/github/clans/fab/Util.java +++ b/library/src/main/java/com/github/clans/fab/Util.java @@ -1,6 +1,7 @@ package com.github.clans.fab; import android.content.Context; +import android.content.res.TypedArray; import android.os.Build; final class Util { @@ -20,4 +21,13 @@ static boolean hasJellyBean() { static boolean hasLollipop() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } + + public static int getToolbarHeight(Context context) { + final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes( + new int[]{R.attr.actionBarSize}); + int toolbarHeight = (int) styledAttributes.getDimension(0, 0); + styledAttributes.recycle(); + + return toolbarHeight; + } } diff --git a/sample/build.gradle b/sample/build.gradle index cd068de..4a5faec 100755 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -30,5 +30,6 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android.support:recyclerview-v7:23.0.1' + compile 'com.android.support:design:23.0.1' compile project(':library') } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index a7e1991..5dc13df 100755 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -22,6 +22,10 @@ + + diff --git a/sample/src/main/java/com/github/clans/fab/sample/CoordinatorLayoutActivity.java b/sample/src/main/java/com/github/clans/fab/sample/CoordinatorLayoutActivity.java new file mode 100644 index 0000000..107bc5d --- /dev/null +++ b/sample/src/main/java/com/github/clans/fab/sample/CoordinatorLayoutActivity.java @@ -0,0 +1,43 @@ +package com.github.clans.fab.sample; + +import com.github.fab.sample.R; + +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.view.View; + +import java.util.Locale; + +public class CoordinatorLayoutActivity extends AppCompatActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.coordinatorlayout_activity); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + findViewById(R.id.fab).setOnClickListener(this); + findViewById(R.id.fab1).setOnClickListener(this); + findViewById(R.id.fab2).setOnClickListener(this); + findViewById(R.id.fab3).setOnClickListener(this); + + Locale[] availableLocales = Locale.getAvailableLocales(); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); + recyclerView.setHasFixedSize(true); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(new LanguageAdapter(availableLocales)); + } + + @Override + public void onClick(View v) { + Snackbar.make(v, R.string.lorem_ipsum, Snackbar.LENGTH_SHORT).show(); + } + +} diff --git a/sample/src/main/java/com/github/clans/fab/sample/LanguageAdapter.java b/sample/src/main/java/com/github/clans/fab/sample/LanguageAdapter.java new file mode 100644 index 0000000..36da3c8 --- /dev/null +++ b/sample/src/main/java/com/github/clans/fab/sample/LanguageAdapter.java @@ -0,0 +1,45 @@ +package com.github.clans.fab.sample; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.Locale; + +class LanguageAdapter extends RecyclerView.Adapter { + + private Locale[] mLocales; + + LanguageAdapter(Locale[] mLocales) { + this.mLocales = mLocales; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + TextView tv = (TextView) LayoutInflater.from(parent.getContext()) + .inflate(android.R.layout.simple_list_item_1, parent, false); + + return new ViewHolder(tv); + } + + @Override + public void onBindViewHolder(LanguageAdapter.ViewHolder holder, int position) { + holder.mTextView.setText(mLocales[position].getDisplayName()); + } + + @Override + public int getItemCount() { + return mLocales.length; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + + public TextView mTextView; + + public ViewHolder(TextView v) { + super(v); + mTextView = v; + } + } +} diff --git a/sample/src/main/java/com/github/clans/fab/sample/MainActivity.java b/sample/src/main/java/com/github/clans/fab/sample/MainActivity.java index 1994a4f..8646984 100755 --- a/sample/src/main/java/com/github/clans/fab/sample/MainActivity.java +++ b/sample/src/main/java/com/github/clans/fab/sample/MainActivity.java @@ -70,5 +70,12 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun mPreviousVisibleItem = firstVisibleItem; } }); + + findViewById(R.id.fab_edit).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, CoordinatorLayoutActivity.class)); + } + }); } } diff --git a/sample/src/main/java/com/github/clans/fab/sample/RecyclerViewActivity.java b/sample/src/main/java/com/github/clans/fab/sample/RecyclerViewActivity.java index b11c92d..cf33b55 100644 --- a/sample/src/main/java/com/github/clans/fab/sample/RecyclerViewActivity.java +++ b/sample/src/main/java/com/github/clans/fab/sample/RecyclerViewActivity.java @@ -115,43 +115,6 @@ public void run() { } } - private class LanguageAdapter extends RecyclerView.Adapter { - - private Locale[] mLocales; - - private LanguageAdapter(Locale[] mLocales) { - this.mLocales = mLocales; - } - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - TextView tv = (TextView) LayoutInflater.from(parent.getContext()) - .inflate(android.R.layout.simple_list_item_1, parent, false); - - return new ViewHolder(tv); - } - - @Override - public void onBindViewHolder(ViewHolder holder, int position) { - holder.mTextView.setText(mLocales[position].getDisplayName()); - } - - @Override - public int getItemCount() { - return mLocales.length; - } - } - - private static class ViewHolder extends RecyclerView.ViewHolder { - - public TextView mTextView; - - public ViewHolder(TextView v) { - super(v); - mTextView = v; - } - } - private enum ProgressType { INDETERMINATE, PROGRESS_POSITIVE, PROGRESS_NEGATIVE, HIDDEN, PROGRESS_NO_ANIMATION, PROGRESS_NO_BACKGROUND } diff --git a/sample/src/main/res/layout/coordinatorlayout_activity.xml b/sample/src/main/res/layout/coordinatorlayout_activity.xml new file mode 100644 index 0000000..8a899b5 --- /dev/null +++ b/sample/src/main/res/layout/coordinatorlayout_activity.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/src/main/res/layout/main_activity.xml b/sample/src/main/res/layout/main_activity.xml index 2d3ff19..65ba4a1 100755 --- a/sample/src/main/res/layout/main_activity.xml +++ b/sample/src/main/res/layout/main_activity.xml @@ -20,4 +20,14 @@ android:src="@drawable/ic_menu" app:fab_elevationCompat="4dp"/> + + diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 6de04e2..1d8a258 100755 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ Floating Action Button Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur magna tortor, semper eu feugiat eu, vehicula vitae lacus. RecyclerView FAB example + CoordinatorLayout example Floating Action Menu Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed ultricies risus. Integer nisi orci, lacinia sit amet mi in, mollis scelerisque purus. Nunc risus ligula, maximus eu orci a, facilisis dictum velit. Proin nec laoreet magna. Nulla ut sagittis lorem. Morbi id enim fermentum, semper diam et, tempus leo. Aliquam vel congue orci. Suspendisse potenti. Curabitur finibus diam augue, vel bibendum sapien ultrices non. diff --git a/sample/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml index 248802a..1c8f151 100755 --- a/sample/src/main/res/values/styles.xml +++ b/sample/src/main/res/values/styles.xml @@ -11,6 +11,13 @@ + + +