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

时间:2012-01-27 15:47:17

标签: android matrix imageview zoom scale

我正在尝试使用缩放功能创建ImageView。 我准备好了缩放功能,但现在我希望图像缩放到ImageView 在启动Activity时。通常我会在xml布局中使用ScaleType, 但缩放功能需要Matrix。我怎么能这样做?

我尝试了这个问题的解决方案: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)。有工作吗?或者我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您需要向ImageView添加一个观察者,当对象布局时将调用该观察者:

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

答案 1 :(得分:1)

我在矩阵,缩放和图像视图方面遇到了同样的问题,我发现最简单的解决方案是渲染图像两次,一次使用scaleType fitcenter和Matrix。

在使用setRectToRect和之前提到的解决方案(等等......)之后很多(真的很多..)诱惑,我终于找到了一个解决方案(至少在我的情况下,类似于帖子):

在你的活动xml set 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);**

}

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

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

答案 2 :(得分:0)

确保视图宽度和高度的唯一方法是对视图进行子类化并覆盖onSizeChanged()并使用给定的宽度/高度或onLayout()并使用getMeasuredHeight()和{{ 1}}。

这意味着你的矩阵不会在getMeasuredWidth()之后设置(直到视图第一次渲染),但至少你发布的代码可能完全进入子视图。