`
l540151663
  • 浏览: 185362 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

android自定义控件宽高的获取

 
阅读更多
前几天,在自定义控件的时候碰到个问题,就是在如何获取自定义控件的高宽。在自定义控件类的构造函数中,本来以为可以轻松获取,但事实不是这样。我测试了下面代码:
先是布局代码:
<com.lml.getvalues.MyView
        android:id="@+id/myView"
        android:layout_width="match_parent"
        android:layout_height="150px"
        android:background="#ff0000" />
再是MyView的构造函数的代码:
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
a="在MyView构造函数中 : MeasuredWidth:"+this.getMeasuredWidth()+";"+"MeasuredHeight:"+this.getMeasuredHeight()+";"
+"Width:"+this.getWidth()+";"+"Height:"+this.getHeight()+"\n";
String h="",w="";
for(int i =0 ;i < attrs.getAttributeCount();i++){
if("layout_height".equals(attrs.getAttributeName(i))){
h=attrs.getAttributeValue(i);
}else if("layout_width".equals(attrs.getAttributeName(i))){
w=attrs.getAttributeValue(i);
}
}
b="在构造函数attrs中 :  width:"+w+";"+"height:"+h+"\n";

}

编译得到a="在MyView构造函数中 : MeasuredWidth:0;MeasuredHeight:0;Width:0;Height:0".
b="在构造函数attrs中 :  width:-1;height:150.0px

结果显示当width为match_parent等数值时,只显示-1等,不能满足我的需求。

然后我试着在相应Activity的onCreate中获取高宽,获得的全部是0.但我在onCreate中的加了个点击控件获取高宽事件,能正确获取高宽。我在网上查了下资料,因为在onCreate中控件还未被度量,所以获取肯定为0.网上有获取三个方法,方法如下:
方法一,在onCreate中添加如下代码:
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
myView.measure(w, h);
int height = myView.getMeasuredHeight();
int width = myView.getMeasuredWidth();
tvValues.append("方法一: height:"+height + ",width:" + width+"\n");

方法二可以实现,代码如下:
ViewTreeObserver vto2 = myView.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
myView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
tvValues.append( "方法二: height:"+myView.getHeight() + ",width:" + myView.getWidth()+"\n");
}
});
但我发现removeGlobalOnLayoutListener在API 级别 16 开始已经废弃,如果去掉,系统会读取多次。

再来看看方法三,代码如下:

ViewTreeObserver vto = myView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
myView.getViewTreeObserver().removeOnPreDrawListener(this);
int height = myView.getMeasuredHeight();
int width = myView.getMeasuredWidth();
tvValues.append("方法三: height:"+height + ",width:" + width + "..\n");
return true;
}
});
我在网上资料的基础上添加了myView.getViewTreeObserver().removeOnPreDrawListener(this);这一条,这个可以保证系统运行一次。
分享到:
评论

相关推荐

    Android自定义控件开发入门与实战.zip

    通过阅读《Android自定义控件开发入门与实战》这本书,开发者不仅可以学习到Android自定义控件的基本概念和技巧,还能获取到大量实战经验,提升解决实际问题的能力。无论是移动端新手还是经验丰富的开发者,这本书都...

    【Android进阶】(1)用继承和组合方式自定义控件

    在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义...

    Android自定义控件的demo

    - **解析属性**:在自定义控件的构造函数中,使用`TypedArray`来获取并设置这些属性。 - **暴露接口**:为了在布局文件中方便地设置这些属性,可以提供对应的setter方法。 4. **使用自定义控件**: - **引入XML*...

    《Android自定义控件入门到实战》源码

    《Android自定义控件入门到实战》源码提供了一套完整的自定义控件学习资源,涵盖了从基础到高级的各种实例,帮助开发者深入理解和实践Android自定义控件的开发。 自定义控件的核心在于扩展Android内置的View或...

    自定义控件Demo

    在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。

    Android 自定义控件

    本文将深入讲解如何进行Android自定义控件的开发,包括理解View的工作原理、创建自定义控件的几种方式以及如何为自定义控件添加属性。 首先,我们需要理解View的基本结构和工作原理。Android的视图系统采用组合模式...

    android 自定义控件与特效

    在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。

    android之自定义开关控件

    在Android开发中,自定义控件是提升应用用户体验和界面美观度的重要手段。"android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解...

    android获取控件宽高

    本篇文章将详细讲解如何在Android中获取控件的宽高,并提供测试代码,帮助开发者更好地理解这一知识点。 首先,Android控件的宽度和高度有两种类型:测量尺寸(measured dimensions)和实际尺寸(actual dimensions...

    android 自定义控件源码实现

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何在Android中实现自定义控件,特别是针对"TestImgTextButton"这个自定义按钮的源码分析。 首先,我们要了解自定义控件的...

    WDCalendar:Android自定义控件

    在Android应用开发中,自定义控件是提升用户体验和界面美观度的重要手段。本文将详细探讨名为"WDCalendar"的Android自定义日历控件,它为开发者提供了更多的设计自由度和功能定制性。 一、WDCalendar控件概述 ...

    android自定义控件之声音大小显示

    在Android开发中,自定义控件是提升应用用户体验和界面独特性的关键。本文将深入探讨如何创建一个自定义控件,用于根据麦克风输入的声音大小动态显示曲线图,并且该控件能响应触摸事件。我们将从以下几个方面进行...

    android自定义控件及其属性设置

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。自定义控件允许开发者根据需求扩展标准Android组件,实现独特的交互效果和视觉样式。本教程将深入探讨如何在Android中创建自定义控件及其属性...

    Android 之 自定义控件用法介绍

    在博客中,作者可能还讨论了如何使用`LayoutInflater`实例化自定义控件,以及如何在`Styleable`类中解析自定义属性,以在Java代码中获取它们的值。此外,`LayoutInflater.Factory2`或`LayoutInflater.Factory`可以...

    android自定义控件:图文编辑框,菊花样式Progressbar

    总之,Android自定义控件的开发需要对Android的图形绘制、事件处理和视图生命周期有深入理解。通过自定义控件,开发者可以根据具体需求打造出独特且功能丰富的界面元素,为用户带来更佳的使用体验。在实际开发中,应...

    Android自定义控件视频下载链接

    本篇内容将深入探讨Android自定义控件的相关知识点,以帮助开发者更好地理解和运用这一技术。 一、自定义控件基础 1. 继承体系:自定义控件通常基于已有的View或ViewGroup类进行扩展。你可以选择直接继承View类,...

    Android-该自定义控件是一个可以滑动改变温度值的表盘控件

    通过研究这些内容,开发者不仅可以学习到如何创建滑动温度表盘控件,还能了解到Android自定义控件的完整流程,包括设计思路、代码实现、UI优化和文档编写等方面的知识。 总结来说,这个自定义控件是Android开发中的...

    android自定义控件自动换行效果实现 简化版demo

    在Android开发中,自定义控件是提升应用用户体验和界面个性化的重要手段。本文将深入探讨如何实现一个自动换行的自定义控件,简化版demo的实现方式,以帮助开发者更好地理解和运用这一技术。 首先,我们需要理解...

    Android 自定义音量控件

    通过分析和实践这个示例,你不仅可以学会如何创建自定义音量控件,还能掌握Android自定义控件的基本原理和技巧。这将有助于你今后在项目中设计出更具个性化的交互元素,提升用户界面的质量和用户体验。

Global site tag (gtag.js) - Google Analytics