图片视图在屏幕方向变化时的调整大小

3
我有一个关于调整ImageView的大小与屏幕方向变化的问题。我需要在ImageView的顶部放置一个位图(用户通过点击放置的标记)。在屏幕方向发生变化时,我会存储标记的相对位置,并在重新显示图像时恢复它。
目前我的做法是:
在恢复时我调用以下代码:
handler.post(setCollectedAnswersRunnable);

参考如下:

关于此事:

Runnable setCollectedAnswersRunnable = new Runnable() {
 @Override
 public void run() {
  if (iv.getMeasuredHeight() != 0) {

   int x = Math.round(coordinateCollectedAnswer.x * iv.getMeasuredWidth() / (float) question.getImage().getWidth());
   int y = Math.round(coordinateCollectedAnswer.y * iv.getMeasuredHeight() / (float) question.getImage().getHeight());

   selectedX = x;
   selectedY = y;

   addPointerImageView(x, y);

  } else {
   handler.postDelayed(this, 330);
  }
 }
};

重要的是,当我从较大的ImageView切换到较小的ImageView时,即从横屏切换到竖屏时,这种方法非常有效。但是反过来就不行了。ImageView似乎先恢复原大小,然后再缩放,这会使我的标记混乱。因此,除了在我的可运行代码中使用!=0条件之外,我肯定可以检查它是否与纵向模式下的大小相同。但首先,我对这种方法并不满意,我更希望在ImageView最终确定大小时得到通知。而且,我不想在我的状态包中传递视图大小。有没有更简单的方法实现这一点?
顺便说一下,我是通过以下方式加载ImageView的:
Picasso.with(iv.getContext())
                .load(AppConstants.SERVER_URL + "/api/" + question.getImage().getUrl())
                .config(Bitmap.Config.RGB_565)
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                        iv.setImageBitmap(bitmap);
                        iv.setAdjustViewBounds(true);
                    }

                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) {

                    }

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {

                    }
                });
1个回答

1
我有一个SurfaceView,它保持正方形。我注意到当Android运行时处理布局时,会一遍又一遍地测量组件,你永远无法知道最后一次是什么时候,执行次数似乎与屏幕上的组件数量无关,它不是随机的,但可能与周围所有东西的布局约束有关。
这是我重写measure方法以保持正方形的类:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int w = MeasureSpec.getSize(widthMeasureSpec);
    int h = MeasureSpec.getSize(heightMeasureSpec);
    int size = w;
    if (w < h) {
        setMeasuredDimension(widthMeasureSpec, widthMeasureSpec);
    } else {
        size = h;
        setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
    }
    if (h > 0 && squareSurfaceViewListener != null) {
        squareSurfaceViewListener.onChangeSize(size);
    }
}

所以我将继承ImageView,检测更改并重新加载图像。 使用Picasso它会缓存内容,但是你可能会忘记这一点,并在每次组件被测量时调用新的加载,或者在中间添加某种观察者。

在我的情况下,我认为imageView经过了3个尺寸。首先是0,然后它尝试之前拥有的尺寸,受容器大小限制(这可以解释为什么从横向到纵向传递时会起作用),然后调整视图边界并获得其最终尺寸。你认为还有其他可能吗?我想尝试将imageview的大小与其容器的大小进行比较,看看是否匹配。我得去吃饭,下午回来。 - Renaud Favier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接