Skip to content
This repository was archived by the owner on Oct 23, 2020. It is now read-only.

Commit f0c6478

Browse files
author
Bao-Long Nguyen-Trong
committed
Add support for CoordinatorLayout
+ sample ie add default behavior for both floating action button and menu
1 parent b0a15b8 commit f0c6478

File tree

16 files changed

+314
-37
lines changed

16 files changed

+314
-37
lines changed

library/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ android {
2525

2626
dependencies {
2727
compile fileTree(dir: 'libs', include: ['*.jar'])
28+
compile 'com.android.support:design:23.0.1'
2829
}
2930

3031
apply from: '../gradle-mvn-push.gradle'

library/src/main/java/com/github/clans/fab/FloatingActionButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.os.Parcel;
2727
import android.os.Parcelable;
2828
import android.os.SystemClock;
29+
import android.support.design.widget.CoordinatorLayout;
2930
import android.util.AttributeSet;
3031
import android.view.GestureDetector;
3132
import android.view.MotionEvent;
@@ -38,6 +39,7 @@
3839
import android.widget.ImageButton;
3940
import android.widget.TextView;
4041

42+
@CoordinatorLayout.DefaultBehavior(FloatingActionButtonBehavior.class)
4143
public class FloatingActionButton extends ImageButton {
4244

4345
public static final int SIZE_NORMAL = 0;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.github.clans.fab;
2+
3+
import android.content.Context;
4+
import android.support.design.widget.AppBarLayout;
5+
import android.support.design.widget.CoordinatorLayout;
6+
import android.support.design.widget.Snackbar;
7+
import android.util.AttributeSet;
8+
import android.view.View;
9+
10+
11+
public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
12+
13+
private int mToolbarHeight = -1;
14+
15+
public FloatingActionButtonBehavior() {
16+
super();
17+
}
18+
19+
public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {
20+
super(context, attrs);
21+
}
22+
23+
@Override
24+
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
25+
return dependency instanceof Snackbar.SnackbarLayout
26+
|| dependency instanceof AppBarLayout;
27+
}
28+
29+
@Override
30+
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
31+
super.onDependentViewChanged(parent, fab, dependency);
32+
33+
if (mToolbarHeight == -1) {
34+
mToolbarHeight = Util.getToolbarHeight(fab.getContext());
35+
}
36+
37+
float translationY;
38+
if (dependency instanceof Snackbar.SnackbarLayout) {
39+
translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
40+
} else {
41+
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab
42+
.getLayoutParams();
43+
int famBottomMargin = lp.bottomMargin;
44+
int height = fab.getHeight();
45+
int distanceToScroll = height + famBottomMargin;
46+
float ratio = (float) dependency.getY() / (float) mToolbarHeight;
47+
translationY = - distanceToScroll * ratio;
48+
}
49+
fab.setTranslationY(translationY);
50+
51+
return true;
52+
}
53+
54+
}

library/src/main/java/com/github/clans/fab/FloatingActionMenu.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.graphics.Color;
1010
import android.graphics.drawable.Drawable;
1111
import android.os.Handler;
12+
import android.support.design.widget.CoordinatorLayout;
1213
import android.text.TextUtils;
1314
import android.util.AttributeSet;
1415
import android.util.TypedValue;
@@ -27,6 +28,7 @@
2728
import java.util.ArrayList;
2829
import java.util.List;
2930

31+
@CoordinatorLayout.DefaultBehavior(FloatingActionMenuBehavior.class)
3032
public class FloatingActionMenu extends ViewGroup {
3133

3234
private static final int ANIMATION_DURATION = 300;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.github.clans.fab;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.support.design.widget.AppBarLayout;
6+
import android.support.design.widget.CoordinatorLayout;
7+
import android.support.design.widget.Snackbar;
8+
import android.util.AttributeSet;
9+
import android.view.View;
10+
11+
12+
public class FloatingActionMenuBehavior extends CoordinatorLayout.Behavior<FloatingActionMenu> {
13+
14+
private int mToolbarHeight = -1;
15+
16+
public FloatingActionMenuBehavior() {
17+
super();
18+
}
19+
20+
public FloatingActionMenuBehavior(Context context, AttributeSet attrs) {
21+
super(context, attrs);
22+
}
23+
24+
@Override
25+
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionMenu child, View dependency) {
26+
return dependency instanceof Snackbar.SnackbarLayout
27+
|| dependency instanceof AppBarLayout;
28+
}
29+
30+
@Override
31+
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionMenu fam, View dependency) {
32+
super.onDependentViewChanged(parent, fam, dependency);
33+
34+
if (mToolbarHeight == -1) {
35+
mToolbarHeight = Util.getToolbarHeight(fam.getContext());
36+
}
37+
38+
float translationY;
39+
if (dependency instanceof Snackbar.SnackbarLayout) {
40+
translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
41+
} else {
42+
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fam
43+
.getLayoutParams();
44+
int famBottomMargin = lp.bottomMargin;
45+
int height;
46+
if (!fam.isOpened()) {
47+
height = fam.getChildAt(0).getHeight();
48+
} else {
49+
height = fam.getHeight();
50+
}
51+
int distanceToScroll = height + famBottomMargin;
52+
float ratio = (float) dependency.getY() / (float) mToolbarHeight;
53+
translationY = - distanceToScroll * ratio;
54+
}
55+
fam.setTranslationY(translationY);
56+
57+
return true;
58+
}
59+
60+
}

