Android面试必备:自定义View、layout_weight与Handler解析

版权申诉
5星 · 超过95%的资源 2 下载量 93 浏览量 更新于2024-08-08 收藏 29KB DOC 举报
"Android面试题包含了自定义View、layout_weight的理解、layout_gravity与gravity的区别以及Handler机制等关键知识点。" 在Android开发中,自定义View是一个常见的需求,用于实现特定的功能或者定制化的视觉效果。创建自定义View时,通常需要进行以下步骤: 1. **自定义属性**:在`res/values/attrs.xml`文件中定义自定义的属性,这些属性可以在布局XML文件中使用,为View提供额外的配置选项。 2. **属性获取**:在自定义View的构造函数或初始化方法中,通过`context.obtainStyledAttributes(attrs, R.styleable.自定义属性的名字)`来获取XML中设置的属性值。 3. **测量过程**:重写`onMeasure()`方法,遵循MeasureSpec的EXACTLY、AT_MOST和UNSPECIFIED三种模式,计算并设置View的大小,最后调用`setMeasuredDimension()`设定测量结果。 4. **布局定位**:如果自定义的是ViewGroup,还需处理子View的位置,可能需要重写`onLayout()`方法,通过`requestLayout()`触发布局更新。 5. **绘制**:重写`onDraw()`方法,利用Canvas提供的各种绘制方法(如`drawRect()`, `drawText()`, `drawBitmap()`等)进行内容绘制。 6. **触摸事件处理**:若需要处理触摸事件,需要重写`onTouchEvent()`。对于多点触控,还需要关注`ACTION_POINTER_DOWN`和`ACTION_POINTER_UP`事件。 理解`layout_weight`是理解Android布局的重要一环。`layout_weight`是LinearLayout中的属性,用于按比例分配剩余空间。当所有视图的宽度或高度设置了`layout_weight`,它们将根据权重分配额外的空间。若要实现1:2的比例,可以设置`LinearLayout`的`weightSum`属性为3,然后分别给两个子View设置`layout_weight`为1和2。 `layout_gravity`和`gravity`属性在使用上有所区别: - **layout_gravity**:适用于父布局是Gravity容器(如LinearLayout、FrameLayout)时,用来设置当前View在父布局中的对齐方式,比如居中、左对齐、右对齐等。 - **gravity**:适用于View本身,如TextView,设置其内容在View内的对齐方式,例如文字的左对齐、居中或右对齐。 Handler是Android异步通信的核心组件之一,它主要用于在主线程中处理来自其他线程的消息,以更新UI。Handler机制大致包括: 1. **消息发送**:在子线程中创建一个Handler实例,然后使用`sendMessage()`或`post()`方法向MessageQueue发送消息。 2. **消息循环**:主线程中有一个Looper对象,它持续运行`loop()`方法,监听MessageQueue是否有新消息。 3. **消息处理**:当MessageQueue中有新消息时,Looper会取出消息,并通过Handler的`handleMessage()`方法处理。这样,即便消息来自子线程,也能在主线程中执行,确保了对UI的操作是安全的,避免了多线程并发更新UI导致的错误。 了解并掌握这些Android面试题中的知识点,对于开发者来说至关重要,因为它们涵盖了Android UI设计、事件处理和线程通信等核心概念。