diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/AngelConstants.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/AngelConstants.java
new file mode 100644
index 0000000..14f4e6c
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/AngelConstants.java
@@ -0,0 +1,37 @@
+package com.kongqw.rockerlibrary.view;
+
+public class AngelConstants {
+ // 角度
+ public static final double ANGLE_0 = 0;
+ public static final double ANGLE_360 = 360;
+
+ // 360°水平方向平分2份的边缘角度
+ public static final double ANGLE_HORIZONTAL_2D_OF_0P = 90;
+ public static final double ANGLE_HORIZONTAL_2D_OF_1P = 270;
+
+ // 360°垂直方向平分2份的边缘角度
+ public static final double ANGLE_VERTICAL_2D_OF_0P = 0;
+ public static final double ANGLE_VERTICAL_2D_OF_1P = 180;
+
+ // 360°平分4份的边缘角度
+ public static final double ANGLE_4D_OF_0P = 0;
+ public static final double ANGLE_4D_OF_1P = 90;
+ public static final double ANGLE_4D_OF_2P = 180;
+ public static final double ANGLE_4D_OF_3P = 270;
+
+ // 360°平分4份的边缘角度(旋转45度)
+ public static final double ANGLE_ROTATE45_4D_OF_0P = 45;
+ public static final double ANGLE_ROTATE45_4D_OF_1P = 135;
+ public static final double ANGLE_ROTATE45_4D_OF_2P = 225;
+ public static final double ANGLE_ROTATE45_4D_OF_3P = 315;
+
+ // 360°平分8份的边缘角度
+ public static final double ANGLE_8D_OF_0P = 22.5;
+ public static final double ANGLE_8D_OF_1P = 67.5;
+ public static final double ANGLE_8D_OF_2P = 112.5;
+ public static final double ANGLE_8D_OF_3P = 157.5;
+ public static final double ANGLE_8D_OF_4P = 202.5;
+ public static final double ANGLE_8D_OF_5P = 247.5;
+ public static final double ANGLE_8D_OF_6P = 292.5;
+ public static final double ANGLE_8D_OF_7P = 337.5;
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/CallBackMode.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/CallBackMode.java
new file mode 100644
index 0000000..ff2237a
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/CallBackMode.java
@@ -0,0 +1,15 @@
+package com.kongqw.rockerlibrary.view;
+
+/**
+ * 回调模式
+ */
+public enum CallBackMode {
+ /**
+ * 有移动就立刻回调
+ */
+ CALL_BACK_MODE_MOVE,
+ /**
+ * 只有状态变化的时候才回调
+ */
+ CALL_BACK_MODE_STATE_CHANGE
+}
\ No newline at end of file
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/Direction.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/Direction.java
new file mode 100644
index 0000000..eba47a8
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/Direction.java
@@ -0,0 +1,43 @@
+package com.kongqw.rockerlibrary.view;
+
+/**
+ * 方向
+ */
+public enum Direction {
+ /**
+ * 左
+ */
+ DIRECTION_LEFT,
+ /**
+ * 右
+ */
+ DIRECTION_RIGHT,
+ /**
+ * 上
+ */
+ DIRECTION_UP,
+ /**
+ * 下
+ */
+ DIRECTION_DOWN,
+ /**
+ * 左上
+ */
+ DIRECTION_UP_LEFT,
+ /**
+ * 右上
+ */
+ DIRECTION_UP_RIGHT,
+ /**
+ * 左下
+ */
+ DIRECTION_DOWN_LEFT,
+ /**
+ * 右下
+ */
+ DIRECTION_DOWN_RIGHT,
+ /**
+ * 中间
+ */
+ DIRECTION_CENTER
+}
\ No newline at end of file
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/DirectionMode.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/DirectionMode.java
new file mode 100644
index 0000000..55919ac
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/DirectionMode.java
@@ -0,0 +1,27 @@
+package com.kongqw.rockerlibrary.view;
+
+/**
+ * 摇杆支持几个方向
+ */
+public enum DirectionMode {
+ /**
+ *
+ */
+ DIRECTION_2_HORIZONTAL,// 横向 左右两个方向
+ /**
+ *
+ */
+ DIRECTION_2_VERTICAL, // 纵向 上下两个方向
+ /**
+ *
+ */
+ DIRECTION_4_ROTATE_0, // 四个方向
+ /**
+ *
+ */
+ DIRECTION_4_ROTATE_45, // 四个方向 旋转45度
+ /**
+ *
+ */
+ DIRECTION_8 // 八个方向
+}
\ No newline at end of file
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/JudgmentUtil.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/JudgmentUtil.java
new file mode 100644
index 0000000..0751e84
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/JudgmentUtil.java
@@ -0,0 +1,31 @@
+package com.kongqw.rockerlibrary.view;
+
+import static com.kongqw.rockerlibrary.view.AngelConstants.ANGLE_0;
+import static com.kongqw.rockerlibrary.view.AngelConstants.ANGLE_360;
+
+public class JudgmentUtil {
+ /**
+ * 判断当前角度是否处于某多个区间
+ * 判断targetAngle是否处于 0度-firstAngle度区间 以及 secondAngle度-360度 区间内
+ *
+ * @param targetAngle 当前角度
+ * @param firstAngle 区间左边的角度
+ * @param secondAngle 区间右边的角度
+ * @return 是否当前角度是否处于某多个区间
+ */
+ public static boolean multiConditionJudgmentIsInRange(double targetAngle, double firstAngle, double secondAngle) {
+ return judgmentIsInRange(targetAngle, ANGLE_0, firstAngle) || judgmentIsInRange(targetAngle, secondAngle, ANGLE_360);
+ }
+
+ /**
+ * 判断当前角度是否处于某个区间
+ *
+ * @param targetAngle 当前角度
+ * @param smallAngle 区间左边的角度
+ * @param bigAngle 区间右边的角度
+ * @return 是否当前角度是否处于某个区间
+ */
+ public static boolean judgmentIsInRange(double targetAngle, double smallAngle, double bigAngle) {
+ return smallAngle <= targetAngle && bigAngle > targetAngle;
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnAngleChangeListener.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnAngleChangeListener.java
new file mode 100644
index 0000000..c7a1c8d
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnAngleChangeListener.java
@@ -0,0 +1,19 @@
+package com.kongqw.rockerlibrary.view;
+
+/**
+ * 摇动角度的监听接口
+ */
+public interface OnAngleChangeListener {
+ // 开始
+ void onStart();
+
+ /**
+ * 摇杆角度变化
+ *
+ * @param angle 角度[0,360)
+ */
+ void angle(double angle);
+
+ // 结束
+ void onFinish();
+}
\ No newline at end of file
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnShakeListener.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnShakeListener.java
new file mode 100644
index 0000000..c01a442
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/OnShakeListener.java
@@ -0,0 +1,19 @@
+package com.kongqw.rockerlibrary.view;
+
+/**
+ * 摇动方向监听接口
+ */
+public interface OnShakeListener {
+ // 开始
+ void onStart();
+
+ /**
+ * 摇动方向
+ *
+ * @param direction 方向
+ */
+ void direction(Direction direction);
+
+ // 结束
+ void onFinish();
+}
\ No newline at end of file
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/RockerView.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/RockerView.java
index 2e62b60..fc57ce4 100644
--- a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/RockerView.java
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/RockerView.java
@@ -9,6 +9,7 @@
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -19,6 +20,12 @@
import com.kongqw.rockerlibrary.Logger;
import com.kongqw.rockerlibrary.R;
+import com.kongqw.rockerlibrary.view.strategy.Direction2HorizontalStrategy;
+import com.kongqw.rockerlibrary.view.strategy.Direction2VerticalStrategy;
+import com.kongqw.rockerlibrary.view.strategy.Direction4Rotate0Strategy;
+import com.kongqw.rockerlibrary.view.strategy.Direction4Rotate45Strategy;
+import com.kongqw.rockerlibrary.view.strategy.Direction8Strategy;
+import com.kongqw.rockerlibrary.view.strategy.IDealRockerMoveStrategy;
/**
* Created by kqw on 2016/8/30.
@@ -33,6 +40,11 @@ public class RockerView extends View {
private Paint mAreaBackgroundPaint;
private Paint mRockerPaint;
+ // 绘制 跟随手势移动的光环 的画笔
+ private Paint mArcPaint;
+ // 摇杆滑动的角度
+ private double angle = 0;
+
private Point mRockerPosition;
private Point mCenterPoint;
@@ -41,39 +53,27 @@ public class RockerView extends View {
private CallBackMode mCallBackMode = CallBackMode.CALL_BACK_MODE_MOVE;
private OnAngleChangeListener mOnAngleChangeListener;
- private OnShakeListener mOnShakeListener;
+ private OnShakeListener OnShakeListener;
+
+ public OnShakeListener getOnShakeListener() {
+ return OnShakeListener;
+ }
+
+ public void setOnShakeListener(OnShakeListener onShakeListener) {
+ this.OnShakeListener = onShakeListener;
+ }
+ private IDealRockerMoveStrategy mDealRockerMoveStrategy;
private DirectionMode mDirectionMode;
private Direction tempDirection = Direction.DIRECTION_CENTER;
- // 角度
- private static final double ANGLE_0 = 0;
- private static final double ANGLE_360 = 360;
- // 360°水平方向平分2份的边缘角度
- private static final double ANGLE_HORIZONTAL_2D_OF_0P = 90;
- private static final double ANGLE_HORIZONTAL_2D_OF_1P = 270;
- // 360°垂直方向平分2份的边缘角度
- private static final double ANGLE_VERTICAL_2D_OF_0P = 0;
- private static final double ANGLE_VERTICAL_2D_OF_1P = 180;
- // 360°平分4份的边缘角度
- private static final double ANGLE_4D_OF_0P = 0;
- private static final double ANGLE_4D_OF_1P = 90;
- private static final double ANGLE_4D_OF_2P = 180;
- private static final double ANGLE_4D_OF_3P = 270;
- // 360°平分4份的边缘角度(旋转45度)
- private static final double ANGLE_ROTATE45_4D_OF_0P = 45;
- private static final double ANGLE_ROTATE45_4D_OF_1P = 135;
- private static final double ANGLE_ROTATE45_4D_OF_2P = 225;
- private static final double ANGLE_ROTATE45_4D_OF_3P = 315;
-
- // 360°平分8份的边缘角度
- private static final double ANGLE_8D_OF_0P = 22.5;
- private static final double ANGLE_8D_OF_1P = 67.5;
- private static final double ANGLE_8D_OF_2P = 112.5;
- private static final double ANGLE_8D_OF_3P = 157.5;
- private static final double ANGLE_8D_OF_4P = 202.5;
- private static final double ANGLE_8D_OF_5P = 247.5;
- private static final double ANGLE_8D_OF_6P = 292.5;
- private static final double ANGLE_8D_OF_7P = 337.5;
+
+ public Direction getTempDirection() {
+ return tempDirection;
+ }
+
+ public void setTempDirection(Direction tempDirection) {
+ this.tempDirection = tempDirection;
+ }
// 摇杆可移动区域背景
private static final int AREA_BACKGROUND_MODE_PIC = 0;
@@ -83,6 +83,7 @@ public class RockerView extends View {
private int mAreaBackgroundMode = AREA_BACKGROUND_MODE_DEFAULT;
private Bitmap mAreaBitmap;
private int mAreaColor;
+
// 摇杆背景
private static final int ROCKER_BACKGROUND_MODE_PIC = 4;
private static final int ROCKER_BACKGROUND_MODE_COLOR = 5;
@@ -92,6 +93,10 @@ public class RockerView extends View {
private Bitmap mRockerBitmap;
private int mRockerColor;
+ // 摇杆移动的时候,光环背景颜色
+ private int mARCColor;
+ // 摇杆移动的时候,光环背景宽度
+ private int mARCStrokeWidth;
public RockerView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -111,6 +116,13 @@ public RockerView(Context context, AttributeSet attrs) {
mRockerPaint = new Paint();
mRockerPaint.setAntiAlias(true);
+ // 绘制 跟随手势移动的光环 的画笔
+ mArcPaint = new Paint();
+ mArcPaint.setAntiAlias(true); //使用抗锯齿功能
+ mArcPaint.setColor(mARCColor); //设置画笔的颜色为绿色
+ mArcPaint.setStyle(Paint.Style.STROKE); //设置画笔类型为STROKE类型
+ mArcPaint.setStrokeWidth(mARCStrokeWidth); //设置画笔宽度
+
// 中心点
mCenterPoint = new Point();
// 摇杆位置
@@ -150,6 +162,7 @@ private void initAttribute(Context context, AttributeSet attrs) {
// 没有设置背景
mAreaBackgroundMode = AREA_BACKGROUND_MODE_DEFAULT;
}
+
// 摇杆背景
Drawable rockerBackground = typedArray.getDrawable(R.styleable.RockerView_rockerBackground);
if (null != rockerBackground) {
@@ -175,6 +188,11 @@ private void initAttribute(Context context, AttributeSet attrs) {
mRockerBackgroundMode = ROCKER_BACKGROUND_MODE_DEFAULT;
}
+ // 摇杆移动的时候,光环背景颜色
+ mARCColor = typedArray.getColor(R.styleable.RockerView_arcColor, Color.GREEN);
+ // 摇杆移动的时候,光环背景的宽度
+ mARCStrokeWidth = typedArray.getInt(R.styleable.RockerView_arcStrokeWidth, 10);
+
// 摇杆半径
mRockerRadius = typedArray.getDimensionPixelOffset(R.styleable.RockerView_rockerRadius, DEFAULT_ROCKER_RADIUS);
@@ -246,7 +264,7 @@ protected void onDraw(Canvas canvas) {
canvas.drawCircle(mCenterPoint.x, mCenterPoint.y, mAreaRadius, mAreaBackgroundPaint);
}
- // 画摇杆
+ // 画摇杆背景
if (ROCKER_BACKGROUND_MODE_PIC == mRockerBackgroundMode || ROCKER_BACKGROUND_MODE_XML == mRockerBackgroundMode) {
// 图片
Rect src = new Rect(0, 0, mRockerBitmap.getWidth(), mRockerBitmap.getHeight());
@@ -261,6 +279,14 @@ protected void onDraw(Canvas canvas) {
mRockerPaint.setColor(Color.RED);
canvas.drawCircle(mRockerPosition.x, mRockerPosition.y, mRockerRadius, mRockerPaint);
}
+
+ // 绘制跟随手势移动的光环
+ if (angle > 0) {
+ RectF oval = new RectF(0, 0, getWidth(), getHeight());
+ float mAngle = (float) angle;
+ // 使移动的光环圆弧 紧跟着滑动滑动的角度,并且使角度在圆弧中间
+ canvas.drawArc(oval, mAngle - 30, 60, false, mArcPaint);//绘制圆弧,不含圆心
+ }
}
@Override
@@ -307,7 +333,7 @@ private Point getRockerPositionPoint(Point centerPoint, Point touchPoint, float
// 计算弧度
double radian = Math.acos(lenX / lenXY) * (touchPoint.y < centerPoint.y ? -1 : 1);
// 计算角度
- double angle = radian2Angle(radian);
+ angle = radian2Angle(radian);
// 回调 返回参数
callBack(angle);
@@ -375,8 +401,8 @@ private void callBackStart() {
if (null != mOnAngleChangeListener) {
mOnAngleChangeListener.onStart();
}
- if (null != mOnShakeListener) {
- mOnShakeListener.onStart();
+ if (null != OnShakeListener) {
+ OnShakeListener.onStart();
}
}
@@ -387,217 +413,38 @@ private void callBackStart() {
* @param angle 摇动角度
*/
private void callBack(double angle) {
+ // 角度直接回调
if (null != mOnAngleChangeListener) {
mOnAngleChangeListener.angle(angle);
}
- if (null != mOnShakeListener) {
+ // 方向的还得做一系列的逻辑判断
+ if (null != OnShakeListener) {
if (CallBackMode.CALL_BACK_MODE_MOVE == mCallBackMode) {
- switch (mDirectionMode) {
- case DIRECTION_2_HORIZONTAL:// 左右方向
- if (ANGLE_0 <= angle && ANGLE_HORIZONTAL_2D_OF_0P > angle || ANGLE_HORIZONTAL_2D_OF_1P <= angle && ANGLE_360 > angle) {
- // 右
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_HORIZONTAL_2D_OF_0P <= angle && ANGLE_HORIZONTAL_2D_OF_1P > angle) {
- // 左
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- }
- break;
- case DIRECTION_2_VERTICAL:// 上下方向
- if (ANGLE_VERTICAL_2D_OF_0P <= angle && ANGLE_VERTICAL_2D_OF_1P > angle) {
- // 下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_VERTICAL_2D_OF_1P <= angle && ANGLE_360 > angle) {
- // 上
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- }
- break;
- case DIRECTION_4_ROTATE_0:// 四个方向
- if (ANGLE_4D_OF_0P <= angle && ANGLE_4D_OF_1P > angle) {
- // 右下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_RIGHT);
- } else if (ANGLE_4D_OF_1P <= angle && ANGLE_4D_OF_2P > angle) {
- // 左下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_LEFT);
- } else if (ANGLE_4D_OF_2P <= angle && ANGLE_4D_OF_3P > angle) {
- // 左上
- mOnShakeListener.direction(Direction.DIRECTION_UP_LEFT);
- } else if (ANGLE_4D_OF_3P <= angle && ANGLE_360 > angle) {
- // 右上
- mOnShakeListener.direction(Direction.DIRECTION_UP_RIGHT);
- }
- break;
- case DIRECTION_4_ROTATE_45:// 四个方向 旋转45度
- if (ANGLE_0 <= angle && ANGLE_ROTATE45_4D_OF_0P > angle || ANGLE_ROTATE45_4D_OF_3P <= angle && ANGLE_360 > angle) {
- // 右
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_ROTATE45_4D_OF_0P <= angle && ANGLE_ROTATE45_4D_OF_1P > angle) {
- // 下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_ROTATE45_4D_OF_1P <= angle && ANGLE_ROTATE45_4D_OF_2P > angle) {
- // 左
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- } else if (ANGLE_ROTATE45_4D_OF_2P <= angle && ANGLE_ROTATE45_4D_OF_3P > angle) {
- // 上
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- }
- break;
- case DIRECTION_8:// 八个方向
- if (ANGLE_0 <= angle && ANGLE_8D_OF_0P > angle || ANGLE_8D_OF_7P <= angle && ANGLE_360 > angle) {
- // 右
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_8D_OF_0P <= angle && ANGLE_8D_OF_1P > angle) {
- // 右下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_RIGHT);
- } else if (ANGLE_8D_OF_1P <= angle && ANGLE_8D_OF_2P > angle) {
- // 下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_8D_OF_2P <= angle && ANGLE_8D_OF_3P > angle) {
- // 左下
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_LEFT);
- } else if (ANGLE_8D_OF_3P <= angle && ANGLE_8D_OF_4P > angle) {
- // 左
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- } else if (ANGLE_8D_OF_4P <= angle && ANGLE_8D_OF_5P > angle) {
- // 左上
- mOnShakeListener.direction(Direction.DIRECTION_UP_LEFT);
- } else if (ANGLE_8D_OF_5P <= angle && ANGLE_8D_OF_6P > angle) {
- // 上
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- } else if (ANGLE_8D_OF_6P <= angle && ANGLE_8D_OF_7P > angle) {
- // 右上
- mOnShakeListener.direction(Direction.DIRECTION_UP_RIGHT);
- }
- break;
- default:
- break;
- }
+ mDealRockerMoveStrategy.dealCallBackModeMove(this, angle);
} else if (CallBackMode.CALL_BACK_MODE_STATE_CHANGE == mCallBackMode) {
- switch (mDirectionMode) {
- case DIRECTION_2_HORIZONTAL:// 左右方向
- if ((ANGLE_0 <= angle && ANGLE_HORIZONTAL_2D_OF_0P > angle || ANGLE_HORIZONTAL_2D_OF_1P <= angle && ANGLE_360 > angle) && tempDirection != Direction.DIRECTION_RIGHT) {
- // 右
- tempDirection = Direction.DIRECTION_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_HORIZONTAL_2D_OF_0P <= angle && ANGLE_HORIZONTAL_2D_OF_1P > angle && tempDirection != Direction.DIRECTION_LEFT) {
- // 左
- tempDirection = Direction.DIRECTION_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- }
- break;
- case DIRECTION_2_VERTICAL:// 上下方向
- if (ANGLE_VERTICAL_2D_OF_0P <= angle && ANGLE_VERTICAL_2D_OF_1P > angle && tempDirection != Direction.DIRECTION_DOWN) {
- // 下
- tempDirection = Direction.DIRECTION_DOWN;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_VERTICAL_2D_OF_1P <= angle && ANGLE_360 > angle && tempDirection != Direction.DIRECTION_UP) {
- // 上
- tempDirection = Direction.DIRECTION_UP;
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- }
- break;
- case DIRECTION_4_ROTATE_0:// 四个方向
- if (ANGLE_4D_OF_0P <= angle && ANGLE_4D_OF_1P > angle && tempDirection != Direction.DIRECTION_DOWN_RIGHT) {
- // 右下
- tempDirection = Direction.DIRECTION_DOWN_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_RIGHT);
- } else if (ANGLE_4D_OF_1P <= angle && ANGLE_4D_OF_2P > angle && tempDirection != Direction.DIRECTION_DOWN_LEFT) {
- // 左下
- tempDirection = Direction.DIRECTION_DOWN_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_LEFT);
- } else if (ANGLE_4D_OF_2P <= angle && ANGLE_4D_OF_3P > angle && tempDirection != Direction.DIRECTION_UP_LEFT) {
- // 左上
- tempDirection = Direction.DIRECTION_UP_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_UP_LEFT);
- } else if (ANGLE_4D_OF_3P <= angle && ANGLE_360 > angle && tempDirection != Direction.DIRECTION_UP_RIGHT) {
- // 右上
- tempDirection = Direction.DIRECTION_UP_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_UP_RIGHT);
- }
- break;
- case DIRECTION_4_ROTATE_45:// 四个方向 旋转45度
- if ((ANGLE_0 <= angle && ANGLE_ROTATE45_4D_OF_0P > angle || ANGLE_ROTATE45_4D_OF_3P <= angle && ANGLE_360 > angle) && tempDirection != Direction.DIRECTION_RIGHT) {
- // 右
- tempDirection = Direction.DIRECTION_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_ROTATE45_4D_OF_0P <= angle && ANGLE_ROTATE45_4D_OF_1P > angle && tempDirection != Direction.DIRECTION_DOWN) {
- // 下
- tempDirection = Direction.DIRECTION_DOWN;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_ROTATE45_4D_OF_1P <= angle && ANGLE_ROTATE45_4D_OF_2P > angle && tempDirection != Direction.DIRECTION_LEFT) {
- // 左
- tempDirection = Direction.DIRECTION_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- } else if (ANGLE_ROTATE45_4D_OF_2P <= angle && ANGLE_ROTATE45_4D_OF_3P > angle && tempDirection != Direction.DIRECTION_UP) {
- // 上
- tempDirection = Direction.DIRECTION_UP;
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- }
- break;
- case DIRECTION_8:// 八个方向
- if ((ANGLE_0 <= angle && ANGLE_8D_OF_0P > angle || ANGLE_8D_OF_7P <= angle && ANGLE_360 > angle) && tempDirection != Direction.DIRECTION_RIGHT) {
- // 右
- tempDirection = Direction.DIRECTION_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_RIGHT);
- } else if (ANGLE_8D_OF_0P <= angle && ANGLE_8D_OF_1P > angle && tempDirection != Direction.DIRECTION_DOWN_RIGHT) {
- // 右下
- tempDirection = Direction.DIRECTION_DOWN_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_RIGHT);
- } else if (ANGLE_8D_OF_1P <= angle && ANGLE_8D_OF_2P > angle && tempDirection != Direction.DIRECTION_DOWN) {
- // 下
- tempDirection = Direction.DIRECTION_DOWN;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN);
- } else if (ANGLE_8D_OF_2P <= angle && ANGLE_8D_OF_3P > angle && tempDirection != Direction.DIRECTION_DOWN_LEFT) {
- // 左下
- tempDirection = Direction.DIRECTION_DOWN_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_DOWN_LEFT);
- } else if (ANGLE_8D_OF_3P <= angle && ANGLE_8D_OF_4P > angle && tempDirection != Direction.DIRECTION_LEFT) {
- // 左
- tempDirection = Direction.DIRECTION_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_LEFT);
- } else if (ANGLE_8D_OF_4P <= angle && ANGLE_8D_OF_5P > angle && tempDirection != Direction.DIRECTION_UP_LEFT) {
- // 左上
- tempDirection = Direction.DIRECTION_UP_LEFT;
- mOnShakeListener.direction(Direction.DIRECTION_UP_LEFT);
- } else if (ANGLE_8D_OF_5P <= angle && ANGLE_8D_OF_6P > angle && tempDirection != Direction.DIRECTION_UP) {
- // 上
- tempDirection = Direction.DIRECTION_UP;
- mOnShakeListener.direction(Direction.DIRECTION_UP);
- } else if (ANGLE_8D_OF_6P <= angle && ANGLE_8D_OF_7P > angle && tempDirection != Direction.DIRECTION_UP_RIGHT) {
- // 右上
- tempDirection = Direction.DIRECTION_UP_RIGHT;
- mOnShakeListener.direction(Direction.DIRECTION_UP_RIGHT);
- }
- break;
- default:
- break;
- }
+ mDealRockerMoveStrategy.dealCallBackModeStateChange(this, angle);
}
}
}
+
/**
* 回调
* 结束
*/
private void callBackFinish() {
+ //结束的时候,滑动的角度要归零
+ angle = 0;
tempDirection = Direction.DIRECTION_CENTER;
if (null != mOnAngleChangeListener) {
mOnAngleChangeListener.onFinish();
}
- if (null != mOnShakeListener) {
- mOnShakeListener.onFinish();
+ if (null != OnShakeListener) {
+ OnShakeListener.onFinish();
}
}
- /**
- * 回调模式
- */
- public enum CallBackMode {
- // 有移动就立刻回调
- CALL_BACK_MODE_MOVE,
- // 只有状态变化的时候才回调
- CALL_BACK_MODE_STATE_CHANGE
- }
+
/**
* 设置回调模式
@@ -608,32 +455,6 @@ public void setCallBackMode(CallBackMode mode) {
mCallBackMode = mode;
}
- /**
- * 摇杆支持几个方向
- */
- public enum DirectionMode {
- DIRECTION_2_HORIZONTAL,// 横向 左右两个方向
- DIRECTION_2_VERTICAL, // 纵向 上下两个方向
- DIRECTION_4_ROTATE_0, // 四个方向
- DIRECTION_4_ROTATE_45, // 四个方向 旋转45度
- DIRECTION_8 // 八个方向
- }
-
- /**
- * 方向
- */
- public enum Direction {
- DIRECTION_LEFT, // 左
- DIRECTION_RIGHT, // 右
- DIRECTION_UP, // 上
- DIRECTION_DOWN, // 下
- DIRECTION_UP_LEFT, // 左上
- DIRECTION_UP_RIGHT, // 右上
- DIRECTION_DOWN_LEFT, // 左下
- DIRECTION_DOWN_RIGHT, // 右下
- DIRECTION_CENTER // 中间
- }
-
/**
* 添加摇杆摇动角度的监听
*
@@ -651,42 +472,24 @@ public void setOnAngleChangeListener(OnAngleChangeListener listener) {
*/
public void setOnShakeListener(DirectionMode directionMode, OnShakeListener listener) {
mDirectionMode = directionMode;
- mOnShakeListener = listener;
- }
-
- /**
- * 摇动方向监听接口
- */
- public interface OnShakeListener {
- // 开始
- void onStart();
-
- /**
- * 摇动方向
- *
- * @param direction 方向
- */
- void direction(Direction direction);
-
- // 结束
- void onFinish();
+ mDealRockerMoveStrategy = initStrategy(mDirectionMode);
+ OnShakeListener = listener;
}
- /**
- * 摇动角度的监听接口
- */
- public interface OnAngleChangeListener {
- // 开始
- void onStart();
-
- /**
- * 摇杆角度变化
- *
- * @param angle 角度[0,360)
- */
- void angle(double angle);
-
- // 结束
- void onFinish();
+ private IDealRockerMoveStrategy initStrategy(DirectionMode mDirectionMode) {
+ IDealRockerMoveStrategy dealRockerMoveStrategy = new Direction2HorizontalStrategy();
+ //根据不同的方向来生成不同的策略
+ if (mDirectionMode == DirectionMode.DIRECTION_2_HORIZONTAL) {
+ dealRockerMoveStrategy = new Direction2HorizontalStrategy();
+ } else if (mDirectionMode == DirectionMode.DIRECTION_2_VERTICAL) {
+ dealRockerMoveStrategy = new Direction2VerticalStrategy();
+ } else if (mDirectionMode == DirectionMode.DIRECTION_4_ROTATE_0) {
+ dealRockerMoveStrategy = new Direction4Rotate0Strategy();
+ } else if (mDirectionMode == DirectionMode.DIRECTION_4_ROTATE_45) {
+ dealRockerMoveStrategy = new Direction4Rotate45Strategy();
+ } else if (mDirectionMode == DirectionMode.DIRECTION_8) {
+ dealRockerMoveStrategy = new Direction8Strategy();
+ }
+ return dealRockerMoveStrategy;
}
}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2HorizontalStrategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2HorizontalStrategy.java
new file mode 100644
index 0000000..9d61e04
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2HorizontalStrategy.java
@@ -0,0 +1,34 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.JudgmentUtil;
+import com.kongqw.rockerlibrary.view.RockerView;
+
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.*;
+import static com.kongqw.rockerlibrary.view.AngelConstants.*;
+
+public class Direction2HorizontalStrategy implements IDealRockerMoveStrategy {
+ @Override
+ public void dealCallBackModeMove(RockerView rockerView, double angle) {
+ if (multiConditionJudgmentIsInRange(angle, ANGLE_HORIZONTAL_2D_OF_0P, ANGLE_HORIZONTAL_2D_OF_1P)) { //0-90度和270度-360度
+ // 右
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+ } else if (JudgmentUtil.judgmentIsInRange(angle, ANGLE_HORIZONTAL_2D_OF_0P, ANGLE_HORIZONTAL_2D_OF_1P)) { //90度-270度
+ // 左
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ }
+ }
+
+ @Override
+ public void dealCallBackModeStateChange(RockerView rockerView, double angle) {
+ if ((multiConditionJudgmentIsInRange(angle, ANGLE_HORIZONTAL_2D_OF_0P, ANGLE_HORIZONTAL_2D_OF_1P)) && rockerView.getTempDirection() != Direction.DIRECTION_RIGHT) { //0-90度和270度-360度 并且当前不是右边方向
+ // 右
+ rockerView.setTempDirection(Direction.DIRECTION_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_HORIZONTAL_2D_OF_0P, ANGLE_HORIZONTAL_2D_OF_1P) && rockerView.getTempDirection() != Direction.DIRECTION_LEFT) { //90度-270度 并且当前不是左边方向
+ // 左
+ rockerView.setTempDirection(Direction.DIRECTION_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ }
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2VerticalStrategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2VerticalStrategy.java
new file mode 100644
index 0000000..60c7883
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction2VerticalStrategy.java
@@ -0,0 +1,36 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.RockerView;
+
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.*;
+import static com.kongqw.rockerlibrary.view.AngelConstants.*;
+
+/**
+ * 纵向 上下两个方向
+ */
+public class Direction2VerticalStrategy implements IDealRockerMoveStrategy{
+ @Override
+ public void dealCallBackModeMove(RockerView rockerView, double angle) {
+ if (judgmentIsInRange(angle, ANGLE_VERTICAL_2D_OF_0P, ANGLE_VERTICAL_2D_OF_1P)) { // 0度到-180度
+ // 下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, ANGLE_VERTICAL_2D_OF_1P, ANGLE_360)) { // 180度到-360度
+ // 上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ }
+ }
+
+ @Override
+ public void dealCallBackModeStateChange(RockerView rockerView, double angle) {
+ if ((judgmentIsInRange(angle, ANGLE_VERTICAL_2D_OF_0P, ANGLE_VERTICAL_2D_OF_1P)) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN) { // 0度到-180度 并且当前不是下方向
+ // 下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, ANGLE_VERTICAL_2D_OF_1P, ANGLE_360) && rockerView.getTempDirection() != Direction.DIRECTION_UP) { // 180度到-360度 并且当前不是上方向
+ // 上
+ rockerView.setTempDirection(Direction.DIRECTION_UP);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ }
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate0Strategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate0Strategy.java
new file mode 100644
index 0000000..3be5a49
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate0Strategy.java
@@ -0,0 +1,50 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.RockerView;
+
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.*;
+import static com.kongqw.rockerlibrary.view.AngelConstants.*;
+
+/**
+ * 纵向 上下两个方向
+ */
+public class Direction4Rotate0Strategy implements IDealRockerMoveStrategy{
+ @Override
+ public void dealCallBackModeMove(RockerView rockerView, double angle) {
+ if (judgmentIsInRange(angle, ANGLE_4D_OF_0P, ANGLE_4D_OF_1P)) { // 0度到-90度
+ // 右下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_1P, ANGLE_4D_OF_2P)) { // 90度到-180度
+ // 左下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_2P, ANGLE_4D_OF_3P)) { // 180度到-270度
+ // 左上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_3P, ANGLE_360)) { // 270度到-360度
+ // 右上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_RIGHT);
+ }
+ }
+
+ @Override
+ public void dealCallBackModeStateChange(RockerView rockerView, double angle) {
+ if (judgmentIsInRange(angle, ANGLE_4D_OF_0P, ANGLE_4D_OF_1P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN_RIGHT) {// 0度到-90度 并且当前不是右下方向
+ // 右下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_1P, ANGLE_4D_OF_2P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN_LEFT) {// 90度到-180度 并且当前不是左下方向
+ // 左下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_2P, ANGLE_4D_OF_3P) && rockerView.getTempDirection() != Direction.DIRECTION_UP_LEFT) {// 180度到-270度 并且当前不是左上方向
+ // 左上
+ rockerView.setTempDirection(Direction.DIRECTION_UP_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_4D_OF_3P, ANGLE_360) && rockerView.getTempDirection() != Direction.DIRECTION_UP_RIGHT) {// 270度到-360度 并且当前不是右上方向
+ // 右上
+ rockerView.setTempDirection(Direction.DIRECTION_UP_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_RIGHT);
+ }
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate45Strategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate45Strategy.java
new file mode 100644
index 0000000..a95d38a
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction4Rotate45Strategy.java
@@ -0,0 +1,51 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+import com.kongqw.rockerlibrary.view.AngelConstants;
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.RockerView;
+
+import static com.kongqw.rockerlibrary.view.AngelConstants.*;
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.*;
+
+/**
+ * 纵向 上下两个方向
+ */
+public class Direction4Rotate45Strategy implements IDealRockerMoveStrategy{
+ @Override
+ public void dealCallBackModeMove(RockerView rockerView, double angle) {
+ if (multiConditionJudgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_0P, ANGLE_ROTATE45_4D_OF_3P)) { //0-45度和315度-360度
+ // 右
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_0P, AngelConstants.ANGLE_ROTATE45_4D_OF_1P)) { //45度-135度
+ // 下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, AngelConstants.ANGLE_ROTATE45_4D_OF_1P, ANGLE_ROTATE45_4D_OF_2P)) { //135度-225度
+ // 左
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_2P, ANGLE_ROTATE45_4D_OF_3P)) { //225度-315度
+ // 上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ }
+ }
+
+ @Override
+ public void dealCallBackModeStateChange(RockerView rockerView, double angle) {
+ if ((multiConditionJudgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_0P, ANGLE_ROTATE45_4D_OF_3P)) && rockerView.getTempDirection() != Direction.DIRECTION_RIGHT) { //0-45度和315度-360度 并且当前不是右方向
+ // 右
+ rockerView.setTempDirection(Direction.DIRECTION_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_0P, ANGLE_ROTATE45_4D_OF_1P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN) { //45度-135度 并且当前不是下方向
+ // 下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_1P, ANGLE_ROTATE45_4D_OF_2P) && rockerView.getTempDirection() != Direction.DIRECTION_LEFT) { //135度-225度 并且当前不是左方向
+ // 左
+ rockerView.setTempDirection(Direction.DIRECTION_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_ROTATE45_4D_OF_2P, ANGLE_ROTATE45_4D_OF_3P) && rockerView.getTempDirection() != Direction.DIRECTION_UP) { //225度-315度 并且当前不是上方向
+ // 上
+ rockerView.setTempDirection(Direction.DIRECTION_UP);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ }
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction8Strategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction8Strategy.java
new file mode 100644
index 0000000..df01862
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/Direction8Strategy.java
@@ -0,0 +1,82 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.RockerView;
+
+import static com.kongqw.rockerlibrary.view.AngelConstants.*;
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.judgmentIsInRange;
+import static com.kongqw.rockerlibrary.view.JudgmentUtil.multiConditionJudgmentIsInRange;
+
+/**
+ * 纵向 上下两个方向
+ */
+public class Direction8Strategy implements IDealRockerMoveStrategy{
+ @Override
+ public void dealCallBackModeMove(RockerView rockerView, double angle) {
+ if (multiConditionJudgmentIsInRange(angle, ANGLE_8D_OF_0P, ANGLE_8D_OF_7P)) { //0-22.5度和337.5度-360度
+ // 右
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_0P, ANGLE_8D_OF_1P)) { //22.5度 - 67.5度
+ // 右下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_1P, ANGLE_8D_OF_2P)) {// 67.5度 - 112.5度
+ // 下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_2P, ANGLE_8D_OF_3P)) {// 112.5度 - 157.5度
+ // 左下
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_3P, ANGLE_8D_OF_4P)) {// 157.5度 - 202.5度
+ // 左
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_4P, ANGLE_8D_OF_5P)) {// 202.5度 - 247.5度
+ // 左上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_5P, ANGLE_8D_OF_6P)) {// 247.5度 - 292.5度
+ // 上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_6P, ANGLE_8D_OF_7P)) {// 292.5度 - 337.5度
+ // 右上
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_RIGHT);
+ }
+ }
+
+ @Override
+ public void dealCallBackModeStateChange(RockerView rockerView, double angle) {
+
+ if ((multiConditionJudgmentIsInRange(angle, ANGLE_8D_OF_0P, ANGLE_8D_OF_7P)) && rockerView.getTempDirection() != Direction.DIRECTION_RIGHT) {//0-22.5度和337.5度-360度 并且当前不是右方向
+ // 右
+ rockerView.setTempDirection(Direction.DIRECTION_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_RIGHT);
+
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_0P, ANGLE_8D_OF_1P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN_RIGHT) { //22.5度 - 67.5度 并且当前不是右下方向
+ // 右下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_RIGHT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_1P, ANGLE_8D_OF_2P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN) {// 67.5度 - 112.5度 并且当前不是下方向
+ // 下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_2P, ANGLE_8D_OF_3P) && rockerView.getTempDirection() != Direction.DIRECTION_DOWN_LEFT) {// 112.5度 - 157.5度 并且当前不是左下方向
+ // 左下
+ rockerView.setTempDirection(Direction.DIRECTION_DOWN_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_DOWN_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_3P, ANGLE_8D_OF_4P) && rockerView.getTempDirection() != Direction.DIRECTION_LEFT) {// 157.5度 - 202.5度 并且当前不是左方向
+ // 左
+ rockerView.setTempDirection(Direction.DIRECTION_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_4P, ANGLE_8D_OF_5P) && rockerView.getTempDirection() != Direction.DIRECTION_UP_LEFT) {// 202.5度 - 247.5度 并且当前不是左上方向
+ // 左上
+ rockerView.setTempDirection(Direction.DIRECTION_UP_LEFT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_LEFT);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_5P, ANGLE_8D_OF_6P) && rockerView.getTempDirection() != Direction.DIRECTION_UP) {// 247.5度 - 292.5度 并且当前不是上方向
+ // 上
+ rockerView.setTempDirection(Direction.DIRECTION_UP);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP);
+ } else if (judgmentIsInRange(angle, ANGLE_8D_OF_6P, ANGLE_8D_OF_7P) && rockerView.getTempDirection() != Direction.DIRECTION_UP_RIGHT) {// 292.5度 - 337.5度 并且当前不是右上方向
+ // 右上
+ rockerView.setTempDirection(Direction.DIRECTION_UP_RIGHT);
+ rockerView.getOnShakeListener().direction(Direction.DIRECTION_UP_RIGHT);
+ }
+
+ }
+}
diff --git a/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/IDealRockerMoveStrategy.java b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/IDealRockerMoveStrategy.java
new file mode 100644
index 0000000..d81102f
--- /dev/null
+++ b/KqwRockerLibrary/src/main/java/com/kongqw/rockerlibrary/view/strategy/IDealRockerMoveStrategy.java
@@ -0,0 +1,21 @@
+package com.kongqw.rockerlibrary.view.strategy;
+
+
+import com.kongqw.rockerlibrary.view.RockerView;
+
+public interface IDealRockerMoveStrategy {
+
+ /**
+ * CallBackMode.CALL_BACK_MODE_MOVE 情况下 根据角度来判断方向,然后回调出去
+ *
+ * @param angle 角度
+ */
+ void dealCallBackModeMove(RockerView rockerView, double angle);
+
+ /**
+ * CallBackMode.CALL_BACK_MODE_STATE_CHANGE 情况下 根据角度来判断方向,然后回调出去
+ *
+ * @param angle 角度
+ */
+ void dealCallBackModeStateChange(RockerView rockerView, double angle);
+}
diff --git a/KqwRockerLibrary/src/main/res/drawable/bottom_move_light.png b/KqwRockerLibrary/src/main/res/drawable/bottom_move_light.png
new file mode 100644
index 0000000..53fd3a4
Binary files /dev/null and b/KqwRockerLibrary/src/main/res/drawable/bottom_move_light.png differ
diff --git a/KqwRockerLibrary/src/main/res/drawable/left_move_light.png b/KqwRockerLibrary/src/main/res/drawable/left_move_light.png
new file mode 100644
index 0000000..6ab346f
Binary files /dev/null and b/KqwRockerLibrary/src/main/res/drawable/left_move_light.png differ
diff --git a/KqwRockerLibrary/src/main/res/drawable/right_move_light.png b/KqwRockerLibrary/src/main/res/drawable/right_move_light.png
new file mode 100644
index 0000000..d096364
Binary files /dev/null and b/KqwRockerLibrary/src/main/res/drawable/right_move_light.png differ
diff --git a/KqwRockerLibrary/src/main/res/drawable/top_move_light.png b/KqwRockerLibrary/src/main/res/drawable/top_move_light.png
new file mode 100644
index 0000000..79bd825
Binary files /dev/null and b/KqwRockerLibrary/src/main/res/drawable/top_move_light.png differ
diff --git a/KqwRockerLibrary/src/main/res/values/attrs.xml b/KqwRockerLibrary/src/main/res/values/attrs.xml
index 602afde..0d6560a 100644
--- a/KqwRockerLibrary/src/main/res/values/attrs.xml
+++ b/KqwRockerLibrary/src/main/res/values/attrs.xml
@@ -1,10 +1,15 @@
-
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/Readme.md b/Readme.md
index ede1f59..acdfeab 100644
--- a/Readme.md
+++ b/Readme.md
@@ -187,11 +187,11 @@ setOnShakeListener(DirectionMode directionMode, OnShakeListener listener)
| 方向 | 图 | 描述 |
|------------------------|------------------|------|
-| DIRECTION_2_HORIZONTAL || 横向 左右两个方向 |
-| DIRECTION_2_VERTICAL || 纵向 上下两个方向 |
-| DIRECTION_4_ROTATE_0 |  |四个方向 |
-| DIRECTION_4_ROTATE_45 |  |四个方向 旋转45° |
-| DIRECTION_8 |  |八个方向 |
+| DIRECTION_2_HORIZONTAL || 横向 左右两个方向 |
+| DIRECTION_2_VERTICAL || 纵向 上下两个方向 |
+| DIRECTION_4_ROTATE_0 |  |四个方向 |
+| DIRECTION_4_ROTATE_45 |  |四个方向 旋转45° |
+| DIRECTION_8 |  |八个方向 |
方向描述
diff --git a/app/src/main/java/com/kongqw/kqwrockerdemo/MainActivity.java b/app/src/main/java/com/kongqw/kqwrockerdemo/MainActivity.java
index 0bdfda6..cf371d4 100644
--- a/app/src/main/java/com/kongqw/kqwrockerdemo/MainActivity.java
+++ b/app/src/main/java/com/kongqw/kqwrockerdemo/MainActivity.java
@@ -2,12 +2,19 @@
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
+import android.util.Log;
import android.widget.TextView;
+import com.kongqw.rockerlibrary.view.CallBackMode;
+import com.kongqw.rockerlibrary.view.Direction;
+import com.kongqw.rockerlibrary.view.DirectionMode;
+import com.kongqw.rockerlibrary.view.OnAngleChangeListener;
+import com.kongqw.rockerlibrary.view.OnShakeListener;
import com.kongqw.rockerlibrary.view.RockerView;
public class MainActivity extends AppCompatActivity {
+ private static final String TAG = "MainActivity";
private TextView mLogLeft;
private TextView mLogRight;
@@ -18,18 +25,22 @@ protected void onCreate(Bundle savedInstanceState) {
mLogLeft = (TextView) findViewById(R.id.log_left);
mLogRight = (TextView) findViewById(R.id.log_right);
+ //初始化
RockerView rockerViewLeft = (RockerView) findViewById(R.id.rockerView_left);
if (rockerViewLeft != null) {
- rockerViewLeft.setCallBackMode(RockerView.CallBackMode.CALL_BACK_MODE_STATE_CHANGE);
- rockerViewLeft.setOnShakeListener(RockerView.DirectionMode.DIRECTION_8, new RockerView.OnShakeListener() {
+ //设置回调模式
+ rockerViewLeft.setCallBackMode(CallBackMode.CALL_BACK_MODE_STATE_CHANGE);
+ // 监听摇动方向
+ rockerViewLeft.setOnShakeListener(DirectionMode.DIRECTION_4_ROTATE_45, new OnShakeListener() {
@Override
public void onStart() {
mLogLeft.setText(null);
}
@Override
- public void direction(RockerView.Direction direction) {
+ public void direction(Direction direction) {
mLogLeft.setText("摇动方向 : " + getDirection(direction));
+ Log.d(TAG,"摇动方向 : " + getDirection(direction));
}
@Override
@@ -41,7 +52,8 @@ public void onFinish() {
RockerView rockerViewRight = (RockerView) findViewById(R.id.rockerView_right);
if (rockerViewRight != null) {
- rockerViewRight.setOnAngleChangeListener(new RockerView.OnAngleChangeListener() {
+ // 监听摇动角度
+ rockerViewRight.setOnAngleChangeListener(new OnAngleChangeListener() {
@Override
public void onStart() {
mLogRight.setText(null);
@@ -50,6 +62,7 @@ public void onStart() {
@Override
public void angle(double angle) {
mLogRight.setText("摇动角度 : " + angle);
+ Log.d(TAG,"摇动角度 : " + angle);
}
@Override
@@ -60,7 +73,7 @@ public void onFinish() {
}
}
- private String getDirection(RockerView.Direction direction) {
+ private String getDirection(Direction direction) {
String message = null;
switch (direction) {
case DIRECTION_LEFT:
diff --git a/app/src/main/res/drawable/meiguoshou_fast_you.png b/app/src/main/res/drawable/meiguoshou_fast_you.png
new file mode 100644
index 0000000..8ca4601
Binary files /dev/null and b/app/src/main/res/drawable/meiguoshou_fast_you.png differ
diff --git a/app/src/main/res/drawable/meiguoshou_fast_zuo.png b/app/src/main/res/drawable/meiguoshou_fast_zuo.png
new file mode 100644
index 0000000..64fac35
Binary files /dev/null and b/app/src/main/res/drawable/meiguoshou_fast_zuo.png differ
diff --git a/app/src/main/res/drawable/meiguoshou_you.png b/app/src/main/res/drawable/meiguoshou_you.png
new file mode 100644
index 0000000..7921d0d
Binary files /dev/null and b/app/src/main/res/drawable/meiguoshou_you.png differ
diff --git a/app/src/main/res/drawable/meiguoshou_zuo.png b/app/src/main/res/drawable/meiguoshou_zuo.png
new file mode 100644
index 0000000..bf65942
Binary files /dev/null and b/app/src/main/res/drawable/meiguoshou_zuo.png differ
diff --git a/app/src/main/res/drawable/ribenshou_fast_you.png b/app/src/main/res/drawable/ribenshou_fast_you.png
new file mode 100644
index 0000000..7c3cd8c
Binary files /dev/null and b/app/src/main/res/drawable/ribenshou_fast_you.png differ
diff --git a/app/src/main/res/drawable/ribenshou_fast_zuo.png b/app/src/main/res/drawable/ribenshou_fast_zuo.png
new file mode 100644
index 0000000..fc1a692
Binary files /dev/null and b/app/src/main/res/drawable/ribenshou_fast_zuo.png differ
diff --git a/app/src/main/res/drawable/ribenshou_you.png b/app/src/main/res/drawable/ribenshou_you.png
new file mode 100644
index 0000000..fa94f77
Binary files /dev/null and b/app/src/main/res/drawable/ribenshou_you.png differ
diff --git a/app/src/main/res/drawable/ribenshou_zuo.png b/app/src/main/res/drawable/ribenshou_zuo.png
new file mode 100644
index 0000000..702a147
Binary files /dev/null and b/app/src/main/res/drawable/ribenshou_zuo.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..52dbb90
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_light.png
new file mode 100644
index 0000000..fa697be
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_disabled_focused_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_dark.png
new file mode 100644
index 0000000..17c040e
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_light.png
new file mode 100644
index 0000000..26ce4cf
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_disabled_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_dark.png
new file mode 100644
index 0000000..17ac8cd
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_light.png
new file mode 100644
index 0000000..0ad3671
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_focused_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_off_holo_dark.png
new file mode 100644
index 0000000..f1b5abb
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_off_holo_light.png
new file mode 100644
index 0000000..8d11c5b
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_dark.png
new file mode 100644
index 0000000..7e0ce0e
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_light.png
new file mode 100644
index 0000000..c207fff
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_off_pressed_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..571a69b
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_light.png
new file mode 100644
index 0000000..c5dd175
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_disabled_focused_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_dark.png
new file mode 100644
index 0000000..61a4890
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_light.png
new file mode 100644
index 0000000..6ee4eb1
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_disabled_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_dark.png
new file mode 100644
index 0000000..557cb15
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_light.png
new file mode 100644
index 0000000..2765cb2
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_focused_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_on_holo_dark.png
new file mode 100644
index 0000000..d3d1186
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_on_holo_light.png
new file mode 100644
index 0000000..598fd70
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_holo_light.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_dark.png b/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_dark.png
new file mode 100644
index 0000000..6eb3d7c
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_dark.png differ
diff --git a/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_light.png b/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_light.png
new file mode 100644
index 0000000..7799e47
Binary files /dev/null and b/app/src/main/res/drawable/sad__btn_radio_on_pressed_holo_light.png differ
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 20e3a55..24db53a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -5,14 +5,18 @@
android:layout_height="match_parent"
android:padding="30dp">
+
+ android:background="#FF333333"
+ kongqw:areaBackground="@drawable/meiguoshou_zuo"
+ kongqw:rockerBackground="@drawable/sad__btn_radio_on_focused_holo_light"
+ kongqw:rockerRadius="30dp"
+ kongqw:arcColor="#ff0000"
+ kongqw:arcStrokeWidth="15"/>
+
+
+
+ kongqw:rockerRadius="15dp"
+ kongqw:arcColor="#FF987654"/>