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 |![左右两个方向](http://img.blog.csdn.net/20160901183144896)| 横向 左右两个方向 | -| DIRECTION_2_VERTICAL |![上下两个方向](http://img.blog.csdn.net/20160901183332084)| 纵向 上下两个方向 | -| DIRECTION_4_ROTATE_0 | ![四个方向](http://img.blog.csdn.net/20160901183347055) |四个方向 | -| DIRECTION_4_ROTATE_45 | ![四个方向 旋转45°](http://img.blog.csdn.net/20160901183404461) |四个方向 旋转45° | -| DIRECTION_8 | ![八个方向](http://img.blog.csdn.net/20160901183419477) |八个方向 | +| DIRECTION_2_HORIZONTAL |![左右两个方向](https://img.blog.csdn.net/20160901183144896)| 横向 左右两个方向 | +| DIRECTION_2_VERTICAL |![上下两个方向](https://img.blog.csdn.net/20160901183332084)| 纵向 上下两个方向 | +| DIRECTION_4_ROTATE_0 | ![四个方向](https://img.blog.csdn.net/20160901183347055) |四个方向 | +| DIRECTION_4_ROTATE_45 | ![四个方向 旋转45°](s://img.blog.csdn.net/20160901183404461) |四个方向 旋转45° | +| DIRECTION_8 | ![八个方向](https://img.blog.csdn.net/20160901183419477) |八个方向 | 方向描述 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"/>