У меня есть imageView с мультитачем, ориентировочно основанный на этого урока .Один из комментаторов там собрал полусумный метод ограничения перетаскивания изображения до границ изображения, чтобы край изображения не мог перетаскиваться за его край.Этот метод работает, но не полностью.Он ограничивает перетаскивание только по двум краям.
Кто-нибудь знает менее грязный и действительно функциональный метод ограничения перетаскивания изображения?
Это очень важная концепция для разработки приложений для Android, которая не рассматривается должным образом....
Я думал о следующих идеях:
1) setScaleType (scaleType.fitXY), когда zoom = 1.0F (т. Е. Min zoom), и перетаскивание включено только при zoom>1.0f
2) когда zoom> 1.0f, setScaleType (scaleType.MATRIX), тогда вы определяете границы изображения и размеры экрана, и в некотором смысле это слишком умно для меня, используя оператор if, который вы разрешаете толькоперетащите, когда край изображения не на экране.Я не знаю, как это заявить, это вещь.
в любом случае, для полноты, вот код ограничения панорамы из этой ссылки.Похоже, это самое популярное предложение для stackoverflow, но я думаю, что мы можем добиться большего:
// limit pan
matrix.getValues(matrixValues);
float currentY = matrixValues[Matrix.MTRANS_Y];
float currentX = matrixValues[Matrix.MTRANS_X];
float currentScale = matrixValues[Matrix.MSCALE_X];
float currentHeight = height * currentScale;
float currentWidth = width * currentScale;
float dx = event.getX() - start.x;
float dy = event.getY() - start.y;
float newX = currentX+dx;
float newY = currentY+dy;
RectF drawingRect = new RectF(newX, newY, newX+currentWidth, newY+currentHeight);
float diffUp = Math.min(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top);
float diffDown = Math.max(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top);
float diffLeft = Math.min(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right);
float diffRight = Math.max(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right);
if(diffUp > 0 ){
dy +=diffUp;
}
if(diffDown < 0){
dy +=diffDown;
}
if( diffLeft> 0){
dx += diffLeft;
}
if(diffRight < 0){
dx += diffRight;
}
matrix.postTranslate(dx, dy);