Android Container 系列:Container Switch

本文介绍了一个虚拟设备/dev/containerdevice的功能及其实现原理。该设备通过ioctl操作实现容器的注册、获取当前活动容器、设置活动容器等功能。文章还详细介绍了C++层和Java层的接口封装,并展示了容器管理服务(ContainerManagerService)的工作流程。

/dev/container device

Device Drive

  • /dev/container device is a virtual one,device driver code is in drivers/staging/android/container.c in kernel
  • Container device provide the function of register and switch for container
  • By ioctl operating on the device,we can finish specified function

ioctl Operation

  1. CONTAINER_REGISTER:its parameter is a pointer to int;to register the container's ID to which the pointer points
  2. CONTAINER_GET_FRONT_ID:parameter is a pointer to int;to write in running container's ID
  3. CONTAINER_GET_STACK_POS:parameter is a pointer to int;to write in container's ID which need get position before calling;to write in the container's position in stack after calling
  4. CONTAINER_SET_FRONT_ID:parameter is a pointer to int;to set the container's ID to which the pointer points active
  5. CONTAINER_WAIT_FOR_NEW_POS:parameter is a pointer to int;to write in container's ID which need wait for position before calling;to write in the container's new position after calling

The Interface of Container

C++ Interface

  • C++ layer and Java layer encapsulate the access interface of container device
  • C++ layer's encapsulation code is in frameworks/native/libs/container/Container.cpp;it generates libcontainer.so from compilation;the definition of interface is as follow:

      int getCurrentContainer(void)                   get container's ID in which current process is
      int registerContainer(int container)            register a container's ID
      int getFrontContainer(void)                     judge the container's ID in front
      int isCurrentContainerTheFront(void)            judge the container's ID if is in front
      int getContainerPosition(int container)         get the container's position in stack
      int setFrontContainer(int container)            set a container in front
      int waitForNewPosition(int container)           make current process sleep until specified container's position changes
      int getAvailableContainers(int containers[])    get all running containers' ID
    

Java Interface

