如何在onCreate中将图像缩放到imageview时,当我需要使用缩放类型矩阵

问题描述:

我试图创建具有缩放功能的ImageView。 我已经准备好了缩放功能,但是现在我想让图像在启动Activity时缩放到ImageView 。通常我会在xml布局中使用ScaleType, ,但对于缩放功能它需要为Matrix。我怎样才能做到这一点?如何在onCreate中将图像缩放到imageview时,当我需要使用缩放类型矩阵

我想从这个问题的解决方案:Android image view matrix scale + translate

Matrix m = imageView.getImageMatrix(); 
RectF drawableRect = new RectF(0, 0, imageWidth, imageHeight); 
RectF viewRect = new RectF(0, 0, imageView.getWidth(), imageView.getHeight()); 
m.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER); 
imageView.setImageMatrix(m); 

但问题是我不能使用getWidth()getHeight()由于其早期(它只返回0)。有没有解决办法?或者我该如何解决这个问题?

您需要一个添加的观察员ImageView,当对象被layouted将被称为:

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int width = imageView.getWidth(); 
     int height = imageView.getHeight(); 
     // do your stuff 
    } 
}); 
+0

thnx工作很棒:) – Luciano 2012-01-30 09:54:45

唯一的办法,以确保一个看法宽度和高度是继承视图和覆盖onSizeChanged()并使用给定的宽度/高度或使用getMeasuredHeight()getMeasuredWidth()

这意味着您的矩阵将不会在onCreate()之后设置(直到视图将首次渲染),但至少您发布的代码可以完全进入子类视图。

我有矩阵,缩放和imageview相同的问题,我发现最简单的解决方案是渲染图像两次,一个与scaleType fitcenter和矩阵。

经过多次(还真不少..)与setRectToRect之前(等..)中提到的解决方案,我终于找到一个解决方案(至少我的情况下,类似的帖子)诱惑:

在您的活动XML集fitcenter的ImageView的:

<ImageView 
    ... 
    android:scaleType="fitCenter" 

然后在你的java文件中定义一个初始化函数上重点变成

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     init(); 
    } 
} 

private void init() { 
    maxZoom = 10; 
    minZoom = 1f; 
    height = viewHeight; 
    width = viewWidth; 
    **Matrix m = imageSWT.getImageMatrix(); 
    imageSWT.setScaleType(ScaleType.MATRIX); 
    matrix.set(m);** 

} 

所以我使用fitcent的财产呃然后我得到他的矩阵,之后我切换到矩阵模式(用于缩放功能),并且我将fitcentered矩阵保存到矩阵缩放对象中,以便在使用缩放时保持更改。

我希望这个解决方案可以帮助某人;)