Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我可以测量旋转后imageView的实际宽度和高度时_Android - Fatal编程技术网

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

Android 当我可以测量旋转后imageView的实际宽度和高度时,android,Android,我试图在屏幕旋转后获得imageView的宽度和高度,但它总是返回0 注意:旋转后不会调用onWindowFocusChanged,因为我手动处理旋转。当我尝试这个代码的时候 ViewTreeObserver vto = mImgView.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw()

我试图在屏幕旋转后获得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();
        ...
    }

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

编辑:

方向改变时切换布局没有问题。以上只是官方的方式之一。需要注意的重要一点是:setContentView可能不会被多次调用!看到或看到。经验法则:始终在super.onCreate下面的onCreate内部调用setContentView,然后再也不要调用

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

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

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

  • 使用,这是迄今为止最灵活、最有效的选择

  • 使用选项1和2,您将能够像以前一样使用getWidth()和getHeight()轻松测量ImageView的位置。使用选项3有点困难,但仍然有可能。

    就这样试试吧 通过扩展ImageView类创建自定义图像视图

    重写onMeasure()方法


    不,我不希望每次旋转都重新启动活动,我只想更改布局旋转时在横向布局和纵向布局之间切换有什么问题?这是常见的,由android官方推荐tutorial@RamDroid我的答案现在应该回答了你们所有的重要问题。我试过很多次了,它也给出了不同的值。你们的观点最终被测量到多种尺寸并没有错。布局(如RelativeLayout)在确定其正确大小之前可能会多次测量视图。那么,我如何知道正确的大小?您实际需要的大小是什么?这可能有助于找到正确的答案。我需要在此图像视图上的某个位置绘制一些矩形/图形,该位置可以相对于实际大小进行计算。您可以使用
    OnGlobalLayoutListener
    ,而不必分离该侦听器。只要布局侦听器中的代码不影响视图的布局,它就不会导致无限循环。
    @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.
        }
    
    }