使用Android Studio中的HierarchyViewer 及UI Automator Viewer定位当前UI界面的代码位置

有时候调试别人写的代码或者是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中。

猜你喜欢

转载自blog.csdn.net/pshiping2014/article/details/82184427
今日推荐