我正在尝试使用缩放功能创建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)。有工作吗?或者我该如何解决这个问题?
答案 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()
之后设置(直到视图第一次渲染),但至少你发布的代码可能完全进入子视图。