library/src/main/java/com/github/clans/fab/Util.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.clans.fab;
22

33
import android.content.Context;
4+
import android.content.res.TypedArray;
45
import android.os.Build;
56

67
final class Util {
@@ -20,4 +21,13 @@ static boolean hasJellyBean() {
2021
static boolean hasLollipop() {
2122
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
2223
}
24+
25+
public static int getToolbarHeight(Context context) {
26+
final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(
27+
new int[]{R.attr.actionBarSize});
28+
int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
29+
styledAttributes.recycle();
30+
31+
return toolbarHeight;
32+
}
2333
}

sample/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ dependencies {
3030
compile fileTree(dir: 'libs', include: ['*.jar'])
3131
compile 'com.android.support:appcompat-v7:23.0.1'
3232
compile 'com.android.support:recyclerview-v7:23.0.1'
33+
compile 'com.android.support:design:23.0.1'
3334
compile project(':library')
3435
}

sample/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
<activity
2323
android:label="@string/recyclerview_fab_example"
2424
android:name="com.github.clans.fab.sample.RecyclerViewActivity" />
25+
<activity android:name="com.github.clans.fab.sample.CoordinatorLayoutActivity"
26+
android:label="@string/coordinatorlayout_example"
27+
android:theme="@style/AppTheme.NoActionBar" >
28+
</activity>
2529
</application>
2630

2731
</manifest>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.github.clans.fab.sample;
2+
3+
import com.github.fab.sample.R;
4+
5+
import android.os.Bundle;
6+
import android.support.design.widget.Snackbar;
7+
import android.support.v7.app.AppCompatActivity;
8+
import android.support.v7.widget.LinearLayoutManager;
9+
import android.support.v7.widget.RecyclerView;
10+
import android.support.v7.widget.Toolbar;
11+
import android.view.View;
12+
13+
import java.util.Locale;
14+
15+
public class CoordinatorLayoutActivity extends AppCompatActivity implements View.OnClickListener {
16+
17+
@Override
18+
protected void onCreate(Bundle savedInstanceState) {
19+
super.onCreate(savedInstanceState);
20+
setContentView(R.layout.coordinatorlayout_activity);
21+
22+
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
23+
setSupportActionBar(toolbar);
24+
25+
findViewById(R.id.fab).setOnClickListener(this);
26+
findViewById(R.id.fab1).setOnClickListener(this);
27+
findViewById(R.id.fab2).setOnClickListener(this);
28+
findViewById(R.id.fab3).setOnClickListener(this);
29+
30+
Locale[] availableLocales = Locale.getAvailableLocales();
31+
32+
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
33+
recyclerView.setHasFixedSize(true);
34+
recyclerView.setLayoutManager(new LinearLayoutManager(this));
35+
recyclerView.setAdapter(new LanguageAdapter(availableLocales));
36+
}
37+
38+
@Override
39+
public void onClick(View v) {
40+
Snackbar.make(v, R.string.lorem_ipsum, Snackbar.LENGTH_SHORT).show();
41+
}
42+
43+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.github.clans.fab.sample;
2+
3+
import android.support.v7.widget.RecyclerView;
4+
import android.view.LayoutInflater;
5+
import android.view.ViewGroup;
6+
import android.widget.TextView;
7+
8+
import java.util.Locale;
9+
10+
class LanguageAdapter extends RecyclerView.Adapter<LanguageAdapter.ViewHolder> {
11+
12+
private Locale[] mLocales;
13+
14+
LanguageAdapter(Locale[] mLocales) {
15+
this.mLocales = mLocales;
16+
}
17+
18+
@Override
19+
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
20+
TextView tv = (TextView) LayoutInflater.from(parent.getContext())
21+
.inflate(android.R.layout.simple_list_item_1, parent, false);
22+
23+
return new ViewHolder(tv);
24+
}
25+
26+
@Override
27+
public void onBindViewHolder(LanguageAdapter.ViewHolder holder, int position) {
28+
holder.mTextView.setText(mLocales[position].getDisplayName());
29+
}
30+
31+
@Override
32+
public int getItemCount() {
33+
return mLocales.length;
34+
}
35+
36+
static class ViewHolder extends RecyclerView.ViewHolder {
37+
38+
public TextView mTextView;
39+
40+
public ViewHolder(TextView v) {
41+
super(v);
42+
mTextView = v;
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)