有时候调试别人写的代码或者是android源码的时候,不知道当前界面的代码位置,那我们如何定位呢?以下,以SnapdragonCamera为例,定位拍照按钮的点击实现。首先我们将设备连接电脑,打开camera如下图:
打开Android Studio,打开ADM
打开之后,选择HierarchyViewer 选项
由上图可知,当前界面所在的Activity为CameraLauncher,打开AndroidManifest,找到CameraLauncher的定义
<activity-alias
android:name="com.android.camera.CameraLauncher"
android:icon="@mipmap/ic_launcher_camera"
android:label="@string/snapcam_app_name"
android:launchMode="singleTop"
android:targetActivity="com.android.camera.CameraActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
原来CameraLauncher只是CameraActivity的别名,真正的主页面是CameraActivity这个类,我们打开这个类,找到它的布局文件。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/camera_root_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.android.camera.ui.CameraRootView
android:id="@+id/camera_photo_root"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.android.camera.ui.CameraRootView>
<com.android.camera.ui.CameraRootView
android:id="@+id/camera_video_root"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.android.camera.ui.CameraRootView>
<com.android.camera.ui.CameraRootView
android:id="@+id/camera_pano_root"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.android.camera.ui.CameraRootView>
<com.android.camera.ui.CameraRootView
android:id="@+id/camera_capture_root"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.android.camera.ui.CameraRootView>
</FrameLayout>
布局文件非常简单,看来camera的UI做了层层封装,通过此方法无法快速定位拍照按钮的位置,我们来看第二种方式:用UI Automator Viewer 来定位,同样打开ADM,选择DDMS,保持相机处于预览界面,操作如下
通过Ctrl+H全局搜索,查询id/shutter_button 如下,找到拍照按钮的布局代码
查看布局文件,按钮的布局为
<com.android.camera.ShutterButton
android:id="@+id/shutter_button"
android:layout_width="@dimen/shutter_size"
android:layout_height="@dimen/shutter_size"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="@dimen/shutter_offset"
android:clickable="true"
android:contentDescription="@string/accessibility_shutter_button"
android:focusable="true"
android:scaleType="fitCenter"
android:src="@drawable/btn_new_shutter" />
是一个自定义的Button控件,其点击事件实现在 ShutterButton内部
@Override
public boolean performClick() {
boolean result = super.performClick();
if (mListener != null && getVisibility() == View.VISIBLE) {
mListener.onShutterButtonClick();
}
return result;
}
全局搜索shutter_button我们可以得知,当前布局被封装在CaptureUI 、 VideoUI 、PhotoUI中。