Authorative way to override onMeasure()?

后端 未结 8 2140
眼角桃花
眼角桃花 2020-12-04 07:32

What\'s the correct way of overriding onMeasure()? I\'ve seen various approaches. For example, Professional Android Development uses MeasureSpec to calculate the di

8条回答
  •  遥遥无期
    2020-12-04 08:00

    you can take this piece of code as an example of onMeasure()::

    public class MyLayerLayout extends RelativeLayout {
    
        public MyLayerLayout(Context context) {
            super(context);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    
            int currentChildCount = getChildCount();
            for (int i = 0; i < currentChildCount; i++) {
                View currentChild = getChildAt(i);
    
                //code to find information
    
                int widthPercent = currentChildInfo.getWidth();
                int heightPercent = currentChildInfo.getHeight();
    
    //considering we will pass height & width as percentage
    
                int myWidth = (int) Math.round(parentWidth * (widthPercent / 100.0));
                int myHeight = (int) Math.round(parentHeight * (heightPercent / 100.0));
    
    //Considering we need to set horizontal & vertical position of the view in parent
    
                AlignmentTraitValue vAlign = currentChildInfo.getVerticalLocation() != null ? currentChildlayerInfo.getVerticalLocation() : currentChildAlignmentTraitValue.TOP;
                AlignmentTraitValue hAlign = currentChildInfo.getHorizontalLocation() != null ? currentChildlayerInfo.getHorizontalLocation() : currentChildAlignmentTraitValue.LEFT;
                int topPadding = 0;
                int leftPadding = 0;
    
                if (vAlign.equals(currentChildAlignmentTraitValue.CENTER)) {
                    topPadding = (parentHeight - myHeight) / 2;
                } else if (vAlign.equals(currentChildAlignmentTraitValue.BOTTOM)) {
                    topPadding = parentHeight - myHeight;
                }
    
                if (hAlign.equals(currentChildAlignmentTraitValue.CENTER)) {
                    leftPadding = (parentWidth - myWidth) / 2;
                } else if (hAlign.equals(currentChildAlignmentTraitValue.RIGHT)) {
                    leftPadding = parentWidth - myWidth;
                }
                LayoutParams myLayoutParams = new LayoutParams(myWidth, myHeight);
                currentChildLayoutParams.setMargins(leftPadding, topPadding, 0, 0);
                currentChild.setLayoutParams(myLayoutParams);
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
    

提交回复
热议问题