td>
1454
|
+ final int count = mInitialEdgeTouched.length;
|
|
|
1455
|
+ for (int i = 0; i < count; i++) {
|
|
|
1456
|
+ if (isEdgeTouched(edges, i)) {
|
|
|
1457
|
+ return true;
|
|
|
1458
|
+ }
|
|
|
1459
|
+ }
|
|
|
1460
|
+ return false;
|
|
|
1461
|
+ }
|
|
|
1462
|
+
|
|
|
1463
|
+ /**
|
|
|
1464
|
+ * Check if any of the edges specified were initially touched by the pointer
|
|
|
1465
|
+ * with the specified ID. If there is no currently active gesture or if
|
|
|
1466
|
+ * there is no pointer with the given ID currently down this method will
|
|
|
1467
|
+ * return false.
|
|
|
1468
|
+ *
|
|
|
1469
|
+ * @param edges Edges to check for an initial edge touch. See
|
|
|
1470
|
+ * {@link #EDGE_LEFT}, {@link #EDGE_TOP}, {@link #EDGE_RIGHT},
|
|
|
1471
|
+ * {@link #EDGE_BOTTOM} and {@link #EDGE_ALL}
|
|
|
1472
|
+ * @return true if any of the edges specified were initially touched in the
|
|
|
1473
|
+ * current gesture
|
|
|
1474
|
+ */
|
|
|
1475
|
+ public boolean isEdgeTouched(int edges, int pointerId) {
|
|
|
1476
|
+ return isPointerDown(pointerId) && (mInitialEdgeTouched[pointerId] & edges) != 0;
|
|
|
1477
|
+ }
|
|
|
1478
|
+
|
|
|
1479
|
+ private void releaseViewForPointerUp() {
|
|
|
1480
|
+ mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
|
|
|
1481
|
+ final float xvel = clampMag(
|
|
|
1482
|
+ VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
|
|
|
1483
|
+ mMinVelocity, mMaxVelocity);
|
|
|
1484
|
+ final float yvel = clampMag(
|
|
|
1485
|
+ VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId),
|
|
|
1486
|
+ mMinVelocity, mMaxVelocity);
|
|
|
1487
|
+ dispatchViewReleased(xvel, yvel);
|
|
|
1488
|
+ }
|
|
|
1489
|
+
|
|
|
1490
|
+ private void dragTo(int left, int top, int dx, int dy) {
|
|
|
1491
|
+ int clampedX = left;
|
|
|
1492
|
+ int clampedY = top;
|
|
|
1493
|
+ final int oldLeft = mCapturedView.getLeft();
|
|
|
1494
|
+ final int oldTop = mCapturedView.getTop();
|
|
|
1495
|
+ if (dx != 0) {
|
|
|
1496
|
+ clampedX = mCallback.clampViewPositionHorizontal(mCapturedView, left, dx);
|
|
|
1497
|
+ mCapturedView.offsetLeftAndRight(clampedX - oldLeft);
|
|
|
1498
|
+ }
|
|
|
1499
|
+ if (dy != 0) {
|
|
|
1500
|
+ clampedY = mCallback.clampViewPositionVertical(mCapturedView, top, dy);
|
|
|
1501
|
+ mCapturedView.offsetTopAndBottom(clampedY - oldTop);
|
|
|
1502
|
+ }
|
|
|
1503
|
+
|
|
|
1504
|
+ if (dx != 0 || dy != 0) {
|
|
|
1505
|
+ final int clampedDx = clampedX - oldLeft;
|
|
|
1506
|
+ final int clampedDy = clampedY - oldTop;
|
|
|
1507
|
+ mCallback
|
|
|
1508
|
+ .onViewPositionChanged(mCapturedView, clampedX, clampedY, clampedDx, clampedDy);
|
|
|
1509
|
+ }
|
|
|
1510
|
+ }
|
|
|
1511
|
+
|
|
|
1512
|
+ /**
|
|
|
1513
|
+ * Determine if the currently captured view is under the given point in the
|
|
|
1514
|
+ * parent view's coordinate system. If there is no captured view this method
|
|
|
1515
|
+ * will return false.
|
|
|
1516
|
+ *
|
|
|
1517
|
+ * @param x X position to test in the parent's coordinate system
|
|
|
1518
|
+ * @param y Y position to test in the parent's coordinate system
|
|
|
1519
|
+ * @return true if the captured view is under the given point, false
|
|
|
1520
|
+ * otherwise
|
|
|
1521
|
+ */
|
|
|
1522
|
+ public boolean isCapturedViewUnder(int x, int y) {
|
|
|
1523
|
+ return isViewUnder(mCapturedView, x, y);
|
|
|
1524
|
+ }
|
|
|
1525
|
+
|
|
|
1526
|
+ /**
|
|
|
1527
|
+ * Determine if the supplied view is under the given point in the parent
|
|
|
1528
|
+ * view's coordinate system.
|
|
|
1529
|
+ *
|
|
|
1530
|
+ * @param view Child view of the parent to hit test
|
|
|
1531
|
+ * @param x X position to test in the parent's coordinate system
|
|
|
1532
|
+ * @param y Y position to test in the parent's coordinate system
|
|
|
1533
|
+ * @return true if the supplied view is under the given point, false
|
|
|
1534
|
+ * otherwise
|
|
|
1535
|
+ */
|
|
|
1536
|
+ public boolean isViewUnder(View view, int x, int y) {
|
|
|
1537
|
+ if (view == null) {
|
|
|
1538
|
+ return false;
|
|
|
1539
|
+ }
|
|
|
1540
|
+ return x >= view.getLeft() && x < view.getRight() && y >= view.getTop()
|
|
|
1541
|
+ && y < view.getBottom();
|
|
|
1542
|
+ }
|
|
|
1543
|
+
|
|
|
1544
|
+ /**
|
|
|
1545
|
+ * Find the topmost child under the given point within the parent view's
|
|
|
1546
|
+ * coordinate system. The child order is determined using
|
|
|
1547
|
+ * {@link me.imid.swipebacklayout.lib.ViewDragHelper.Callback#getOrderedChildIndex(int)}
|
|
|
1548
|
+ * .
|
|
|
1549
|
+ *
|
|
|
1550
|
+ * @param x X position to test in the parent's coordinate system
|
|
|
1551
|
+ * @param y Y position to test in the parent's coordinate system
|
|
|
1552
|
+ * @return The topmost child view under (x, y) or null if none found.
|
|
|
1553
|
+ */
|
|
|
1554
|
+ public View findTopChildUnder(int x, int y) {
|
|
|
1555
|
+ final int childCount = mParentView.getChildCount();
|
|
|
1556
|
+ for (int i = childCount - 1; i >= 0; i--) {
|
|
|
1557
|
+ final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i));
|
|
|
1558
|
+ if (x >= child.getLeft() && x < child.getRight() && y >= child.getTop()
|
|
|
1559
|
+ && y < child.getBottom()) {
|
|
|
1560
|
+ return child;
|
|
|
1561
|
+ }
|
|
|
1562
|
+ }
|
|
|
1563
|
+ return null;
|
|
|
1564
|
+ }
|
|
|
1565
|
+
|
|
|
1566
|
+ private int getEdgeTouched(int x, int y) {
|
|
|
1567
|
+ int result = 0;
|
|
|
1568
|
+
|
|
|
1569
|
+ if (x < mParentView.getLeft() + mEdgeSize)
|
|
|
1570
|
+ result = EDGE_LEFT;
|
|
|
1571
|
+ if (y < mParentView.getTop() + mEdgeSize)
|
|
|
1572
|
+ result = EDGE_TOP;
|
|
|
1573
|
+ if (x > mParentView.getRight() - mEdgeSize)
|
|
|
1574
|
+ result = EDGE_RIGHT;
|
|
|
1575
|
+ if (y > mParentView.getBottom() - mEdgeSize)
|
|
|
1576
|
+ result = EDGE_BOTTOM;
|
|
|
1577
|
+
|
|
|
1578
|
+ return result;
|
|
|
1579
|
+ }
|
|
|
1580
|
+}
|
|
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+<?xml version="1.0" encoding="utf-8"?>
|
|
|
2
|
+<com.android.views.swipebacklayout.SwipeBackLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
|
3
|
+ android:id="@+id/swipe"
|
|
|
4
|
+ android:layout_width="match_parent"
|
|
|
5
|
+ android:layout_height="match_parent" />
|
|
|
6
|
+
|
|
|
|
@@ -73,4 +73,18 @@
|
|
73
|
73
|
</attr>
|
|
74
|
74
|
</declare-styleable>
|
|
75
|
75
|
|
|
|
76
|
+ <declare-styleable name="SwipeBackLayout">
|
|
|
77
|
+ <attr name="edge_size" format="dimension"/>
|
|
|
78
|
+ <attr name="edge_flag">
|
|
|
79
|
+ <enum name="left" value="0" />
|
|
|
80
|
+ <enum name="right" value="1" />
|
|
|
81
|
+ <enum name="bottom" value="2" />
|
|
|
82
|
+ <enum name="all" value="3" />
|
|
|
83
|
+ </attr>
|
|
|
84
|
+ <attr name="shadow_left" format="reference"/>
|
|
|
85
|
+ <attr name="shadow_right" format="reference"/>
|
|
|
86
|
+ <attr name="shadow_bottom" format="reference"/>
|
|
|
87
|
+ </declare-styleable>
|
|
|
88
|
+
|
|
|
89
|
+ <attr name="SwipeBackLayoutStyle" format="reference"/>
|
|
76
|
90
|
</resources>
|
|
|
|
@@ -6,21 +6,12 @@
|
|
6
|
6
|
<item name="android:background">@color/line_bg</item>
|
|
7
|
7
|
<item name="android:layout_margin">2dp</item>
|
|
8
|
8
|
</style>
|
|
9
|
|
- <declare-styleable name="SwipeLayout">
|
|
10
|
|
- <attr name="drag_edge">
|
|
11
|
|
- <flag name="left" value="1" />
|
|
12
|
|
- <flag name="right" value="2" />
|
|
13
|
|
- <flag name="top" value="4" />
|
|
14
|
|
- <flag name="bottom" value="8" />
|
|
15
|
|
- </attr>
|
|
16
|
|
- <attr name="leftEdgeSwipeOffset" format="dimension" />
|
|
17
|
|
- <attr name="rightEdgeSwipeOffset" format="dimension" />
|
|
18
|
|
- <attr name="topEdgeSwipeOffset" format="dimension" />
|
|
19
|
|
- <attr name="bottomEdgeSwipeOffset" format="dimension" />
|
|
20
|
|
- <attr name="show_mode" format="enum">
|
|
21
|
|
- <enum name="lay_down" value="0" />
|
|
22
|
|
- <enum name="pull_out" value="1" />
|
|
23
|
|
- </attr>
|
|
24
|
|
- <attr name="clickToClose" format="boolean" />
|
|
25
|
|
- </declare-styleable>
|
|
|
9
|
+
|
|
|
10
|
+ <style name="SwipeBackLayout">
|
|
|
11
|
+ <item name="edge_size">50dip</item>
|
|
|
12
|
+ <item name="shadow_left">@drawable/shadow_left</item>
|
|
|
13
|
+ <item name="shadow_right">@drawable/shadow_right</item>
|
|
|
14
|
+ <item name="shadow_bottom">@drawable/shadow_bottom</item>
|
|
|
15
|
+ </style>
|
|
|
16
|
+
|
|
26
|
17
|
</resources>
|