Android getWidth和getMeasuredWidth 区别

转载出处:http://blog.sina.com.cn/s/blog_4b93170a0102e2ns.html


Google文档的英文说明:

getWidth():

Return the width of the your view.

Returns: the width of your view, in pixels

getMeasuredWidth():

The width of this view as measured in the most recent call to measure(). This should be used during measurement and layout calculations only. Use getWidth() to see how wide a view is after layout.

Returns: the measured width of this view

前提知识点:

1. 在一个类初始化时,即在构造函数当中是得不到View的实际大小的(这个我测试过,的确)。大家可以试试,getWidth()和getMeasuredWidth()得到的结果都是0,但是可以从onDraw()方法或者dispatchDraw()方法里面获得。可以通过调用invalidate()来执行onDraw()和dispatchDraw()方法。

2. 这两个方法所得到的结果的单位是像素即pixel

正确的理解:

getWidth(): View在设定好布局后,整个View的宽度

getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure参数的值可以知己定义),否则得到的结果和getWidth()得到的结果是一样的。

这两个方法最主要的区别在于,是否使用了measure()方法,同时measure()使用的位置也很重要。

getHeight() 和 get MeasuredHeight() 区别同理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android实现钟表可以使用自定义View和Canvas来实现。以下是一个简单的示例布局和代码: 布局: ```xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.clockview.ClockView android:id="@+id/clock_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ``` 代码: ```java public class ClockView extends View { private final Paint mPaint = new Paint(); public ClockView(Context context) { super(context); init(); } public ClockView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ClockView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5f); mPaint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); int radius = Math.min(width, height) / 2 - 10; canvas.drawCircle(width / 2, height / 2, radius, mPaint); for (int i = 1; i <= 12; i++) { float x = (float)(width / 2 + radius * Math.sin(Math.toRadians(i * 30))); float y = (float)(height / 2 - radius * Math.cos(Math.toRadians(i * 30))); canvas.drawCircle(x, y, 10, mPaint); } Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); drawHand(canvas, hour * 30 + minute / 2, radius / 2, 10, Color.BLACK); drawHand(canvas, minute * 6, radius * 3 / 5, 5, Color.BLACK); drawHand(canvas, second * 6, radius * 4 / 5, 2, Color.RED); } private void drawHand(Canvas canvas, int degree, int length, int width, int color) { mPaint.setColor(color); mPaint.setStrokeWidth(width); canvas.drawLine(getWidth() / 2, getHeight() / 2, (float)(getWidth() / 2 + length * Math.sin(Math.toRadians(degree))), (float)(getHeight() / 2 - length * Math.cos(Math.toRadians(degree))), mPaint); } } ``` 这个示例使用Canvas绘制钟表的外圆和刻度,然后使用Calendar获取当前时间,计算时针、分针和秒针的位置,最后使用Canvas绘制指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值