【问题标题】:ImageView Resizing On Orientation changesImageView 在方向更改时调整大小
【发布时间】:2016-01-15 10:28:11
【问题描述】:

我有一个关于在方向更改上调整 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) {

                    }
                });

【问题讨论】:

    标签: android imageview android-imageview onconfigurationchanged


    【解决方案1】:

    我有一个保持正方形的 SurfaceView。我注意到,当 android 运行时为布局做所有事情时,会一次又一次地测量组件,你永远无法知道最后一次是什么时候,执行次数似乎与组件的数量无关屏幕,它不是随机的,但可能与周围所有东西的布局约束有关。

    这是我的类覆盖测量离子顺序以保持正方形:

    @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);
        }
    }
    

    所以我会继承图像视图,检测更改并重新加载图像。

    使用 picasso 它会缓存这些内容,但也许您可以忘记这一点,并在每次测量组件时调用新的负载,或者在中间添加某种观察器。

    【讨论】:

    • 在我的情况下,我认为 imageView 通过 3 大小。首先是 0,然后它尝试它以前的大小,受容器大小的限制(这可以解释为什么它在从横向传递到纵向时起作用)然后调整视图边界开始发挥作用并获得最终大小。你会认为它不止于此吗?我想我会尝试将 imageview 的大小与其容器的大小进行比较,看看它是否匹配。我得去吃饭我下午回来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多