Android Notes 之 View篇(1) View的测量

问题:给MyView设置默认宽高的话,在measure的过程中mode变为EXACTLY,而且不能自适应content的大小。查看TextView的源码,发现其中不仅是对三种模式进行单独处理,而且还让AT_MOST做了自适应content,这个问题有点复杂,留待以后解决

View的测量会回调onMeasure方法,因此首先要复写onMeasure方法,这个方法的作用进行宽高的测量,然后必须调用setMeasuredDimension进行设置,不然会触发IllegalStateException异常

不复写此方法,默认采用EXACTLY模式测量,而EXACTLY只支持match_parent和指定的尺寸,指定为wrap_content的话无效,因为wrap_content要有一个默认值,因此系统会直接设置成match_parent.

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

系统回调onMeasure的时候,是从布局文件中读取宽高的设置,比如指定match_parent和具体尺寸的话,显然这里的mode为EXACTLY,MeasureSpec这里不赘述,官网解释View.MeasureSpec,这种情况下不需要我们处理,因为符合默认的测量模式。

但是我们如果希望控件自适应内容呢?即wrap_content。又该怎么办呢?前面已经提到在布局文件设置wrap_content无效,大家可以自己测试一下。

解决办法:之所以设置无效,是因为在onMeasure的时候,默认以EXACTLY来处理,那么我们只要自己写一个测量方法就可以了。

下面给出了测量宽和高的两个方法

measureWidthmeasureHeight,只需要在模式不是EXACTLY的时候进行处理就可以了

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
    }

    private int measureWidth(int widthMeasureSpec) {
        Log.i("measureWidth"," "+MeasureSpec.toString(widthMeasureSpec));
        int result=200;//指定默认大小
        if((MeasureSpec.getMode(widthMeasureSpec)!=MeasureSpec.EXACTLY)){
            result = Math.min(result,MeasureSpec.getSize(widthMeasureSpec));
            return result;
        }
        return MeasureSpec.getSize(widthMeasureSpec);
    }

    private int measureHeight(int heightMeasureSpec) {
        Log.i("measureHeight"," "+MeasureSpec.toString(heightMeasureSpec));
        int result=200;//指定默认大小
        if((MeasureSpec.getMode(heightMeasureSpec)!=MeasureSpec.EXACTLY)){
            result = Math.min(result,MeasureSpec.getSize(heightMeasureSpec));
            return result;
        }
        return MeasureSpec.getSize(heightMeasureSpec);
    }

日志:

通过日志发现,开始的测量模式为AT_MOST,因为我们设置的是wrap_content,然后再自己定义的测量方法中指定了默认大小,因此变为了EXACTLY。

效果:

实现自己的测量方法前

实现自己的测量方法后

可以看到实现自己的方法后,wrap_content变得有效,默认值为200dp。

时间: 2024-10-03 05:40:09

Android Notes 之 View篇(1) View的测量的相关文章

Android动画原理-基础篇(认识View)

一.动画是什么 Animation is a dynamic medium in which images or objects are manipulated to appear as moving images. -来自维基百科 翻译:动画是动态的画面. 二.android中的动画 手机的屏幕是刷新的,正常情况下频率在60fps.也就是大约16ms界面会刷新一次. android所有的动画的原理都是在这16ms之间,改变了显示内容的区域,从而达到动画的效果. 因为android的可视控件的绘

Android开源项目第一篇——个性化控件(View)篇

本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Andr

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Android查缺补漏(View篇)--自定义 View 的基本流程

View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以形成丰富多彩的交互界面,一个应用中界面交互的体验往往在应用的受欢迎程度上起了很关键得作用,所以开发者们大多会想方设法的做出一个更加精美的界面,例如:通过自定义View.深入学习View的原理以便更好的对其优化使其在操作起来更加流畅等等,也正因为如此,在面试中View也常常作为面试官重点考察的对象之一

Android查缺补漏(View篇)--事件分发机制源码分析

在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)--事件分发机制> ,先来看一下本篇的分析思路,一会儿会按照事件传递的顺序,针对以下几点进行源码分析: Activity对点击事件的分发过程 PhoneWindow是如何处理点击事件的 顶级View对点击事件的分发过程 View对点击事件的处理过程 Activity对点击事件的分发过程 通过上一篇博文中我们

【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑][下文简称(五),请先阅读完(五)再阅读本文],我们通过示例和log来分析了Android的事件分发机制.这些,我们只是看到了现象,如果要进一步了解事件分发机制,这是不够的,我们还需要透过现象看本质,去研究研究源码.本文将从源码(基

【朝花夕拾】Android自定义View篇之(八)多点触控(上)基础知识

前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11155259.html],谢谢! 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2.0开始引入的,在现在使用的Android手机上都是支持多点触控的.本系列文章将对常见的多点触控相关的重点知识进行总结,并使用多点触控来实现一些常见的效果,从而达到将

Android之开源项目view篇

本文转自:http://www.trinea.cn/android/android-open-source-projects-view/ 主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView 1. android-pu

Android学习笔记(第二篇)View中的五大布局

PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Activity是Android的显示层,但是Activity是不能直接显示在屏幕上的,它也像JSP那样,显示的东西是html,那么Android也不例外,Activity是一个抽象的壳子,而显示的东西就是view或者是viewgroup(图形用户组件)....   有了这个概念,我们就清楚view是如何

自定义View 篇一--------《自定义View流程分析》

本文部分内容参考自掘金网:点击打开链接 坐标图解: 概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会比较多.但是任何复杂的技术后面都是一点点简单知识的积累.通过对自定义控件的学习去可以更深入的掌握android的相关知识点,所以学习android自定义控件是很有必要的.所以,今天写的是怎么去自定义一个控件.而不是里面涉及到的细化知识点.一个东西我