Java Interface is a kind of android.util.Container class;its source code is in /frameworks/base/core/java/android/util/Container.java;it accesses C++ Interface by JNI(its code is in /frameworks/base/core/jni/android_util_Container.cpp

  1. int getCurrentContainer():return the ID of container in which current process is
  2. int registerContainer(int container):register a container ID to tell kernel the container has started
  3. int getFrontContainer():return the present active container
  4. int setFrontContainer(int container):set a container active
  5. int getContainerPosition(int container):get the position of a container
  6. int waitForNewPosition(int container):current process stay sleep after calling;until specified container's position changes,it'll return the container's new position
  7. int registerCurrentContainer():register the container in which current process is

Container Switch

IContainerManager

  • IContainerManager is a interface of inter-process communication,which defines the communication protocol between App and ContainerMana;and the definition is in frameworks/base/core/java/android/util/IContainerManager.aidl
  • Functions which IContainerManager defines as follow:

      int switchToContainer(int container)    switch to specified container
      int getCurrentContainer()               get container in which current process is
      int getFrontContainer()                 get the front-end container
      boolean isCurrentContainerInFront()     judge the container in which current process is if front-end
      int[] getAvailableContainers()          get all running containers
    

Modified files

  • Add file /frameworks/base/core/java/android/util/IContainerManager.aidl
  • In /frameworks/base/Android.mk,src_files add line /frameworks/base/core/java/android/util/IContainerManager.aidl;if you hope the interface is open for sdk,add it in following file aidl_files

ContainerManagerService

  • CMS is a service,whose name is "container";it realized all functions IContainerManager defines,AMS's code is in frameworks/base/services/java/com/android/server/ContainerManagerService.java
  • CMS is started by SystemServer,and consists in every container
  • Client can make remote calls to CMS by Binder mechanism

Modified files

  • Add file /frameworks/base/services/java/com/android/server/ContainerManagerService.java
  • /frameworks/base/servcies/java/com/android/server/SystemServer.java,add instantiation and call to ContainerManager
  • Modify this catalogue and it will generate system/frameworks/services.jar

ContainerManager SDK

  • ContainerManager is a client of CMS;its code is in development/contain and it generates ermanager;generated jar package from compilation is in

      out/target/common/obj/JAVA_LIBRARIES/containermanager_intermediates/classes.jar
    
  • ContainerManager realize the check and management by remote calls to CMS's interface function
  • ContainerManager belongs to Android SDK;it calls relevant functions in App to access interfaces CMS provides

Container Switchover Process

  1. Applications call switching function-switchToContainer(int) of ContainerManager class
  2. ContainerManager class makes remote calls to switchToContainer(int) interface of ContainerManagerService by Binder mechanism
  3. ContainerManagerService calls Java interface of container device;that is setFrontContainer(int) function of android.util.Container class
  4. Java interface calls C++ interface by JNI;that is setFrontContainer(int) function of container in libcontainer.so
  5. C++ interface open /dev/container device,and do ioctl(CONTAINER_SET_FRONT_ID) operation on it
  6. Container device driver updates the sequence in container list after receiving ioctl operation to make the target container top

Reference Graph

 

修改后如下:<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout 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" android:background="@color/background_gray"> <!-- 颜色层--> <View android:id="@+id/colorOverlay" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--遮罩层--> <View android:id="@+id/cover_view" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0.3" android:background="@color/black" /> <!--背景底色(最底层)--> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/background" android:visibility="visible" /> <ImageView android:id="@+id/switch_off_background" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/switchoffbgd"/> <!-- 顶部杂项--> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/background" android:visibility="visible" app:layout_anchor="@+id/colorOverlay" app:layout_anchorGravity="center" /> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:layout_margin="16dp" android:background="@android:color/transparent" android:scaleType="centerCrop" android:src="@drawable/back" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="16dp" android:text="Smart Lamp" android:textSize="18.4dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="46.5dp" > <ImageView android:layout_width="16dp" android:layout_height="16dp" android:layout_gravity="center_vertical" android:src="@drawable/location" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:text="Bedroom" android:textSize="16dp" /> </LinearLayout> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="end" android:layout_margin="16dp" android:background="@android:color/transparent" android:scaleType="fitCenter" android:src="@drawable/setting" /> <!--按钮组--> <LinearLayout android:id="@+id/button_group" android:layout_width="370dp" android:layout_height="39dp" android:layout_gravity="center_horizontal" android:layout_marginTop="89dp" android:orientation="horizontal" android:paddingStart="22dp" android:paddingEnd="22dp"> <!-- Auto 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_auto" android:layout_width="36dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/white" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/darker_gray" app:strokeWidth="1dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Auto" android:textSize="13dp" /> </FrameLayout> <!-- White 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_white" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/white" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/darker_gray" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_white" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_white" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Orange 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_orange" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/orange" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_orange" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_orange" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Deep Blue 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_deepblue" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/deepblue" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_deepblue" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_deepblue" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Sky Blue 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_skyblue" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/skyblue" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_skyblue" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_skyblue" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Flame Red 按钮 --> <FrameLayout android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp" android:tag="button_container"> <com.google.android.material.button.MaterialButton android:id="@+id/button_flamered" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:backgroundTint="@color/flamered" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_flamered" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_flamered" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> </LinearLayout> <!--灯泡背景--> <ImageView android:id="@+id/imageView" android:layout_width="180dp" android:layout_height="244dp" android:layout_gravity="center_horizontal" android:layout_marginTop="207dp" android:src="@drawable/bulbbottom" /> <!--滑动图层--> <ImageView android:id="@+id/lampImageView" android:layout_width="180dp" android:layout_height="244dp" android:layout_gravity="center_horizontal" android:layout_marginTop="190dp" android:adjustViewBounds="true" android:scaleType="centerInside" android:src="@drawable/clip_bulb" /> <TextView android:id="@+id/percentText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="167dp" android:text="0%" android:textColor="#000" android:textSize="18sp" /> <!--灯泡底座--> <ImageView android:id="@+id/bulb_on_bottom" android:layout_width="180dp" android:layout_height="658dp" android:layout_gravity="center_horizontal" android:scaleType="centerInside" android:src="@drawable/bulbonbottom" /> <!--开关按钮--> <ImageButton android:id="@+id/switch_button" android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:layout_marginTop="476dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/switchselector" /> <!--隐藏栏开关--> <!-- <LinearLayout--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="60dp"--> <!-- android:gravity="center"--> <!-- android:orientation="vertical">--> <!-- <Button--> <!-- android:id="@+id/btn_bottom_sheet"--> <!-- android:layout_width="wrap_content"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="32dp"--> <!-- android:text="BottomSheet"--> <!-- android:textAllCaps="false" />--> <!--隐藏toolbar--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:behavior_peekHeight="130dp" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" > <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/ll_bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:id="@+id/pull" android:layout_width="match_parent" android:layout_height="30dp" android:background="@color/white" android:clickable="false" android:focusable="false" android:gravity="center" android:paddingTop="15dp" android:src="@drawable/pullselector" /> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:background="@color/white" android:paddingStart="10dp" android:paddingTop="10dp" android:paddingEnd="10dp" android:weightSum="4"> <ImageButton android:id="@+id/button_mode" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/mode" /> <ImageButton android:id="@+id/button_schedule" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/schedule" /> <ImageButton android:id="@+id/button_away" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/away" /> <ImageButton android:id="@+id/button_timer" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/timer" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="42dp" android:layout_gravity="center_horizontal" android:background="@color/white" android:paddingStart="10dp" android:paddingEnd="10dp" android:weightSum="4"> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Mode" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Schedule" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Away" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Timer" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10.5dp" android:background="@color/background_gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <TextView android:layout_width="113dp" android:layout_height="41dp" android:gravity="center" android:text="Today" android:textColor="@color/text_gray" android:textSize="13dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:background="@color/white" android:paddingStart="35dp" android:paddingEnd="35dp" android:weightSum="3"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="12.1" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="h" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Runtime" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="125.1" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="Kmh" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Usage" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="11dp" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="992.3" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="Kmh" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Saving" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10.5dp" android:background="@color/background_gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Favorite" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageButton android:id="@+id/button_favorite" android:layout_width="42dp" android:layout_height="28dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/favorite_on" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Device Sharing" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageView android:layout_width="16dp" android:layout_height="16dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/sharing" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" android:textColor="@color/text_gray" /> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/more" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FAQ & Feedback" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/more" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="280dp" android:background="@color/white" /> </LinearLayout> </ScrollView> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
最新发布
08-22
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout 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" android:background="@color/background_gray"> <!-- 颜色层--> <View android:id="@+id/colorOverlay" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--遮罩层--> <View android:id="@+id/cover_view" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0.4" android:background="@color/black" /> <!--背景底色(最底层)--> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/background" android:visibility="gone" /> <!-- 顶部杂项--> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:layout_margin="16dp" android:background="@android:color/transparent" android:scaleType="centerCrop" android:src="@drawable/back" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="16dp" android:text="Smart Lamp" android:textSize="18.4dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="46.5dp" > <ImageView android:layout_width="16dp" android:layout_height="16dp" android:layout_gravity="center_vertical" android:src="@drawable/location" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:text="Bedroom" android:textSize="16dp" /> </LinearLayout> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="end" android:layout_margin="16dp" android:background="@android:color/transparent" android:scaleType="fitCenter" android:src="@drawable/setting" /> <!-- 按钮组--> <!-- 按钮组--> <!-- 按钮组 --> <LinearLayout android:id="@+id/button_group" android:layout_width="370dp" android:layout_height="39dp" android:layout_gravity="center_horizontal" android:layout_marginTop="89dp" android:paddingStart="22dp" android:paddingEnd="22dp" android:orientation="horizontal"> <!-- Auto 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp"> <com.google.android.material.button.MaterialButton android:layout_gravity="center" android:id="@+id/button_auto" android:layout_width="36dp" android:layout_height="35dp" android:backgroundTint="@color/white" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/darker_gray" app:strokeWidth="1dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Auto" android:textSize="13dp" /> </FrameLayout> <!-- White 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp"> <com.google.android.material.button.MaterialButton android:id="@+id/button_white" android:layout_width="35dp" android:layout_height="35dp" android:backgroundTint="@color/white" android:layout_gravity="center" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/darker_gray" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_white" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_white" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Orange 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp"> <com.google.android.material.button.MaterialButton android:id="@+id/button_orange" android:layout_width="35dp" android:layout_height="35dp" android:backgroundTint="@color/orange" android:insetTop="0dp" android:insetBottom="0dp" android:layout_gravity="center" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_orange" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_orange" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Deep Blue 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp"> <com.google.android.material.button.MaterialButton android:id="@+id/button_deepblue" android:layout_width="35dp" android:layout_height="35dp" android:backgroundTint="@color/deepblue" android:layout_gravity="center" android:insetTop="0dp" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_deepblue" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_deepblue" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Sky Blue 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp"> <com.google.android.material.button.MaterialButton android:id="@+id/button_skyblue" android:layout_width="35dp" android:layout_height="35dp" android:backgroundTint="@color/skyblue" android:insetTop="0dp" android:layout_gravity="center" android:insetBottom="0dp" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_skyblue" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_skyblue" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> <!-- Flame Red 按钮 --> <FrameLayout android:tag="button_container" android:layout_width="39dp" android:layout_height="39dp" android:layout_marginStart="18.4dp"> <com.google.android.material.button.MaterialButton android:id="@+id/button_flamered" android:layout_width="35dp" android:layout_height="35dp" android:backgroundTint="@color/flamered" android:insetTop="0dp" android:insetBottom="0dp" android:layout_gravity="center" app:cornerRadius="17.5dp" app:rippleColor="@android:color/transparent" app:strokeColor="@android:color/white" app:strokeWidth="1dp" /> <ImageView android:id="@+id/editicon_flamered" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center" android:src="@drawable/edit" android:visibility="gone" /> <View android:id="@+id/ring_flamered" android:layout_width="39dp" android:layout_height="39dp" android:layout_gravity="center" android:background="@drawable/ring_white" android:visibility="gone" /> </FrameLayout> </LinearLayout> <!--灯泡背景--> <ImageView android:id="@+id/imageView" android:layout_width="180dp" android:layout_height="244dp" android:layout_gravity="center_horizontal" android:layout_marginTop="207dp" android:src="@drawable/bulbbottom" /> <!--滑动图层--> <ImageView android:id="@+id/lampImageView" android:layout_width="180dp" android:layout_height="244dp" android:layout_gravity="center_horizontal" android:layout_marginTop="190dp" android:adjustViewBounds="true" android:scaleType="centerInside" android:src="@drawable/clip_bulb" /> <TextView android:id="@+id/percentText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="167dp" android:text="0%" android:textColor="#000" android:textSize="18sp" /> <!--灯泡底座--> <ImageView android:layout_width="180dp" android:layout_height="658dp" android:layout_gravity="center_horizontal" android:src="@drawable/bulbonbottom" /> <!--开关按钮--> <ImageButton android:id="@+id/switch_button" android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:layout_marginTop="476dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/switchselector" /> <!--隐藏栏开关--> <!-- <LinearLayout--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="60dp"--> <!-- android:gravity="center"--> <!-- android:orientation="vertical">--> <!-- <Button--> <!-- android:id="@+id/btn_bottom_sheet"--> <!-- android:layout_width="wrap_content"--> <!-- android:layout_height="wrap_content"--> <!-- android:layout_marginTop="32dp"--> <!-- android:text="BottomSheet"--> <!-- android:textAllCaps="false" />--> <!--隐藏toolbar--> <LinearLayout android:id="@+id/ll_bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" app:behavior_peekHeight="110dp" app:layout_behavior="@string/bottom_sheet_behavior"> <ImageView android:id="@+id/pull" android:layout_width="match_parent" android:layout_height="30dp" android:background="@color/white" android:clickable="false" android:focusable="false" android:gravity="center" android:paddingTop="15dp" android:src="@drawable/pullselector" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@color/white" android:gravity="center" android:text="c" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_dark" android:gravity="center" android:text="b" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_green_light" android:gravity="center" android:text="c" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_dark" android:gravity="center" android:text="b" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_light" android:gravity="center" android:text="c" android:textSize="20sp" /> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> 中 <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/background" android:visibility="gone" />没有正确显示
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值