Skip to content

Commit 5e0c6b6

Browse files
authored
Merge pull request #28 from icechen1/master
Use rectangle shapes for highlight areas + other changes
2 parents 92eed86 + c53b709 commit 5e0c6b6

File tree

8 files changed

+290
-74
lines changed

8 files changed

+290
-74
lines changed

README.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ new MaterialIntroView.Builder(this)
1717
.enableFadeAnimation(true)
1818
.performClick(true)
1919
.setInfoText("Hi There! Click this card and see what happens.")
20+
.setShapeType(ShapeType.CIRCLE)
2021
.setTarget(view)
2122
.setUsageId("intro_card") //THIS SHOULD BE UNIQUE ID
2223
.show();
@@ -79,6 +80,18 @@ dependencies {
7980
.setInfoTextSize(30) //Change text size
8081
```
8182
```java
83+
.setShapeType(ShapeType.CIRCLE) //Change shape of focus area
84+
.setShapeType(ShapeType.RECTANGLE) //Change shape of focus area
85+
```
86+
```java
87+
.setCustomShape(Shape shape) //Use custom shape
88+
```
89+
```java
90+
// Allow this showcase overlay to only show up once. Prevents multiple screens from showing at the same time.
91+
// Useful if you wish to show a tour step in a code that gets called multiple times
92+
.setIdempotent(true)
93+
```
94+
```java
8295
.setUsageId("intro_fab_button") //Store intro view status whether it is learnt or not
8396
```
8497
```java
@@ -112,12 +125,25 @@ config.setFadeAnimationEnabled(true);
112125
.setConfiguration(config) //
113126
```
114127

115-
# Demos
128+
# Use Custom Shapes
129+
You can use your own highlight shapes if Circle and Rectangle do not work for you. See source for `Circle` and `Rect` for implementation example.
130+
```java
131+
public class MyShape extends Shape {
132+
// ... your implementation
133+
}
116134

117-
<img src="https://raw.githubusercontent.com/iammert/MaterialIntroView/master/art/art_drawer.png"/> <img src="https://raw.githubusercontent.com/iammert/MaterialIntroView/master/art/art_focus_all.png"/>
135+
//... in your app code
118136

119-
<img src="https://raw.githubusercontent.com/iammert/MaterialIntroView/master/art/art_focus_normal.png"/> <img src="https://raw.githubusercontent.com/iammert/MaterialIntroView/master/art/art_gravity_left.png"/>
137+
.setCustomShape(MyShape shape)
120138

139+
```
140+
141+
# Demos
142+
![Alt text](/art/art_drawer.png?raw=true)
143+
![Alt text](/art/art_focus_all.png?raw=true)
144+
![Alt text](/art/art_focus_normal.png?raw=true)
145+
![Alt text](/art/art_gravity_left.png?raw=true)
146+
![Alt text](/art/art_rectangle.png?raw=true)
121147
# TODO
122148

123149
* [ ] Sample app will be more detailed about using library.

art/art_rectangle.png

62.1 KB
Loading

materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,31 @@
44
import android.graphics.Paint;
55
import android.graphics.Point;
66

7-
import co.mobiwise.materialintro.utils.Constants;
87
import co.mobiwise.materialintro.target.Target;
98

109
/**
1110
* Created by mertsimsek on 25/01/16.
1211
*/
13-
public class Circle {
14-
15-
private Target target;
16-
17-
private Focus focus;
18-
19-
private FocusGravity focusGravity;
12+
public class Circle extends Shape {
2013

2114
private int radius;
2215

2316
private Point circlePoint;
2417

25-
private int padding;
26-
27-
public Circle(Target target) {
28-
this(target, Focus.MINIMUM);
29-
}
30-
31-
public Circle(Target target,Focus focus) {
32-
this(target, focus, FocusGravity.CENTER, Constants.DEFAULT_TARGET_PADDING);
33-
}
34-
3518
public Circle(Target target, Focus focus, FocusGravity focusGravity, int padding) {
36-
this.target = target;
37-
this.focus = focus;
38-
this.focusGravity = focusGravity;
39-
this.padding = padding;
19+
super(target, focus, focusGravity, padding);
4020
circlePoint = getFocusPoint();
4121
calculateRadius(padding);
4222
}
4323

24+
@Override
4425
public void draw(Canvas canvas, Paint eraser, int padding){
4526
calculateRadius(padding);
4627
circlePoint = getFocusPoint();
4728
canvas.drawCircle(circlePoint.x, circlePoint.y, radius, eraser);
4829
}
4930

50-
private Point getFocusPoint(){
51-
if(focusGravity == FocusGravity.LEFT){
52-
int xLeft = target.getRect().left + (target.getPoint().x - target.getRect().left) / 2;
53-
return new Point(xLeft, target.getPoint().y);
54-
}
55-
else if(focusGravity == FocusGravity.RIGHT){
56-
int xRight = target.getPoint().x + (target.getRect().right - target.getPoint().x) / 2;
57-
return new Point(xRight, target.getPoint().y);
58-
}
59-
else
60-
return target.getPoint();
61-
}
62-
31+
@Override
6332
public void reCalculateAll(){
6433
calculateRadius(padding);
6534
circlePoint = getFocusPoint();
@@ -81,12 +50,28 @@ else if(focus == Focus.ALL)
8150
radius = side + padding;
8251
}
8352

84-
public int getRadius(){
53+
private int getRadius(){
8554
return radius;
8655
}
8756

57+
@Override
8858
public Point getPoint(){
8959
return circlePoint;
9060
}
9161

62+
@Override
63+
public int getHeight() {
64+
return 2 * getRadius();
65+
}
66+
67+
@Override
68+
public boolean isTouchOnFocus(double x, double y) {
69+
int xV = getPoint().x;
70+
int yV = getPoint().y;
71+
72+
double dx = Math.pow(x - xV, 2);
73+
double dy = Math.pow(y - yV, 2);
74+
return (dx + dy) <= Math.pow(radius, 2);
75+
}
76+
9277
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package co.mobiwise.materialintro.shape;
2+
3+
import android.graphics.Canvas;
4+
import android.graphics.Paint;
5+
import android.graphics.Point;
6+
import android.graphics.RectF;
7+
8+
import co.mobiwise.materialintro.target.Target;
9+
10+
/**
11+
* Created by mertsimsek on 25/01/16.
12+
*/
13+
public class Rect extends Shape {
14+
15+
RectF adjustedRect;
16+
17+
public Rect(Target target) {
18+
super(target);
19+
calculateAdjustedRect();
20+
}
21+
22+
public Rect(Target target, Focus focus) {
23+
super(target, focus);
24+
calculateAdjustedRect();
25+
}
26+
27+
public Rect(Target target, Focus focus, FocusGravity focusGravity, int padding) {
28+
super(target, focus, focusGravity, padding);
29+
calculateAdjustedRect();
30+
}
31+
32+
@Override
33+
public void draw(Canvas canvas, Paint eraser, int padding) {
34+
canvas.drawRoundRect(adjustedRect, padding, padding, eraser);
35+
}
36+
37+
private void calculateAdjustedRect() {
38+
RectF rect = new RectF();
39+
rect.set(target.getRect());
40+
41+
rect.left -= padding;
42+
rect.top -= padding;
43+
rect.right += padding;
44+
rect.bottom += padding;
45+
46+
adjustedRect = rect;
47+
}
48+
49+
@Override
50+
public void reCalculateAll(){
51+
calculateAdjustedRect();
52+
}
53+
54+
@Override
55+
public Point getPoint(){
56+
return target.getPoint();
57+
}
58+
59+
@Override
60+
public int getHeight() {
61+
return (int) adjustedRect.height();
62+
}
63+
64+
@Override
65+
public boolean isTouchOnFocus(double x, double y) {
66+
return adjustedRect.contains((float) x, (float) y);
67+
}
68+
69+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package co.mobiwise.materialintro.shape;
2+
3+
import android.graphics.Canvas;
4+
import android.graphics.Paint;
5+
import android.graphics.Point;
6+
7+
import co.mobiwise.materialintro.target.Target;
8+
import co.mobiwise.materialintro.utils.Constants;
9+
10+
/**
11+
* Created by yuchen on 3/17/16.
12+
*/
13+
public abstract class Shape {
14+
15+
protected Target target;
16+
17+
protected Focus focus;
18+
19+
protected FocusGravity focusGravity;
20+
21+
protected int padding;
22+
23+
public Shape(Target target) {
24+
this(target, Focus.MINIMUM);
25+
}
26+
27+
public Shape(Target target,Focus focus) {
28+
this(target, focus, FocusGravity.CENTER, Constants.DEFAULT_TARGET_PADDING);
29+
}
30+
31+
public Shape(Target target, Focus focus, FocusGravity focusGravity, int padding) {
32+
this.target = target;
33+
this.focus = focus;
34+
this.focusGravity = focusGravity;
35+
this.padding = padding;
36+
}
37+
38+
public abstract void draw(Canvas canvas, Paint eraser, int padding);
39+
40+
protected Point getFocusPoint(){
41+
if(focusGravity == FocusGravity.LEFT){
42+
int xLeft = target.getRect().left + (target.getPoint().x - target.getRect().left) / 2;
43+
return new Point(xLeft, target.getPoint().y);
44+
}
45+
else if(focusGravity == FocusGravity.RIGHT){
46+
int xRight = target.getPoint().x + (target.getRect().right - target.getPoint().x) / 2;
47+
return new Point(xRight, target.getPoint().y);
48+
}
49+
else
50+
return target.getPoint();
51+
}
52+
53+
public abstract void reCalculateAll();
54+
55+
public abstract Point getPoint();
56+
57+
public abstract int getHeight();
58+
59+
/**
60+
* Determines if a click is on the shape
61+
* @param x x-axis location of click
62+
* @param y y-axis location of click
63+
* @return true if click is inside shape
64+
*/
65+
public abstract boolean isTouchOnFocus(double x, double t);
66+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package co.mobiwise.materialintro.shape;
2+
3+
/**
4+
* Created by yuchen on 3/17/16.
5+
*/
6+
public enum ShapeType {
7+
/**
8+
* Allows the target area to be highlighted by either a circle or rectangle
9+
*/
10+
CIRCLE, RECTANGLE
11+
}

0 commit comments

Comments
 (0)