From 91b60f45e60c8b43768ffc8798df15e14dfaa609 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:13:50 +0800 Subject: [PATCH 1/8] update readme for android arsenal supporT --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4bab5f7..5bc54c4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-MaterialArcMenu-green.svg?style=true)](https://android-arsenal.com/details/1/2936) + Material Arc Menu ================= @@ -107,20 +109,21 @@ Currently the library offers the following customization options: - `menu_ripple_color`: Controls the ripple color of the FAB Menu. Defaults to `colorControlHighlight` - `menu_radius`: Controls the radius of the arc - `menu_open`: Controls which side of the FAB menu is the arc menu displayed on. Currently supports one of `arc_left` or `arc_right` + - `menu_animation_time`: Controls the animation time to transition the menu from close to open state and vice versa License ------- Copyright 2015 Saurabh Arora - + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. From ae1a4d3bbb30fb9905d8066a6e6e1fb893995508 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:22:22 +0800 Subject: [PATCH 2/8] allow user to configure animation time for menu to open and closE --- .../src/main/java/com/sa90/materialarcmenu/ArcMenu.java | 9 +++++++++ library/src/main/res/values/attr.xml | 1 + 2 files changed, 10 insertions(+) diff --git a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java index 4c5c52d..5aee84a 100644 --- a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java +++ b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java @@ -25,11 +25,13 @@ public class ArcMenu extends ViewGroup { private static final double POSITIVE_QUADRANT = 90; private static final double NEGATIVE_QUADRANT = -90; private static final double ANGLE_FOR_ONE_SUB_MENU = 0; + private static final int ANIMATION_TIME = 300; //This time is in milliseconds FloatingActionButton fabMenu; Drawable mDrawable; ColorStateList mColorStateList; int mRippleColor; + long mAnimationTime; float mCurrentRadius, mFinalRadius; boolean mIsOpened = false; double mQuadrantAngle; @@ -54,6 +56,7 @@ private void init(TypedArray attr) { mColorStateList = attr.getColorStateList(R.styleable.ArcMenu_menu_color); mFinalRadius = attr.getDimension(R.styleable.ArcMenu_menu_radius, resources.getDimension(R.dimen.default_radius)); mMenuSideEnum = MenuSideEnum.fromId(attr.getInt(R.styleable.ArcMenu_menu_open, 0)); + mAnimationTime = attr.getInteger(R.styleable.ArcMenu_menu_animation_time, ANIMATION_TIME); mCurrentRadius = 0; if(mDrawable == null) { @@ -238,6 +241,7 @@ public void onClick(View v) { private void beginOpenAnimation() { ValueAnimator openMenuAnimator = ValueAnimator.ofFloat(0, mFinalRadius); + openMenuAnimator.setDuration(mAnimationTime); openMenuAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { @@ -273,6 +277,7 @@ public void onAnimationRepeat(Animator animation) { private void beginCloseAnimation() { ValueAnimator closeMenuAnimator = ValueAnimator.ofFloat(mFinalRadius, 0); + closeMenuAnimator.setDuration(mAnimationTime); closeMenuAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { @@ -318,4 +323,8 @@ public void toggleMenu() { public boolean isMenuOpened() { return mIsOpened; } + + public void setAnimationTime(long animationTime) { + mAnimationTime = animationTime; + } } diff --git a/library/src/main/res/values/attr.xml b/library/src/main/res/values/attr.xml index 3bf6507..e1b61e6 100644 --- a/library/src/main/res/values/attr.xml +++ b/library/src/main/res/values/attr.xml @@ -9,5 +9,6 @@ + \ No newline at end of file From 1166a86f0de11ed2e338cf364c8a28f710cea77c Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:26:36 +0800 Subject: [PATCH 3/8] state change listener to be notified of menu opened and closing events --- .../main/java/com/sa90/materialarcmenu/ArcMenu.java | 10 +++++++++- .../com/sa90/materialarcmenu/StateChangeListener.java | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 library/src/main/java/com/sa90/materialarcmenu/StateChangeListener.java diff --git a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java index 5aee84a..89057ad 100644 --- a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java +++ b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java @@ -37,6 +37,7 @@ public class ArcMenu extends ViewGroup { double mQuadrantAngle; MenuSideEnum mMenuSideEnum; int cx, cy; //Represents the center points of the circle whose arc we are considering + private StateChangeListener mStateChangeListener; public ArcMenu(Context context) { super(context); @@ -258,7 +259,8 @@ public void onAnimationStart(Animator animation) { @Override public void onAnimationEnd(Animator animation) { - + if(mStateChangeListener!=null) + mStateChangeListener.onMenuOpened(); } @Override @@ -295,6 +297,8 @@ public void onAnimationStart(Animator animation) { @Override public void onAnimationEnd(Animator animation) { toggleVisibilityOfAllChildViews(mIsOpened); + if(mStateChangeListener!=null) + mStateChangeListener.onMenuClosed(); } @Override @@ -327,4 +331,8 @@ public boolean isMenuOpened() { public void setAnimationTime(long animationTime) { mAnimationTime = animationTime; } + + public void setmStateChangeListener(StateChangeListener stateChangeListener) { + this.mStateChangeListener = stateChangeListener; + } } diff --git a/library/src/main/java/com/sa90/materialarcmenu/StateChangeListener.java b/library/src/main/java/com/sa90/materialarcmenu/StateChangeListener.java new file mode 100644 index 0000000..10e962f --- /dev/null +++ b/library/src/main/java/com/sa90/materialarcmenu/StateChangeListener.java @@ -0,0 +1,9 @@ +package com.sa90.materialarcmenu; + +/** + * Created by Saurabh on 25/12/15. + */ +public interface StateChangeListener { + void onMenuOpened(); + void onMenuClosed(); +} From edfbcc138d2bea05ba84a1697abc55d22f94816e Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:30:52 +0800 Subject: [PATCH 4/8] bump version to v1.1.0 --- README.md | 4 ++-- library/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5bc54c4..53f0cfa 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Usage Add a dependency to your `build.gradle`: dependencies { - compile 'com.sa90.materialarcmenu:library:1.0.0' + compile 'com.sa90.materialarcmenu:library:1.1.0' } and include the `com.sa90.materialarcmenu.ArcMenu` as a viewgroup (with the sub-menu's as child) in your layout. @@ -109,7 +109,7 @@ Currently the library offers the following customization options: - `menu_ripple_color`: Controls the ripple color of the FAB Menu. Defaults to `colorControlHighlight` - `menu_radius`: Controls the radius of the arc - `menu_open`: Controls which side of the FAB menu is the arc menu displayed on. Currently supports one of `arc_left` or `arc_right` - - `menu_animation_time`: Controls the animation time to transition the menu from close to open state and vice versa + - `menu_animation_time`: Controls the animation time to transition the menu from close to open state and vice versa. The time is represented in milli-seconds License ------- diff --git a/library/build.gradle b/library/build.gradle index b107155..742e8aa 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion 15 targetSdkVersion 23 versionCode 1 - versionName "1.0" + versionName "1.1.0" } buildTypes { release { @@ -32,7 +32,7 @@ ext { artifact = 'library' libraryDescription = 'An android custom view which allows you to have a arc style-menu on your pages' - libraryVersion = '1.0.0' + libraryVersion = '1.1.0' developerId = 'saurabharora90' developerName = 'Saurabh Arora' From b126de19f7af8b8cbbde97c4769f573b4ab5f0f9 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:38:20 +0800 Subject: [PATCH 5/8] update sample to show usage of StateChangedListener --- .../java/com/sa90/materialarcmenu/ArcMenu.java | 2 +- samples/build.gradle | 3 ++- .../main/java/com/sa90/arcdemo/MainActivity.java | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java index 89057ad..43be1c8 100644 --- a/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java +++ b/library/src/main/java/com/sa90/materialarcmenu/ArcMenu.java @@ -332,7 +332,7 @@ public void setAnimationTime(long animationTime) { mAnimationTime = animationTime; } - public void setmStateChangeListener(StateChangeListener stateChangeListener) { + public void setStateChangeListener(StateChangeListener stateChangeListener) { this.mStateChangeListener = stateChangeListener; } } diff --git a/samples/build.gradle b/samples/build.gradle index c2bec00..2e799a4 100644 --- a/samples/build.gradle +++ b/samples/build.gradle @@ -21,5 +21,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.sa90.materialarcmenu:library:1.0.0' + //compile 'com.sa90.materialarcmenu:library:1.0.0' + compile project(":library") } diff --git a/samples/src/main/java/com/sa90/arcdemo/MainActivity.java b/samples/src/main/java/com/sa90/arcdemo/MainActivity.java index 269f963..3c5b39e 100644 --- a/samples/src/main/java/com/sa90/arcdemo/MainActivity.java +++ b/samples/src/main/java/com/sa90/arcdemo/MainActivity.java @@ -2,11 +2,13 @@ import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import com.sa90.materialarcmenu.ArcMenu; +import com.sa90.materialarcmenu.StateChangeListener; public class MainActivity extends AppCompatActivity { @@ -21,6 +23,19 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); arcMenu = (ArcMenu) findViewById(R.id.arcMenu); + arcMenu.setAnimationTime(600); + + arcMenu.setStateChangeListener(new StateChangeListener() { + @Override + public void onMenuOpened() { + Snackbar.make(arcMenu, "Menu Opened", Snackbar.LENGTH_SHORT).show(); + } + + @Override + public void onMenuClosed() { + Snackbar.make(arcMenu, "Menu Closed", Snackbar.LENGTH_SHORT).show(); + } + }); findViewById(R.id.fab1).setOnClickListener(subMenuClickListener); findViewById(R.id.tvNext).setOnClickListener(mNextClickListener); From fcbe48ce54a4b9839120cfd1da6522ce5c7b3f8d Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 25 Dec 2015 17:56:16 +0800 Subject: [PATCH 6/8] animation time demo --- samples/src/main/AndroidManifest.xml | 4 + .../sa90/arcdemo/AnimationTimeActivity.java | 56 ++++++++++++ .../java/com/sa90/arcdemo/MainActivity.java | 11 ++- .../res/layout/activity_animation_time.xml | 85 +++++++++++++++++++ samples/src/main/res/layout/activity_main.xml | 52 ++++++++---- samples/src/main/res/values/strings.xml | 1 + 6 files changed, 190 insertions(+), 19 deletions(-) create mode 100644 samples/src/main/java/com/sa90/arcdemo/AnimationTimeActivity.java create mode 100644 samples/src/main/res/layout/activity_animation_time.xml diff --git a/samples/src/main/AndroidManifest.xml b/samples/src/main/AndroidManifest.xml index 6bbcfe2..f6d35ec 100644 --- a/samples/src/main/AndroidManifest.xml +++ b/samples/src/main/AndroidManifest.xml @@ -21,6 +21,10 @@ + diff --git a/samples/src/main/java/com/sa90/arcdemo/AnimationTimeActivity.java b/samples/src/main/java/com/sa90/arcdemo/AnimationTimeActivity.java new file mode 100644 index 0000000..cbe2745 --- /dev/null +++ b/samples/src/main/java/com/sa90/arcdemo/AnimationTimeActivity.java @@ -0,0 +1,56 @@ +package com.sa90.arcdemo; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.sa90.materialarcmenu.ArcMenu; + +public class AnimationTimeActivity extends AppCompatActivity { + + ArcMenu arcMenu; + Button btnSet; + EditText etAnimationTime; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_animation_time); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + arcMenu = (ArcMenu) findViewById(R.id.arcMenu); + btnSet = (Button) findViewById(R.id.btnSet); + etAnimationTime = (EditText) findViewById(R.id.etAnimationTime); + + btnSet.setOnClickListener(mSetClickListener); + } + + private View.OnClickListener mSetClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + String time = etAnimationTime.getText().toString(); + if(time.isEmpty() || time.length() == 0) + return; + try { + arcMenu.setAnimationTime(Long.parseLong(time)); + } + catch (NumberFormatException e) { + Toast.makeText(AnimationTimeActivity.this, "Keyed in value is not a number", Toast.LENGTH_SHORT).show(); + } + } + }; + + @Override + public void onBackPressed() { + if(arcMenu.isMenuOpened()) + arcMenu.toggleMenu(); + else + super.onBackPressed(); + } + +} diff --git a/samples/src/main/java/com/sa90/arcdemo/MainActivity.java b/samples/src/main/java/com/sa90/arcdemo/MainActivity.java index 3c5b39e..fa41d1b 100644 --- a/samples/src/main/java/com/sa90/arcdemo/MainActivity.java +++ b/samples/src/main/java/com/sa90/arcdemo/MainActivity.java @@ -23,7 +23,7 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); arcMenu = (ArcMenu) findViewById(R.id.arcMenu); - arcMenu.setAnimationTime(600); + //arcMenu.setAnimationTime(600); arcMenu.setStateChangeListener(new StateChangeListener() { @Override @@ -39,6 +39,7 @@ public void onMenuClosed() { findViewById(R.id.fab1).setOnClickListener(subMenuClickListener); findViewById(R.id.tvNext).setOnClickListener(mNextClickListener); + findViewById(R.id.tvAnimationDemo).setOnClickListener(mAnimationTimeDemoClickListener); } private View.OnClickListener subMenuClickListener = new View.OnClickListener() { @@ -55,4 +56,12 @@ public void onClick(View v) { startActivity(intent); } }; + + private View.OnClickListener mAnimationTimeDemoClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this, AnimationTimeActivity.class); + startActivity(intent); + } + }; } diff --git a/samples/src/main/res/layout/activity_animation_time.xml b/samples/src/main/res/layout/activity_animation_time.xml new file mode 100644 index 0000000..b29369f --- /dev/null +++ b/samples/src/main/res/layout/activity_animation_time.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + +