日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

自定义控件之onMeasure

發(fā)布時(shí)間:2025/7/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义控件之onMeasure 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近一直在接觸自定義控件的知識(shí),自己就嘗試著寫(xiě)了一個(gè)小的demo,算是對(duì)自定義知識(shí)點(diǎn)進(jìn)行下總結(jié)

今天先來(lái)看下自定義控件需要重寫(xiě)的三個(gè)重要方法

看代碼

package com.example.testcode;import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.View;public class DrawView extends View {public DrawView(Context context) {super(context);Log.e("123", "drawview_1");// TODO Auto-generated constructor stub }public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);Log.e("123", "drawview_3");// TODO Auto-generated constructor stub }public DrawView(Context context, AttributeSet attrs) {super(context, attrs);Log.e("123", "drawview_2");// TODO Auto-generated constructor stub }@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubint widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);Log.e("123", "MeasureSpec.UNSPECIFIED==" + MeasureSpec.UNSPECIFIED);Log.e("123", "MeasureSpec.AT_MOST==" + MeasureSpec.AT_MOST);Log.e("123", "MeasureSpec.EXACTLY==" + MeasureSpec.EXACTLY);Log.e("123", "widthMeasureSpec===" + widthMeasureSpec);Log.e("123", "heightMeasureSpec===" + heightMeasureSpec);Log.e("123", "widthMode==" + widthMode + " widthSize===" + widthSize);Log.e("123", "heightMode==" + heightMode + " heightSize==="+ heightSize);//這兩個(gè)方法必須有一個(gè),否則會(huì)報(bào)錯(cuò)//super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(75, 75);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {// TODO Auto-generated method stubLog.e("123", "change===" + changed + " left===" + left + " top==="+ top + " right===" + right + " bottom===" + bottom);super.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubLog.e("123", "onDraw");super.onDraw(canvas);} }

?

xml中使用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.testcode.MainActivity" ><com.example.testcode.DrawViewandroid:layout_width="100dp"android:layout_height="100dp"android:background="#ff0000" /></RelativeLayout>

?

先看下我們的打印結(jié)果

1 09-28 22:53:26.901: E/123(17442): drawview_22 09-28 22:53:26.959: E/123(17442): MeasureSpec.UNSPECIFIED==03 09-28 22:53:26.959: E/123(17442): MeasureSpec.AT_MOST==-21474836484 09-28 22:53:26.959: E/123(17442): MeasureSpec.EXACTLY==10737418245 09-28 22:53:26.959: E/123(17442): widthMeasureSpec===10737419746 09-28 22:53:26.960: E/123(17442): heightMeasureSpec===-21474829587 09-28 22:53:26.960: E/123(17442): widthMode==1073741824 widthSize===1508 09-28 22:53:26.960: E/123(17442): heightMode==-2147483648 heightSize===6909 09-28 22:53:26.960: E/123(17442): MeasureSpec.UNSPECIFIED==010 09-28 22:53:26.960: E/123(17442): MeasureSpec.AT_MOST==-214748364811 09-28 22:53:26.961: E/123(17442): MeasureSpec.EXACTLY==107374182412 09-28 22:53:26.961: E/123(17442): widthMeasureSpec===107374189913 09-28 22:53:26.961: E/123(17442): heightMeasureSpec===107374197414 09-28 22:53:26.961: E/123(17442): widthMode==1073741824 widthSize===7515 09-28 22:53:26.961: E/123(17442): heightMode==1073741824 heightSize===15016 09-28 22:53:27.001: E/123(17442): change===true left===0 top===0 right===75 bottom===7517 09-28 22:53:27.030: E/123(17442): MeasureSpec.UNSPECIFIED==018 09-28 22:53:27.031: E/123(17442): MeasureSpec.AT_MOST==-214748364819 09-28 22:53:27.031: E/123(17442): MeasureSpec.EXACTLY==107374182420 09-28 22:53:27.031: E/123(17442): widthMeasureSpec===107374197421 09-28 22:53:27.031: E/123(17442): heightMeasureSpec===-214748295822 09-28 22:53:27.031: E/123(17442): widthMode==1073741824 widthSize===15023 09-28 22:53:27.031: E/123(17442): heightMode==-2147483648 heightSize===69024 09-28 22:53:27.031: E/123(17442): MeasureSpec.UNSPECIFIED==025 09-28 22:53:27.031: E/123(17442): MeasureSpec.AT_MOST==-214748364826 09-28 22:53:27.031: E/123(17442): MeasureSpec.EXACTLY==107374182427 09-28 22:53:27.032: E/123(17442): widthMeasureSpec===107374189928 09-28 22:53:27.032: E/123(17442): heightMeasureSpec===107374197429 09-28 22:53:27.032: E/123(17442): widthMode==1073741824 widthSize===7530 09-28 22:53:27.032: E/123(17442): heightMode==1073741824 heightSize===15031 09-28 22:53:27.033: E/123(17442): change===false left===0 top===0 right===75 bottom===7532 09-28 22:53:27.045: E/123(17442): onDraw

?

從上面的結(jié)果我們可以知道xml中控件加載過(guò)程

1.xml中使用的控件,加載的時(shí)候,調(diào)用的是控件兩個(gè)參數(shù)的方法

public DrawView(Context context, AttributeSet attrs) { }

一個(gè)是上下文,一個(gè)是屬性

2.解析來(lái)會(huì)調(diào)用

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { }

方法,這個(gè)方法是用來(lái)確定控件的寬高的,這個(gè)值是從控件的width、height中讀出來(lái)的。但是我們發(fā)現(xiàn),這兩個(gè)值的打印結(jié)果很奇怪,甚至還有負(fù)數(shù)。網(wǎng)上對(duì)此的解釋是

onMeasure傳入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸數(shù)值,而是將模式和尺寸組合在一起的數(shù)值。

具體什么我也不清楚,不過(guò),它其實(shí)是包含了很多信息在里面的。一個(gè)就是,從這個(gè)數(shù)值,我們可以獲得這個(gè)控件寬跟高的形式

使用如下方法

int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec);

這個(gè)mode的取值,可以有一下三種

MeasureSpec.EXACTLY-是精確尺寸,當(dāng)我們將控件的layout_width或layout_height指定為具體數(shù)值時(shí)如andorid:layout_width="50dip",或者為FILL_PARENT是,都是控件大小已經(jīng)確定的情況,都是精確尺寸。

MeasureSpec.AT_MOST 是最大尺寸,當(dāng)控件的layout_width或layout_height指定為WRAP_CONTENT時(shí),控件大小一般隨著控件的子空間或內(nèi)容進(jìn)行 變化,此時(shí)控件尺寸只要不超過(guò)父控件允許的最大尺寸即可。因此,此時(shí)的mode是AT_MOST,size給出了父控件允許的最大尺寸。

MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,通過(guò)measure方法傳入的模式。

轉(zhuǎn)載于:https://www.cnblogs.com/zhangshuli-1989/p/vz_custom_15910151.html

總結(jié)

以上是生活随笔為你收集整理的自定义控件之onMeasure的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 高清无码一区二区在线观看吞精 | 欧美亚洲自拍偷拍 | japanese21ⅹxx日本 | 欧美日韩国产一区二区三区在线观看 | 国产婷婷久久 | 四虎一级片 | 欧美日韩xxx | 九色综合网 | 伊人福利视频 | 国产成人无码精品亚洲 | 少妇人妻一区二区三区 | 豆花在线视频 | 美女隐私直播 | 暖暖成人免费视频 | 美女一级片| 天天艹夜夜艹 | 台湾佬中文在线 | 欧美囗交做爰视频 | 特级做a爰片毛片免费69 | 在线天堂一区 | 国产4区| 午夜国产福利视频 | 国产老头老太作爱视频 | 色吧在线观看 | 男生吃小头头的视频 | 一区二区三区在线免费播放 | 亚色在线观看 | 国产成人精品无码免费看在线 | 欧美三级电影在线观看 | 永久免费国产 | av黄色网址| 嫩草视频在线看 | 99嫩草| 日本黄色片一级 | 亚洲精品乱码久久久久99 | 最新色视频 | 新红楼梦2005锦江版高清在线观看 | 69亚洲乱人伦 | 久久高清一区 | 夜夜爽夜夜叫夜夜高潮漏水 | 高h文在线| 国产人妖ts | 亚洲综合在线一区二区 | 美女隐私无遮挡网站 | 欧美极品一区二区 | 免费人妻一区二区三区 | 欧美日韩成人免费观看 | 女女同性高清片免费看 | 国产成人午夜精品无码区久久 | 日日摸天天爽天天爽视频 | 青青草伊人网 | 精品成人网| 亚洲网站在线播放 | 污视频网站免费在线观看 | 蜜桃av一区二区三区 | wwwjavhd| 国产视频精选 | 国产性一乱一性一伧一色 | 特级西西人体4444xxxx | 国产66页 | 在线观看91视频 | 国产美女精品久久 | 毛片在线免费观看网址 | 成人欧美一区二区三区在线播放 | 亚洲国产成人一区 | 国产成人精品免费网站 | av猫咪 | 天天干,夜夜操 | 枫可怜av | 久精品国产 | 婷婷成人av| 99热激情| 在线视频成人 | 欧洲一二三区 | 99综合久久 | 污视频在线免费 | av免费观看网| 久久黄色一级视频 | 在线免费观看 | 亚洲欧美专区 | 日本中文字幕视频在线 | 北条麻纪在线观看aⅴ | 91天堂素人 | 成人av中文解说水果派 | 国产超碰人人模人人爽人人添 | 中文字幕有码av | 四虎中文字幕 | 激情四射婷婷 | 黄a网站 | 清冷男神被c的合不拢腿男男 | 亚洲人成人网 | 在线色图| 91国偷自产一区二区三区老熟女 | 亚洲影院在线播放 | 色眯眯影院| 日韩人妻无码一区二区三区 | 天天干夜操 | 伊人久久大香 | 色一情一乱一伦 |