当我可以在旋转后测量imageView的实际宽度和高度

时间:2014-08-08 15:36:24

标签: android

我试图在旋转屏幕后获得imageView的宽度和高度,但它总是返回0 注意:onWindowFocusChanged在旋转后不会被调用,因为我手动处理旋转。当我尝试这段代码时

ViewTreeObserver vto = mImgView.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            mImgView.getViewTreeObserver().removeOnPreDrawListener(this);              
            viewWidth = mImgView.getWidth();
            Log.e("Width =",viewWidth +"");
            return true;
        }
    });

它被调用两次并返回不同的值,其中一个是正确的!! 我的图像视图显示代码如下

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    Configuration config=getResources().getConfiguration();


    if(config.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.quran_display_act);
        mImgtView = (ImageView) findViewById(R.id.rightImg_view);
        mImgtView.setImageBitmap(bitmap);
        //TODO hereee
       float viewWidth = mImgtView.getWidth();
        ...
    }

2 个答案:

答案 0 :(得分:0)

那是什么,为什么再次调用setContentView?如果您想手动处理方向更改,请删除configChanges ="方向"如果它在那里,从清单。然后每次旋转屏幕时,都会重建整个活动。所以你只需将你发布的if-else语句放在onCreate()中并单独保留onConfigurationChanged。 This article应该有所帮助。

编辑:

在方向更改时切换布局没有问题。以上只是官方方式之一。需要注意的重要一点是:setContentView可能不会被多次调用!请参阅setContentView() is not enough to switch between layouts?Calling setContentView() multiple times。经验法则:总是在super.onCreate下面的onCreate里面调用setContentView,然后再也不要。

因此,如果您想在更改方向时在运行时切换布局,则必须删除" setContentView(R.layout.quran_display_act);"并使用别的东西。最值得注意的选择是:

  1. ViewFlipper,在这种情况下,您的默认布局是ViewFlipper的第一个子项,您必须将quran_display_act.xml中的所有内容移动到主布局XML,并使其成为ViewFlipper的第二个子项。然后在方向更改时调用ViewFlipper上的next()而不是setContentView。

  2. 显示和隐藏布局。在这里,您还必须将quran_display_act.xml中的所有内容移动到活动的主要布局中。在要切换的布局上调用setVisibility(View.HIDE),并在要显示的布局上调用setVisibility(View.VISIBLE)。

  3. 使用Fragments,这是迄今为止最灵活,最有效的选择。

  4. 使用选项1和2,您可以使用getWidth()和getHeight()来轻松测量ImageView的网站。选项3有点困难,但仍有可能。

答案 1 :(得分:0)

试试这样 通过扩展ImageView类

创建自定义图像视图

覆盖onMeasure()方法

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
int width = MeasureSpec.getSize(widthMeasureSpec);

int height = MeasureSpec.getSize(heightMeasureSpec);



    if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0)
    {
              //write your code here
              //it gets called many times ,so write a condition also to stop executing the same several times.
    }

}