本文是继续上一篇文章,接着讲ImageView图片缩放实现。上一文中已经实现了手势进行放大缩小,平移的效果。
主要解决的问题是:如何限制放大缩小的范围,以及拖动的边界控制。
我在网上搜索相关内容的时候,比较多的是Imageview控件的缩放,例如这篇文章:http://blog.csdn.net/jj120522/article/details/8467810
我的思路其中也参考了这篇文章,但是感觉ImageView控件缩放起来没有matrix缩放图片更流畅,更自然。
所以,我的思路是获取ImageView控件中图片的四周位置,然后进行控制。
1, 主要变量如下:
private class ImageState
{
float left;
float right;
float top;
float bottom;
float width; //图片的宽度
float height;
}
private float mScrWidth; //ImageView宽度
private float mScrHeight;
private float mMaxWidth; //放大的最大宽度
private float mMaxHeight;
其中,ImageState实时记录图片的参数,其他变量是控制的范围。
另外还有两个重要的变量:
private boolean m_IsHorCon = false;
private boolean m_IsVerCon = false;
这两个参数是判断水平/垂直是否已经超出了ImageView控件的宽度,因为如果超出了,所作的处理是不一样的。
例如:水平宽度如果比ImageView控件宽度小,则向左拖动需要保证left>=0, 否则就不能继续拖动了;而if(width> mSrcWidth) if(right <= mSrcWidth) 不能再向左拖动了。。
2, 主要函数,获取ImageState
public void GetCurrentRange()
{
Matrix matrix = mImageView.getImageMatrix();
Rect rect = mImageView.getDrawable().getBounds();
float[] values = new float[9];
matrix.getValues(values);
mMapState.SetLeft(values[2]);
mMapState.SetTop(values[5]);
if(Math.abs(mMapState.GetTop()) > mScrHeight)
{
Log.v("touch", "bug");
}
mMapState.SetWidth(rect.width()*values[0]);
mMapState.SetHeight(rect.height()*values[0]);
float right = mMapState.GetLeft() + mMapState.GetWidth();
float bottom = mMapState.GetTop() + mMapSt