Skip to content

Commit c53fe07

Browse files
committed
add support for recyclerView & Improve the interface
1 parent 5e8d6fb commit c53fe07

File tree

10 files changed

+205
-52
lines changed

10 files changed

+205
-52
lines changed

androidarcmenu/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ android {
2222
dependencies {
2323
compile fileTree(dir: 'libs', include: ['*.jar'])
2424
compile 'com.android.support:appcompat-v7:24.0.0'
25+
compile 'com.android.support:recyclerview-v7:24.0.0'
2526
compile 'com.jakewharton.timber:timber:4.3.1'
2627
}

androidarcmenu/src/main/java/com/hackplan/androidarcmenu/ArcMenu.java

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Activity;
44
import android.graphics.Rect;
55
import android.support.annotation.DrawableRes;
6+
import android.support.v7.widget.RecyclerView;
67
import android.view.MotionEvent;
78
import android.view.View;
89
import android.view.ViewGroup;
@@ -18,32 +19,35 @@
1819

1920
public class ArcMenu {
2021

21-
public interface OnClickBtnListener{
22-
void onClickArcMenu(View menuView, int viewId);
22+
public interface OnClickMenuListener {
23+
void onClickArcMenu(ArcMenu arcMenu, int clickedMenuId);
2324
}
2425

25-
private ArcMenuInterceptLayout arcLayout;
26-
private ArrayList<ArcButton.Builder> btnList;
27-
private boolean hideOnTouchUp;
26+
private Builder builder;
2827

29-
private ArcMenu(ArcMenuInterceptLayout arcLayout, ArrayList<ArcButton.Builder> btnList,
30-
OnClickBtnListener listener, boolean hideOnTouchUp) {
31-
this.arcLayout = arcLayout;
32-
this.btnList = btnList;
33-
this.hideOnTouchUp = hideOnTouchUp;
34-
arcLayout.setOnClickBtnListener(listener);
28+
private ArcMenu(Builder builder) {
29+
this.builder = builder;
3530
}
3631

3732
public void showOn(View view) {
3833
if (view == null) return;
3934
Rect rect = new Rect();
4035
view.getGlobalVisibleRect(rect);
41-
arcLayout.show(rect.centerX(), rect.centerY(), btnList, hideOnTouchUp);
36+
builder.arcMenuLayout.show(this, rect.centerX(),
37+
rect.centerY(),
38+
builder.btnList,
39+
builder.hideOnTouchUp);
4240
}
4341

44-
public static class Builder implements View.OnTouchListener, View.OnLongClickListener{
42+
public int getId() {
43+
return builder.id;
44+
}
45+
46+
public static class Builder{
47+
private int id = -1;
48+
private ArcMenu arcMenu;
4549
private ArrayList<ArcButton.Builder> btnList = new ArrayList<>();
46-
private OnClickBtnListener onClickBtnListener;
50+
private OnClickMenuListener onClickMenuListener;
4751
private Activity activity;
4852
private ArcMenuInterceptLayout arcMenuLayout;
4953
private HashSet<View> onTouchViews = new HashSet<>();
@@ -55,12 +59,20 @@ public Builder(Activity activity) {
5559
}
5660

5761
public ArcMenu build() {
62+
if (arcMenu != null) throw new RuntimeException("ArcMenu.Build already built");
5863
arcMenuLayout = attachToActivity(activity);
59-
return new ArcMenu(arcMenuLayout, btnList, onClickBtnListener, hideOnTouchUp);
64+
arcMenuLayout.setOnClickBtnListener(onClickMenuListener);
65+
arcMenu = new ArcMenu(this);
66+
return arcMenu;
67+
}
68+
69+
public Builder setId(int id){
70+
this.id = id;
71+
return this;
6072
}
6173

62-
public Builder setListener(OnClickBtnListener listener) {
63-
this.onClickBtnListener = listener;
74+
public Builder setListener(OnClickMenuListener listener) {
75+
this.onClickMenuListener = listener;
6476
return this;
6577
}
6678

@@ -76,13 +88,13 @@ public Builder addBtns(ArcButton.Builder... arcButtons) {
7688

7789
public Builder showOnTouch(View view) {
7890
onTouchViews.add(view);
79-
view.setOnTouchListener(this);
91+
view.setOnTouchListener(touchListener);
8092
return this;
8193
}
8294

8395
public Builder showOnLongClick(View view) {
84-
view.setOnTouchListener(this);
85-
view.setOnLongClickListener(this);
96+
view.setOnTouchListener(touchListener);
97+
view.setOnLongClickListener(longClickListener);
8698
return this;
8799
}
88100

@@ -91,27 +103,34 @@ public Builder hideOnTouchUp(boolean h) {
91103
return this;
92104
}
93105

94-
@Override
95-
public boolean onLongClick(View v) {
96-
arcMenuLayout.show(lastTouchX, lastTouchY, btnList, hideOnTouchUp);
97-
return true;
98-
}
106+
107+
private View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
108+
@Override
109+
public boolean onLongClick(View v) {
110+
arcMenuLayout.show(arcMenu, lastTouchX, lastTouchY, btnList, hideOnTouchUp);
111+
return true;
112+
}
113+
};
99114

100115
private int lastTouchX, lastTouchY;
101-
@Override
102-
public boolean onTouch(View v, MotionEvent event) {
103-
if (event.getAction() == MotionEvent.ACTION_DOWN){
104-
if (onTouchViews.contains(v)) {
105-
arcMenuLayout.show((int) event.getRawX(), (int) event.getRawY(),
106-
btnList, hideOnTouchUp);
107-
}else {
108-
//Used in onLongClick(View v)
109-
lastTouchX = (int) event.getRawX();
110-
lastTouchY = (int) event.getRawY();
116+
private View.OnTouchListener touchListener = new View.OnTouchListener() {
117+
@Override
118+
public boolean onTouch(View v, MotionEvent event) {
119+
if (event.getAction() == MotionEvent.ACTION_DOWN){
120+
if (onTouchViews.contains(v)) {
121+
arcMenuLayout.show(arcMenu,
122+
(int) event.getRawX(),
123+
(int) event.getRawY(),
124+
btnList, hideOnTouchUp);
125+
}else {
126+
//Used in onLongClick(View v)
127+
lastTouchX = (int) event.getRawX();
128+
lastTouchY = (int) event.getRawY();
129+
}
111130
}
131+
return false;
112132
}
113-
return false;
114-
}
133+
};
115134

116135
ArcMenuInterceptLayout attachToActivity(Activity activity) {
117136
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

androidarcmenu/src/main/java/com/hackplan/androidarcmenu/ArcMenuInterceptLayout.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import android.view.MotionEvent;
66
import android.widget.FrameLayout;
77

8-
import com.hackplan.androidarcmenu.ArcMenu.OnClickBtnListener;
8+
import com.hackplan.androidarcmenu.ArcMenu.OnClickMenuListener;
99

1010
import java.util.ArrayList;
1111

@@ -35,20 +35,20 @@ private void init() {
3535
childViewParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
3636
}
3737

38-
public void show(int x, int y, ArrayList<ArcButton.Builder> btnList, boolean hideOnTouchUp) {
38+
public void show(ArcMenu arcMenu, int x, int y, ArrayList<ArcButton.Builder> btnList, boolean hideOnTouchUp) {
3939
if (indexOfChild(arcMenuLayout) == -1) {
4040
addView(arcMenuLayout);
4141
}
4242
arcMenuLayout.removeAllViews();
4343
for (ArcButton.Builder builder : btnList) {
4444
arcMenuLayout.addView(builder.getButton(getContext()), childViewParams);
4545
}
46-
arcMenuLayout.show(x, y, hideOnTouchUp);
46+
arcMenuLayout.show(arcMenu, x, y, hideOnTouchUp);
4747

4848
}
4949

50-
public void setOnClickBtnListener(OnClickBtnListener onClickBtnListener) {
51-
arcMenuLayout.setOnClickBtnListener(onClickBtnListener);
50+
public void setOnClickBtnListener(OnClickMenuListener onClickMenuListener) {
51+
arcMenuLayout.setOnClickMenuListener(onClickMenuListener);
5252
}
5353

5454
@Override

androidarcmenu/src/main/java/com/hackplan/androidarcmenu/ArcMenuLayout.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import android.view.ViewGroup;
1717
import android.view.WindowManager;
1818

19-
import com.hackplan.androidarcmenu.ArcMenu.OnClickBtnListener;
19+
import com.hackplan.androidarcmenu.ArcMenu.OnClickMenuListener;
2020

2121
/**
2222
* Created by Dacer on 12/11/2016.
@@ -26,7 +26,8 @@ public class ArcMenuLayout extends ViewGroup {
2626
private Point touchPoint = new Point();
2727
private final Rect mScreenRect = new Rect();
2828
private Rect tempRect = new Rect();
29-
private OnClickBtnListener onClickBtnListener;
29+
private ArcMenu arcMenu;
30+
private OnClickMenuListener onClickMenuListener;
3031
private boolean show = false;
3132
private boolean hideOnTouchUp = true;
3233

@@ -49,8 +50,9 @@ public boolean isShow() {
4950
private float xFirst, yFirst, xEnd, yEnd;
5051
private int radius = (int)dpToPx(80f);
5152
private double radAlpha = Math.toRadians(90d);
52-
public void show(int x, int y, boolean hideOnTouchUp) {
53+
public void show(ArcMenu arcMenu, int x, int y, boolean hideOnTouchUp) {
5354
this.hideOnTouchUp = hideOnTouchUp;
55+
this.arcMenu = arcMenu;
5456
show = true;
5557
touchPoint.set(x, y);
5658
double radO = Math.PI - radAlpha/2 -
@@ -63,8 +65,8 @@ public void show(int x, int y, boolean hideOnTouchUp) {
6365
requestLayout();
6466
}
6567

66-
public void setOnClickBtnListener(OnClickBtnListener onClickBtnListener) {
67-
this.onClickBtnListener = onClickBtnListener;
68+
public void setOnClickMenuListener(OnClickMenuListener onClickMenuListener) {
69+
this.onClickMenuListener = onClickMenuListener;
6870
}
6971

7072
@Override
@@ -119,9 +121,9 @@ public boolean onTouchEvent(MotionEvent event) {
119121
if (lastFocusIndex != -1) {
120122
show = false;
121123
AnimatorUtils.openMenu(this, lastFocusIndex, animListener);
122-
if (onClickBtnListener != null) {
124+
if (onClickMenuListener != null) {
123125
View clickedView = getChildAt(lastFocusIndex);
124-
onClickBtnListener.onClickArcMenu(clickedView, (int)clickedView.getTag());
126+
onClickMenuListener.onClickArcMenu(arcMenu, (int)clickedView.getTag());
125127
}
126128
} else if (hideOnTouchUp) {
127129
AnimatorUtils.hideMenu(this, touchPoint);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
/**
3+
* Copyright (C) 2015 ogaclejapan
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package com.hackplan.androidarcmenu;
18+
19+
/**
20+
* Modified by Dacer.
21+
* from https://github.com/ogaclejapan/ArcLayout
22+
*/
23+
public class Utils {
24+
25+
26+
public static int x(int radius, float degrees) {
27+
return Math.round(Utils.computeCircleX(radius, degrees));
28+
}
29+
30+
public static int y(int radius, float degrees) {
31+
return Math.round(computeCircleY(radius, degrees));
32+
}
33+
34+
private static float computeCircleX(float r, float degrees) {
35+
return (float) (r * Math.cos(Math.toRadians(degrees)));
36+
}
37+
38+
private static float computeCircleY(float r, float degrees) {
39+
return (float) (r * Math.sin(Math.toRadians(degrees)));
40+
}
41+
42+
}

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies {
2323
compile fileTree(include: ['*.jar'], dir: 'libs')
2424
compile project(':androidarcmenu')
2525
compile 'com.android.support:appcompat-v7:24.0.0'
26+
compile 'com.android.support:recyclerview-v7:24.0.0'
2627
compile 'com.jakewharton.timber:timber:4.3.1'
2728
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
2829
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

app/src/main/java/com/hackplan/androidarcmenu/demo/MainActivity.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
import android.os.Bundle;
44
import android.support.v7.app.AppCompatActivity;
5+
import android.support.v7.widget.LinearLayoutManager;
6+
import android.support.v7.widget.RecyclerView;
57
import android.view.View;
68
import android.widget.Button;
79
import android.widget.Toast;
810

911
import com.hackplan.androidarcmenu.ArcButton;
1012
import com.hackplan.androidarcmenu.ArcMenu;
1113

12-
public class MainActivity extends AppCompatActivity implements ArcMenu.OnClickBtnListener, View.OnLongClickListener{
14+
public class MainActivity extends AppCompatActivity implements ArcMenu.OnClickMenuListener,
15+
View.OnLongClickListener{
1316
private ArcMenu arcMenu, arcMenu2;
17+
public static final int ARC_MENU_ID_1 = 1;
18+
public static final int ARC_MENU_ID_2 = 2;
1419

1520
@Override
1621
protected void onCreate(Bundle savedInstanceState) {
@@ -20,10 +25,12 @@ protected void onCreate(Bundle savedInstanceState) {
2025
final Button btn2 = (Button) findViewById(R.id.btn2);
2126
final Button btn3 = (Button) findViewById(R.id.btn3);
2227
final Button btn4 = (Button) findViewById(R.id.btn4);
28+
final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
2329

2430
Button menuBtn = new Button(this);
2531
menuBtn.setText("TEST");
2632
arcMenu = new ArcMenu.Builder(MainActivity.this)
33+
.setId(ARC_MENU_ID_1)
2734
.addBtn(R.drawable.a, 0)
2835
.addBtn(R.drawable.r, 1)
2936
.setListener(MainActivity.this)
@@ -32,6 +39,7 @@ protected void onCreate(Bundle savedInstanceState) {
3239
.build();
3340

3441
arcMenu2 = new ArcMenu.Builder(MainActivity.this)
42+
.setId(ARC_MENU_ID_2)
3543
.addBtn(R.drawable.w, 6)
3644
.addBtns(new ArcButton.Builder(menuBtn, 2))
3745
.setListener(MainActivity.this)
@@ -46,16 +54,24 @@ public void onClick(View v) {
4654
arcMenu.showOn(v);
4755
}
4856
});
57+
58+
59+
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
60+
mRecyclerView.setLayoutManager(mLayoutManager);
61+
MyAdapter mAdapter = new MyAdapter(new String[]{"Pomotodo", "hackplan", "http://one.hackplan.com/", "Dacer"}, this, this);
62+
mRecyclerView.setAdapter(mAdapter);
63+
4964
}
5065

5166
@Override
52-
public void onClickArcMenu(View menuView, int id) {
53-
Toast.makeText(this, String.format("Click #%s", id), Toast.LENGTH_SHORT).show();
67+
public void onClickArcMenu(ArcMenu arcMenu, int viewId) {
68+
Toast.makeText(this, String.format("Click #%s, arcMenu id: %s", viewId, arcMenu.getId()), Toast.LENGTH_SHORT).show();
5469
}
5570

5671
@Override
5772
public boolean onLongClick(View v) {
5873
arcMenu.showOn(v);
5974
return true;
6075
}
76+
6177
}

0 commit comments

Comments
 (0)