转载请务必注明出处:http://blog.youkuaiyun.com/yihongyuelan
GlowPadView就是用来实现滑动接听的控件,该控件隶属InCallScreen界面,也就是我们拨打或接听电话的那个界面,在之前的文章里面也有提到关于InCallScreen界面UI的详细分析,有兴趣的童鞋可以自取搜来看一下。
最近需要做关于滑动接听的一些定制,我们知道,Android原生就支持来电滑动接听/拒接/短信回复三种方式,实现该效果的控件在Android 4.2中叫GlowPadView.java,之前的版本叫做MultiWaveView.java。在Android 4.2上,Google对这一块又做了一些改动,比如移除了在4.0上的水波纹动画,滑动时不再显示圆圈,取而代之的是小白点,带面里面叫PointCloud。之前在github上有看到一个开源项目,就是讲4.2上的这种动画效果提取出来,这对于像将该效果移植到4.2以前的设备上还是很有帮助的。
代码位置:SourceCode/packages/app/Phone
滑动接听控件布局如下所示:
- <com.android.internal.widget.multiwaveview.GlowPadView
- android:id="@+id/incomingCallWidget"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center|bottom"
- android:layout_marginTop="20dip"
- android:layout_marginBottom="-110dip"
- android:background="@android:color/black"
- android:visibility="gone"
- android:gravity="top"
- prvandroid:targetDrawables="@array/incoming_call_widget_3way_targets"
- prvandroid:targetDescriptions="@array/incoming_call_widget_3way_target_descriptions"
- prvandroid:directionDescriptions="@array/incoming_call_widget_3way_direction_descriptions"
- prvandroid:handleDrawable="@drawable/ic_in_call_touch_handle"
- prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
- prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
- prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
- prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
- prvandroid:vibrationDuration="20"
- prvandroid:feedbackCount="1"
- prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"
- prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"
- />
<com.android.internal.widget.multiwaveview.GlowPadView
android:id="@+id/incomingCallWidget"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|bottom"
android:layout_marginTop="20dip"
android:layout_marginBottom="-110dip"
android:background="@android:color/black"
android:visibility="gone"
android:gravity="top"
prvandroid:targetDrawables="@array/incoming_call_widget_3way_targets"
prvandroid:targetDescriptions="@array/incoming_call_widget_3way_target_descriptions"
prvandroid:directionDescriptions="@array/incoming_call_widget_3way_direction_descriptions"
prvandroid:handleDrawable="@drawable/ic_in_call_touch_handle"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
prvandroid:vibrationDuration="20"
prvandroid:feedbackCount="1"
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"
prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"
/>
名词解释:
1. targetDrawables
来电接听控件默认有三个处理事件:接听、拒接、短信回复。这里的@arrary/incoming_call_widget_3way_targets实际内容如下:
- <array name="incoming_call_widget_3way_targets">
- <item>@drawable/ic_lockscreen_answer</item>
- <item>@drawable/ic_lockscreen_text</item>
- <item>@drawable/ic_lockscreen_decline</item>
- <item>@null</item>"
- </array>
<array name="incoming_call_widget_3way_targets">
<item>@drawable/ic_lockscreen_answer</item>
<item>@drawable/ic_lockscreen_text</item>
<item>@drawable/ic_lockscreen_decline</item>
<item>@null</item>"
</array>
2. targetDescriptions
针对接听控件对应的描述文字。内容如下:
- <array name="incoming_call_widget_3way_target_descriptions">
- <item>@string/description_target_answer</item>
- <item>@string/description_target_send_sms</item>
- <item>@string/description_target_decline</item>
- <item>@null</item>"
- </array>
<array name="incoming_call_widget_3way_target_descriptions">
<item>@string/description_target_answer</item>
<item>@string/description_target_send_sms</item>
<item>@string/description_target_decline</item>
<item>@null</item>"
</array>
3. directionDescriptions
对滑动接听控件方向的描述,内容如下:
- <array name="incoming_call_widget_3way_direction_descriptions">
- <item>@*android:string/description_direction_right</item>
- <item>@*android:string/description_direction_up</item>
- <item>@*android:string/description_direction_left</item>
- <item>@null</item>
- </array>
<array name="incoming_call_widget_3way_direction_descriptions">
<item>@*android:string/description_direction_right</item>
<item>@*android:string/description_direction_up</item>
<item>@*android:string/description_direction_left</item>
<item>@null</item>
</array>
4. handleDrawable
这个就是中间按个小圆圈的图片资源
5. innerRadius
内圆的半径大小。这里说的内圆使我们看不到的,与后面提到的外圆对应起来。当来电时会有一个小白点从中心向外扩散的动画,这里的起点就是从innerRadius开始的。
6. outerRadius
外圆的半径大小。与前面的内圆对应起来,都是用于辅助显示小白点动画的,外圆就是动画的截止点,内圆为起始点。
7. outerRingDrawable
外圆的边界线。这是通过shape配置画出来的。代码如下:
- <shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval"
- >
- <size android:height="@dimen/keyguard_lockscreen_outerring_diameter"
- android:width="@dimen/keyguard_lockscreen_outerring_diameter" />
- <solid android:color="#00000000" />
- <stroke android:color="#1affffff" android:width="2dp" />
- </shape>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
>
<size android:height="@dimen/keyguard_lockscreen_outerring_diameter"
android:width="@dimen/keyguard_lockscreen_outerring_diameter" />
<solid android:color="#00000000" />
<stroke android:color="#1affffff" android:width="2dp" />
</shape>
在Android 4.2上我们已经看不到这条边界线了,但通过改变solid里的color值和stroke李的color值可以将其显示出来,在Android4.0上就是这么做的。设置边界线有利于targets的防止,毕竟宽度和高度都有了,位置自然很容易得出,也便于控制。
8. snapMargin
距离target多远会达到触发条件。也就是在来电时,如果我们点击中间的按钮并逐渐向接听侧滑动,当滑动到一定的位置时,会自动将将接听按钮的状态改变,随之图片也会改变。这里的snapMargin就是用来判断我们手指与target距离的。
9. vibrationDuration
震动持续时长。
10. feedbackCount
动画出现的次数。也就是来电时,小白点从内向外扩散,这种效果只有一次。这里为什么会有这个参数呢?因为在Android 4.0时,那个时候还没有小白点,只有水波纹,而且这个值也默认是3,我们可以看到来电时,会闪动3个水波纹,Android 4.2在其基础上进行了修改,但为了保留原来的结构,因此并没有大刀阔斧的删掉这些代码。
11. glowRadius
这个是光晕半径。也就是当我们按下并移动时,跟随我们手指移动的那一小团小白点。在4.0中是handleDrawable会跟着移动,4.2中但出发了onTouchEvent后,handleDrawable就会消失,取而代之的是出现一小圈小白点,也就是这里的光晕半径。
12. pointDrawable
这就是那个小白点的资源。
说明图如下: