diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e28e9f394b82be93d3562e497b63a6b85ab4d56..403d02c38b77779f0b74c7de54be846fca14a322 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.0.5-SNAPSHOT +* modification: Fixed Bug + ## 0.0.4-SNAPSHOT * modification: Fixed Bug diff --git a/README.md b/README.md index 4855c5712183c91f4079adb91fb7026a6a49c268..4c8e7f6061612cf75bdda10a7141f62b924f7d71 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ allprojects { 2.在entry模块的build.gradle文件中 ``` dependencies { - implementation('com.gitee.chinasoft_ohos:PhotoDraweeView:0.0.4-SNAPSHOT') + implementation('com.gitee.chinasoft_ohos:PhotoDraweeView:0.0.5-SNAPSHOT') ...... } ``` @@ -108,7 +108,7 @@ CloudTest代码测试无异常 ## 版本迭代 -+ 0.0.4-SNAPSHOT ++ 0.0.5-SNAPSHOT ## 版权和许可信息 + Apache License \ No newline at end of file diff --git a/photodraweeview/src/main/java/com/me/relex/photodraweeview/PhotoView.java b/photodraweeview/src/main/java/com/me/relex/photodraweeview/PhotoView.java index 972d810173f57fafce8ae68c432d4b2222bbe558..d6a0c0d53b024062cd166caf442528e341fcad9e 100644 --- a/photodraweeview/src/main/java/com/me/relex/photodraweeview/PhotoView.java +++ b/photodraweeview/src/main/java/com/me/relex/photodraweeview/PhotoView.java @@ -39,7 +39,13 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co /** * 双指缩小的最小值 */ - private static final float MIN_SCALE = 0.33f; + private static final float MIN_SCALE = 0.50f; + + /** + * 双指每次缩放的大小 + */ + private static final double ZOOM_SIZE = 0.03; + /** * 整体放大倍数3 */ @@ -103,14 +109,13 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co */ private int mCurrentPointer = 0; - /** - * 初始时scale不为1的情况 - */ - private float mScaleDevInit = 0; - private DisplayAttributes mDisplayAttributes; private float mCurrentPositionX; private float mCurrentPositionY; + private float mLastPositionX = 0; + private float mLastPositionY = 0; + private float mLastWidthBoundary = 0; + private float mLastHeightBoundary = 0; /** * 构造函数 @@ -222,9 +227,9 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co public boolean onTouchEvent(Component component, TouchEvent touchEvent) { switch (touchEvent.getAction()) { case TouchEvent.PRIMARY_POINT_DOWN: - baseValue = 0; mLastMoveValue = -1; mCurrentPointer = 0; + baseValue = 0; isMultiFinger = false; mDownTimeMillis = System.currentTimeMillis(); startX = touchEvent.getPointerScreenPosition(0).getX(); @@ -241,9 +246,13 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co onTouchEventUp(component, touchEvent); break; case TouchEvent.POINT_MOVE: - if (mCurrentPointer == 0 && touchEvent.getPointerCount() == 1) { + // 当前鼠标移动到的坐标 + float pointerX = touchEvent.getPointerScreenPosition(0).getX(); + float pointerY = touchEvent.getPointerScreenPosition(0).getY(); + if (mCurrentPointer == 0 && touchEvent.getPointerCount() == 1 + && Math.abs(pointerX - startX) > 10 && Math.abs(pointerY - startY) > 10) { mCurrentPointer = 1; - } else if (mCurrentPointer == 0 && touchEvent.getPointerCount() == 2) { + } else if (mCurrentPointer == 0 && touchEvent.getPointerCount() >= 2) { mCurrentPointer = 2; } if (touchEvent.getPointerCount() == 1 && mCurrentPointer == 1) { @@ -251,10 +260,14 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co singlePointerMove(touchEvent); } else if (touchEvent.getPointerCount() == 2 && mCurrentPointer == 2 && !isMultiFinger) { doublePointerMove(component, touchEvent); - } else if (touchEvent.getPointerCount() >= 3){ + } else if (touchEvent.getPointerCount() >= 3) { isMultiFinger = true; + doublePointerMove(component, touchEvent); } break; + case TouchEvent.OTHER_POINT_DOWN: + baseValue = 0; + break; default: break; } @@ -279,14 +292,15 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co scaleNum = (getScaleX() - 1) / getScaleStep(); } - // 图片复位 - if (isRecyclerView) { - setPosition(0, 0); - } else { - setPosition(0, (mDisplayAttributes.height - getHeight()) / 2); + // 图片复位(优先判断宽度是否小于当前屏幕宽度) + if (getWidth() * getScaleX() <= mDisplayAttributes.width) { + if (isRecyclerView) { + setPosition(0, 0); + } else { + setPosition(0, (mDisplayAttributes.height - getHeight()) / 2); + } } } - mCurrentPointer = 0; endX = touchEvent.getPointerPosition(0).getX(); endY = touchEvent.getPointerPosition(0).getY(); if (isPageSlider || isRecyclerView) { @@ -298,15 +312,17 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co if (System.currentTimeMillis() - mUpTimeMillis < 200 && System.currentTimeMillis() - mInertiaTimeMillis > 200 && - (Math.abs(moveX) < 100 || Math.abs(moveY) < 100)){ + (Math.abs(moveX) < 100 || Math.abs(moveY) < 100) + ) { setScaleImage(component, true); return; } mUpTimeMillis = System.currentTimeMillis(); - if (Math.abs(moveX) > 100 || Math.abs(moveY) > 100) { + if ((Math.abs(moveX) > 100 || Math.abs(moveY) > 100) && mCurrentPointer == 1) { animationInertia(moveX, moveY); } + mCurrentPointer = 0; } /** @@ -375,41 +391,30 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co * @param touchEvent 事件 */ private void doublePointerMove(Component component, TouchEvent touchEvent) { - // 双指操作 + // 双指间距 float value = calculateDist(touchEvent); // 第一次移动,处理一些图片的初始数据 if (baseValue == 0) { - - // 放大图片被拖动后,需重置后才能进行双指操作 - if (isRecyclerView) { - setPosition(0, 0); - } else { - setPosition(0, (mDisplayAttributes.height - getHeight()) / 2); - } baseValue = value; - if (component.getScaleX() > 1) { - mScaleDevInit = component.getScaleX() - 1; - } else { - mScaleDevInit = 0f; - } } else { - float v = baseValue - value; - if (value - baseValue >= 10 || value - baseValue <= -10) { + if (value - baseValue >= 50 || value - baseValue <= -50) { float scale = 0; - if (value > baseValue) { + if (mLastMoveValue == -1) { + mLastMoveValue = value; + return; + } - // 控制放大比例 - scale = mScaleDevInit + value / baseValue; + if (value > mLastMoveValue) { + scale = (float) (getScaleX() * (1 + ZOOM_SIZE)); } else { - if ((getScaleX() - v / getScreenDiagonal()) > MIN_SCALE) { + if ((float) (getScaleX() * (1 - ZOOM_SIZE)) > MIN_SCALE) { if (mLastMoveValue != -1 && mLastMoveValue - value < 10) { return; } - mLastMoveValue = value; // 控制缩小比例 - scale = getScaleX() - v / getScreenDiagonal(); + scale = (float) (getScaleX() * (1 - ZOOM_SIZE)); } else { // 最低缩小到0.33f @@ -425,7 +430,19 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co return; } scaleFloat = scale; - component.setScale(scale, scale); + mLastMoveValue = value; + + if (scale < 1) { + mLastPositionX = 0; + mLastWidthBoundary = 0; + mLastPositionY = 0; + mLastHeightBoundary = 0; + component.setScale(scale, scale); + } else { + setMoveScale(component, scale); + } + } else { + singlePointerMove(touchEvent); } } } @@ -681,7 +698,7 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co x = (int) positionX; } if (getHeight() * getScaleY() < mDisplayAttributes.height || Math.abs(moveY) < 100) { - if (!isRecyclerView){ + if (!isRecyclerView) { y = (int) positionY; } } @@ -690,4 +707,64 @@ public class PhotoView extends Image implements Component.TouchEventListener, Co animatorValue.start(); } } + + /** + * 处理双指缩放 + * + * @param component component + * @param scale 缩放比例 + */ + private void setMoveScale(Component component, float scale) { + if (scale > getScaleX()) { + mLastPositionX = 0; + mLastWidthBoundary = 0; + mLastPositionY = 0; + mLastHeightBoundary = 0; + component.setScale(scale, scale); + return; + } + + // 处理X轴临界值情况 + int scaleDevX = (int) (getWidth() * ZOOM_SIZE * getScaleX() / 2); + double getNowPositionX = getContentPositionX() > 0 ? + (getContentPositionX() - scaleDevX) : (getContentPositionX() + scaleDevX); + int x = mLastPositionX == 0 ? (int) getNowPositionX : (int) mLastPositionX; + mLastWidthBoundary = mLastWidthBoundary == 0 ? (getWidth() * (getScaleX() - 1) / 2) : (mLastWidthBoundary - scaleDevX); + if (x - mLastWidthBoundary >= 1 && x > 0) { + x = (int) mLastWidthBoundary; + } else if (x < 0 && x + mLastWidthBoundary <= -1) { + x = (int) -mLastWidthBoundary; + } + + // 处理Y轴临界值情况 + int scaleDevY = (int) (getHeight() * ZOOM_SIZE * getScaleY() / 2); + double getNowPositionY = getContentPositionY() > 0 ? + (getContentPositionY() - scaleDevY) : (getContentPositionY() + scaleDevY); + int y = mLastPositionY == 0 ? (int) getNowPositionY : (int) mLastPositionY; + mLastHeightBoundary = mLastHeightBoundary == 0 ? + (getHeight() * (getScaleY() - 1) / 2) : (mLastHeightBoundary - scaleDevY); + if (isRecyclerView) { + if (y - mLastHeightBoundary >= 1 && y > 0) { + y = (int) mLastHeightBoundary; + } else if (y < 0 && y + mLastHeightBoundary <= -1) { + y = (int) -mLastHeightBoundary; + } + } else { + float maxHeight = (getHeight() * (getScaleY() - 1) / 2) - (getHeight() * getScaleY() - mDisplayAttributes.height); + boolean isbeyondScreen = getHeight() * getScaleY() > mDisplayAttributes.height ? true : false; + if (y - mLastHeightBoundary >= 1 && y - maxHeight >= 1 && isbeyondScreen) { + y = (int) mLastHeightBoundary; + } else if ((mLastHeightBoundary - y >= getHeight() * scaleFloat - mDisplayAttributes.height) && isbeyondScreen) { + y = (int) maxHeight + scaleDevY; + } + } + + component.setScale(scale, scale); + mLastWidthBoundary = (getWidth() * (getScaleX() - 1) / 2); + mLastHeightBoundary = (int) (getHeight() * (getScaleY() - 1) / 2); + + setPosition(x, y); + mLastPositionX = getContentPositionX(); + mLastPositionY = getContentPositionY(); + } }