ImageView捏拉缩放比例限制和平移边界

时间:2010-10-07 11:31:51

标签: android

我想创建一个包含图片的图库。 图库中的图像应该是可缩放的和可以整理的。我能够捏合缩放图像但无法设置缩放限制并防止图像从屏幕上平移。 我使用以下代码来缩放图像: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5

第一种方法: 我使用TouchImageView向图库提供图像,这让我可以捏缩放 无法滚动图库。即我无法区分“单一标签事件”和“标签滚动事件”。

第二种方法: 使用ImageView将图像提供给图库,如果用户点击任何图库项目,则在TouchImageView中显示所选图像,用户可以在其中捏合图像。但这也阻止我滚动图库视图。还有如何在所选图像上设置缩放限制和平移界限?

4 个答案:

答案 0 :(得分:20)

这解决了我的缩放限制问题。在图像放大/缩小到极限后,它就会停止前进。它也很光滑,没有滞后。 0.7和2.0是最小和最大缩放级别。

....
} else if (mode == ZOOM) {
    float[] f = new float[9];

    float newDist = spacing(event);
    if (newDist > 10f) {
            matrix.set(savedMatrix);
            float tScale = newDist / dist;
            matrix.postScale(tScale, tScale, mid.x, mid.y);
    }

    matrix.getValues(f);
    float scaleX = f[Matrix.MSCALE_X];
    float scaleY = f[Matrix.MSCALE_Y];

    if(scaleX <= 0.7f) {
            matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
    } else if(scaleX >= 2.5f) {
            matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
    }
}
....        

答案 1 :(得分:3)

您可以通过将这些行添加到ACTION_MOVE来设置缩放限制,模式== ZOOM:

float[] f = new float[9];
matrix.getValues(f);

float scaleX = f[Matrix.MSCALE_X];
float scaleY = f[Matrix.MSCALE_Y];
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true;

同样,在ACTION_MOVE,mode == DRAG中添加行,考虑图像的原始位置,翻译的长度,然后将它们与边界进行比较。

答案 2 :(得分:3)

尝试过使用下面的代码,尽管它有效但我发现它导致小的增量值在Trans X和Trans Y中累积,导致图片慢慢移出屏幕。

if(scaleX <= 0.7f)
            matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
    else if(scaleX >= 2.5f) 
            matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);

我修复了这个问题,即将原始矩阵存储在float [](1,0,0,0,1,0,0,0,1)中,并在每次scaleX&lt;时将矩阵重置为这些值。希望有一天能帮助别人:)

if(scaleX <= 1.0f) {                                   
    float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
    matrix.setValues(originalmatrixvalues); 
} else if(scaleX >= 2.5f) {
    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
}

答案 3 :(得分:2)

我提供了一个答案here,为ImageView添加了平移,缩放和边界检测。