MeasureSpec简介 ----老理不清的Measure

本文详细介绍了MeasureSpec的概念及其在Android布局中的应用。MeasureSpec包含一个尺寸和模式,用于传递父布局对子布局的约束条件。文中列举了三种模式:UNSPECIFIED、EXACTLY 和 AT_MOST,并解释了它们的具体含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MeasureSpec简介  

2010-10-15 17:39:44|  分类:android |字号 订阅

做PopupWindow的时候应该会用到。

一个MeasureSpec封装了父布局传给子布局的布局要求。每个MeasureSpec代表了一个宽度或高度的要求。一个MeasureSpec包含一个尺寸和模式。
有三种可能的模式:
UNSPECIFIED:父布局没有给子布局任何限制,子布局可以任意大小。
EXACTLY:父布局决定子布局的确切大小。不论子布局多大,它都必须限制在这个界限里。
AT_MOST:子布局可以根据自己的大小选择任意大小。

为了减少内存分配,MeasueSpecs用整数表示。这个类提供打包和解包<size,mode>元组为整型。参考方法:public static int makeMeasureSpec(int size,int mode)。

基于 Android 的自定义钟表设计通常涉及创建一个自定义视图或使用现有的组件如 `Chronometer` 实现个性化的需求。下面是一个简单的例子,展示如何创建一个自定义的圆形数字时钟: 首先,你需要创建一个新的布局文件 (e.g., custom_clock.xml),内容大致如下: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/customClockFace" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:textSize="48sp" android:textColor="@color/black" android:background="@drawable/circular_background"/> <Chronometer android:id="@+id/chronometerView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:textSize="24sp" android:textColor="@color/white"/> </LinearLayout> ``` 然后,在对应的 Activity 或 Fragment 中设置并初始化: ```java import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.View; public class CustomClockActivity extends AppCompatActivity { private CustomCircularView clockFaceView; private Chronometer chronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_clock); clockFaceView = findViewById(R.id.customClockFace); chronometer = findViewById(R.id.chronometerView); chronometer.setBase(System.currentTimeMillis()); // 如果需要定时更新显示的时间,可以在这里添加监听器 chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { @Override public void onChronometerTick(long timeMillis) { updateClockDisplay(); } }); } private void updateClockDisplay() { clockFaceView.setText(String.format("%02d:%02d", chronometer.getMinute(), chronometer.getCurrentSecond())); } // 自定义视图 - CustomCircularView.java public class CustomCircularView extends View { private Paint paint; public CustomCircularView(Context context) { super(context); initPaint(); } public CustomCircularView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } public CustomCircularView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } private void initPaint() { paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(48); paint.setStrokeWidth(4); paint.setStyle(Paint.Style.STROKE); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() * 0.8f, paint); } // 你可以覆盖此方法来绘制小时、分钟等数字 protected void drawNumbers(Canvas canvas) { String[] hours = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; for (int i = 0; i <= 11; i++) { float angle = (float) (-i * Math.PI / 6); canvas.drawText(hours[i % 12], getWidth() / 2 + Math.sin(angle) * 200, getHeight() / 2 + Math.cos(angle) * 200, paint); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值