代码之家  ›  专栏  ›  技术社区  ›  chRyNaN

如何指定自定义视图的宽度?

  •  0
  • chRyNaN  · 技术社区  · 13 年前

    我在尝试为自定义视图的宽度设置特定大小时遇到问题。我知道我可以在 layout_width 中的字段 XML 文件,但我尽量不导致硬编码值。我需要我的 View 是屏幕大小的一半。因此,在 class 我发现一半的屏幕大小:

        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        try{
            Point size = new Point();
            display.getSize(size);
            screenWidth = size.x;
        }catch(NoSuchMethodError e){
            screenWidth = display.getWidth();
        }
    

    然后,我打电话给:

     measure(width|MeasureSpec.EXACTLY, LayoutParams.WRAP_CONTENT|MeasureSpec.EXACTLY);
     //Where width is equal to half the screen width
    

    但这似乎对我的案子不起作用。 综上所述, 如何正确地为自定义指定特定的尺寸 看法 ? 任何帮助都将是有用的,并将不胜感激!谢谢

    2 回复  |  直到 13 年前
        1
  •  0
  •   Kevin Coppock    13 年前

    覆盖 onMeasure() 自定义视图中的方法:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getResources().getDisplayMetrics().widthPixels >> 1;
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    

    基本上,覆盖宽度 MeasureSpec 正好是屏幕宽度的一半,然后将其传递到超类。

        2
  •  0
  •   LuxuryMode    13 年前

    我认为,在这一点上,您可能无法准确地获得屏幕的宽度,因为您需要等到整个层次结构(直到最根的视图)都布置好。您可能需要做以下操作:

    ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
    
                int width = getWidth();
                int height = getHeight();
                //set layoutparams with those values.
                }
            };
    
    getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
    

    您可以通过查看当您尝试获取onMeasure内部的显示宽度时所获得的值与调用onGlobalLayout回调时获得的值是否不同来确认这一点的正确性。