android 布局-关于getMeasuredWidth()和getWidth()方法

问题描述

关于getMeasuredWidth()和getWidth()方法

package com.example.customview01.view;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import android.R.integer;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;

import com.example.customview01.R;

public class CustomTitleView extends View
{
private String mTitleText;
private int mTitleTextColor;
private int mTitleTextSize;
private Rect mBound;
private Paint mPaint;
private View customvView;

public CustomTitleView(Context context, AttributeSet attrs)
{
    this(context, attrs, 0);
}

public CustomTitleView(Context context)
{
    this(context, null);
}
public CustomTitleView(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
    /*LayoutInflater inflater = LayoutInflater.from(context);
    customvView = inflater.inflate(R.layout.activity_main, null);*/
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);
    int n = a.getIndexCount();
    for (int i = 0; i < n; i++)
    {
        int attr = a.getIndex(i);
        switch (attr)
        {
        case R.styleable.CustomTitleView_titleText:
            mTitleText = a.getString(attr);
            break;
        case R.styleable.CustomTitleView_titleTextColor:
            mTitleTextColor = a.getColor(attr, Color.BLACK);
            break;
        case R.styleable.CustomTitleView_titleTextSize:
            mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                    TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
            break;

        }

    }
    a.recycle();

    mPaint = new Paint();
    mPaint.setTextSize(mTitleTextSize);
    // mPaint.setColor(mTitleTextColor);
    mBound = new Rect();
    mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);

    this.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            mTitleText = randomText();
            postInvalidate();
        }

    });
    System.out.println("45678duiehjwfgiywehbWI");

}
private String randomText()
{
    Random random = new Random();
    Set<Integer> set = new HashSet<Integer>();
    while (set.size() < 4)
    {
        int randomInt = random.nextInt(10);
        set.add(randomInt);
    }
    StringBuffer sb = new StringBuffer();
    for (Integer i : set)
    {
        sb.append("" + i);
    }

    return sb.toString();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    // super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    System.out.println("widthMeasureSpec=   "+widthMeasureSpec+"   heightMeasureSpec=   "+heightMeasureSpec);

    int width = 0;
    int height = 0;

    int specMode = MeasureSpec.getMode(widthMeasureSpec);
    int specSize = MeasureSpec.getSize(widthMeasureSpec);
    System.out.println(specMode+"           ---             "+specSize);
    switch (specMode)
    {
    case MeasureSpec.EXACTLY:
        width = getPaddingLeft() + getPaddingRight() + specSize;
        break;
    case MeasureSpec.AT_MOST:
        int a=getPaddingLeft();
        int b=getPaddingRight();
        int c=mBound.width();
        width = a+b+c;
        break;
    }

    specMode = MeasureSpec.getMode(heightMeasureSpec);
    specSize = MeasureSpec.getSize(heightMeasureSpec);
    switch (specMode)
    {
    case MeasureSpec.EXACTLY:
        height = getPaddingTop() + getPaddingBottom() + specSize;
        break;
    case MeasureSpec.AT_MOST:
        int a=getPaddingTop();
        int b=getPaddingBottom();
        int c=mBound.height();
        height = a+b+c;
        break;
    }
    int i=0;
    setMeasuredDimension(width, height);

}

@Override
protected void onDraw(Canvas canvas)
{
    mPaint.setColor(Color.YELLOW);
    System.out.println(getMeasuredHeight()+"************************"+getMeasuredWidth());
    System.out.println(getHeight()+"   ///////////////////////////   "+getWidth());
    canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);

    mPaint.setColor(mTitleTextColor);
    canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
}

}
这是一个自定义View的代码,很简单,中间利用onMeasure()对View大小进行重绘,我的问题是,在onDraw()方法里面getMeasuredWidth()和getWidth()输出的值不一样,请问这两个方法有什么区别?

解决方案

详解Android getWidth和getMeasuredWidth
getWidth和getMeasuredWidth的区别
getWidth() 和 getMeasuredWidth() 区别

解决方案二:

一个是大小的绝对值,一个是度量值。

解决方案三:

getMeasuredWidth是测量后的实际宽度, getWidth是你在布局中设置的宽度

时间: 2024-11-08 18:33:25

