zoukankan      html  css  js  c++  java
  • Android 自定义View onMeasure

    // MeasureSpec 源码 删除了注释
    public static class MeasureSpec
        {
            private static final int MODE_SHIFT = 30;
            private static final int MODE_MASK = 0x3 << MODE_SHIFT;
            public static final int UNSPECIFIED = 0 << MODE_SHIFT;
            public static final int EXACTLY = 1 << MODE_SHIFT;
            public static final int AT_MOST = 2 << MODE_SHIFT;
    
            public static int makeMeasureSpec(int size, int mode)
            {
                return size + mode;
            }
    
            public static int getMode(int measureSpec)
            {
                return (measureSpec & MODE_MASK);
            }
    
            public static int getSize(int measureSpec)
            {
                return (measureSpec & ~MODE_MASK);
            }
    
            public static String toString(int measureSpec)
            {
                int mode = getMode(measureSpec);
                int size = getSize(measureSpec);
                StringBuilder sb = new StringBuilder("MeasureSpec: ");
                if (mode == UNSPECIFIED)
                {
                    sb.append("UNSPECIFIED ");
                } else if (mode == EXACTLY)
                {
                    sb.append("EXACTLY ");
                } else if (mode == AT_MOST)
                {
                    sb.append("AT_MOST ");
                } else
                {
                    sb.append(mode).append(" ");
                }
                sb.append(size);
                return sb.toString();
            }
        }
        // MeasureSpec.AT_MOST (wrap_content) 代表的是最大可获得的空间
        // MeasureSpec.EXACTLY (fill_parent/match_parent) 代表的是精确的尺寸
        // MeasureSpec.UNSPECIFIED 对于控件尺寸来说,没有任何参考意义。
    
        // 指定自定义View的最小宽高
        private static int MIN_WIDTH_SIZE = 50;
        private static int MIN_HEIGHT_SIZE = 50;
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        { // 测量方法
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = MeasureSpec.getSize(heightMeasureSpec);
            int wmode = MeasureSpec.getMode(widthMeasureSpec);
            int hmode = MeasureSpec.getMode(heightMeasureSpec);
            int w = 0, h = 0;
            w = this.measureSize(wmode, width, MIN_WIDTH_SIZE);
            h = this.measureSize(hmode, height, MIN_HEIGHT_SIZE);
            // 设置测量大小
            super.setMeasuredDimension(w, h);
        }
    
        // 计算测量大小
        public int measureSize(int mode, int measureSize, int minSize)
        {
            int size = 0;
            if (mode == MeasureSpec.AT_MOST)
            {
                size = minSize;
            } else if (mode == MeasureSpec.EXACTLY)
            {
                size = measureSize;
            } else
            { // UNSPECIFIED
                size = minSize;
            }
            return size;
        }

    PS:关于MeasureSpec的解释来自网上搜索

  • 相关阅读:
    6-查看centos中的用户和用户组
    23-python用BeautifulSoup用抓取a标签内所有数据
    22-python爬虫解决gbk乱码问题
    21-py3 发邮件
    20-调用百度AI的文字识别
    6-Ubuntu与Windows不能相互复制
    2018.4.18 Ubuntu 的telnet命令详解
    2018.4.17 java多线程练习二模拟开场仪式进场
    2018.4.16 Java多线程实现龟兔赛跑
    2018.4.15 Mac系统下如何使用StartUml画好需求分析的类图 (同样适用于windows)
  • 原文地址:https://www.cnblogs.com/smile365/p/3179979.html
Copyright © 2011-2022 走看看