android 布局-关于getMeasuredWidth()和getWidth()方法的相关文章

Android布局——Preference自定义layout的方法_Android

导语:PreferenceActivity是一个方便设置管理的界面,但是对于界面显示来说比较单调,所以自定义布局就很有必要了.本文举例说明在Preference中自定义layout的方法.笔者是为了在设置中插入@有米v4广告条才研究了一晚上的. 正文:首先PreferenceScreen是一个xml文件于res/xml目录下,不属于layout文件.要插入layout,有两种方法. 1.使用Preference的android:@layout属性 1)xml文件中preference的添加 复制

Android布局居中的几种做法_Android

Android的布局文件中,如果想让一个组件(布局或View)居中显示在另一个布局(组件)中,可以由这么几种做法: android:layout_gravity android:gravity android:layout_centerInParent layout_gravity android:layout_gravity ,用来指定当前组件(布局或View)在父组件(布局)中的位置,父布局应该是LinearLayout或者它的后裔. layout_gravity取值可能是: top bot

Android布局居中的几种做法

Android的布局文件中,如果想让一个组件(布局或View)居中显示在另一个布局(组件)中,可以由这么几种做法: android:layout_gravity android:gravity android:layout_centerInParent layout_gravity android:layout_gravity ,用来指定当前组件(布局或View)在父组件(布局)中的位置,父布局应该是LinearLayout或者它的后裔. layout_gravity取值可能是: top bot

Android中实现布局背景模糊化处理的方法_Android

在模仿 IOS 密码输入页面的时候发现其背景有模糊处理,于是了解了一下并记录下来,以便使用.在Android 中具体实现方法如下 查考 http://www.jb51.net/article/64781.htm private void applyBlur() { // 获取壁纸管理器 WallpaperManager wallpaperManager = WallpaperManager.getInstance(this.getContext()); // 获取当前壁纸 Drawable wa

android 布局-Android自定义控件,引用里面的方法,如何引用

问题描述 Android自定义控件,引用里面的方法,如何引用 我自己定义了一个继承自gridview的类,主布局引用,想在主布局里再添加一个button,然后这个button点击处理事件是自定义控件里的一个方法,该怎么调用? new mygridview().方法:不能实现,点击按钮后,程序崩溃 解决方案 你自定义的控件如果是在xml文件中添加到主布局,需要通过findViewById()获取控件的实例,然后调用其方法. 自定义如果是mygridview view=new mygridview(

Android布局(RelativeLayout、TableLayout等)使用方法_Android

 本文介绍 Android 界面开发中最基本的四种布局LinearLayout.RelativeLayout.FrameLayout.TableLayout 的使用方法及这四种布局中常用的属性. LinearLayout 线性布局,布局中空间呈线性排列 RelativeLayout 相对布局,通过相对定位的方式,控制控件位置 FrameLayout 帧布局,最简单的布局,所有控件放置左上角 TableLayout 表格布局,以行列方式控制控件位置 四种布局示例 1.LinearLayout <L

Android动态添加设置布局与控件的方法_Android

本文实例讲述了Android动态添加设置布局与控件的方法.分享给大家供大家参考,具体如下: 有时候我们会在代码端,动态的设置,添加布局和控件.下面我们就看来看一下如何处理,直接上代码,代码里面的注解很清楚了. 布局文件:fragment_hot.xml 说明:这个部局,我用的是scrollView做为基础布局,主要是为了实现一个滚动.这里不多说,这个你可以使用任何布局都可以,这里的id我是提前定义的. 这里面的现在有的布局是我为了看到我在代码端,动态添加的代码,是否可以追加到现有布局的后面而加上

Android布局实现圆角边框的两个方法

方法一 使用 drawable-mdpi 设置边框圆角可以在drawable-mdpi目录里定义一个xml: <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">      <solid android:color="#000000" />

Android布局之LinearLayout自定义高亮背景的方法

本文实例讲述了Android布局之LinearLayout自定义高亮背景的方法.分享给大家供大家参考,具体如下: 首先创建linearlayout_background.xml文件 res/drawable/linearlayout_background.xml <?xml version="1.0" encoding="utf-8"?> <selectorxmlns:android="http://schemas.android.com