修改Launcher

本文详细阐述了如何在Android系统中调整桌面布局,增加屏幕数量,并实现动态添加与删除屏幕的功能,同时提供了多种方法来定制桌面显示效果,包括添加快捷方式与热键,以及动态调整桌面组件。

1.左滑切换到显示所有apps

PageView.java->onTouchEvent->case MotionEvent.ACTION_UP->if (mTouchState == TOUCH_STATE_SCROLLING)->else { snapToDestination();->后添加

if(((isSignificantMove && deltaX > 0 && !isFling) ||
                            (isFling && velocityX > 0)) && mCurrentPage == 0)
                    {
                        snapToLeftDestination();
                    }

并在Workspace.java中重写函数

    protected void snapToLeftDestination() {
        mLauncher.showAllApps(true);
    }


2.静态添加屏幕和屏幕上的快捷键

http://blog.youkuaiyun.com/the01hierarch/article/details/7641521

android1.6的版本有3个屏 需要把它改为5个屏 需要修改的地方 如下 

1、Launcher.java

Java代码   收藏代码
  1. static final int SCREEN_COUNT = 5;  
  2. static final int DEFAULT_SCREN = 2;  


2、launcher.xml

Java代码   收藏代码
  1. <com.lp.launcher.Workspace  
  2.         android:id="@+id/workspace"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="fill_parent"  
  5.   
  6.         launcher:defaultScreen="2">//从0开始  
  7.   
  8.         <include android:id="@+id/cell1" layout="@layout/workspace_screen" />  
  9.         <include android:id="@+id/cell2" layout="@layout/workspace_screen" />  
  10.         <include android:id="@+id/cell3" layout="@layout/workspace_screen" />  
  11.         <include android:id="@+id/cell4" layout="@layout/workspace_screen" />  
  12.         <include android:id="@+id/cell5" layout="@layout/workspace_screen" />  
  13.   
  14. </com.lp.launcher.Workspace>  


defaultScreen 修改为2 然后 加两个<include />

然后 修改默认显示的屏 

3、Workspace.java

修改构造方法里面的
Java代码   收藏代码
  1. mDefaultScreen = a.getInt(R.styleable.Workspace_defaultScreen, 2);//从0开始  


这时 基本上已经可以显示5个屏幕了 默认的屏也是第三个屏了 但是进去后 默认显示的屏什么也没有 我们需要把组建都挪到默认屏上去

4、default_workspace.xml

修改所有的 launcher:screen 为 2  

Java代码   收藏代码
  1. launcher:screen="2"  


3.桌面最下方显示3个指定快捷方式

方法一:在launcher.xml中删除    

<include
        android:id="@+id/hotseat"
        android:layout_width="match_parent"
        android:layout_height="@dimen/button_bar_height_plus_padding"
        android:layout_gravity="bottom"
        layout="@layout/hotseat"/>

并添加相应的按钮

方法二:修改default_workspace.xml

方法三:如果是定死热键,不可改变的话不推荐

重写LauncherModel->loadWorkspace中获得的数据方法,其中sWorkspaceItems.add(info);就是添加快捷方式(包括桌面widget和下面的热键)

在Hotseat->resetLayout->删除mContent.addViewToCellLayout(allAppsButton, -1, 0, new CellLayout.LayoutParams(x,y,1,1), true);




4.动态添加屏幕

在launcher.java中添加两个按键事件---------之后可以将这两个按钮作为appwidget加到默认的桌面上,和launcher交互用动态(内部注册)广播

    public void addScreen(View view)
    {
        LayoutInflater  mInflater = LayoutInflater.from(this);
        CellLayout mCelllayout =(CellLayout)mInflater.inflate(R.layout.workspace_screen,null);
        mWorkspace.addView(mCelllayout);
        mWorkspace.requestLayout();
    }

    
    public void removeScreen(View view)
    {
        int currentPage = mWorkspace.getCurrentPage();
        int countPage = mWorkspace.getChildCount();
        if(countPage > 1)
        {
            if(currentPage == (countPage - 1))
            {
                currentPage--;
            }
            mWorkspace.removeViewAt(countPage - 1);
        }
        mWorkspace.requestLayout();
        mWorkspace.snapToPage(currentPage);
    }

<think> 我们正在讨论的是修改Launcher的方向(setRequestedOrientation)。根据引用[1]中的代码片段,我们看到在ActivityRecord中有一个设置方向的方法。但是,这个代码片段是在系统服务(可能是ActivityTaskManagerService)中修改某个Activity的方向。 对于Launcher来说,它是一个特殊的应用,通常由系统启动并管理。要修改Launcher的方向,我们需要知道Launcher的Activity。在Android中,我们可以通过以下方式修改一个Activity的方向: 1. 在AndroidManifest.xml中声明Activity的屏幕方向,例如: ```xml <activity android:name=".Launcher" android:screenOrientation="landscape" /> ``` 2. 在运行时通过调用Activity的`setRequestedOrientation`方法。例如,在Launcher的Activity代码中: ```java setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); ``` 但是,用户的问题可能是如何修改系统Launcher的方向,并且可能是在系统级进行修改(比如在系统服务中强制设置Launcher的方向)。从引用[1]中我们看到,系统服务中有一个方法可以设置Activity的方向,通过ActivityRecord的token(IBinder类型)来指定具体的Activity。 因此,要修改Launcher的方向,我们可以考虑以下两种方法: **方法一:修改Launcher应用的代码** 在Launcher的Activity(通常是LauncherActivity)中,在onCreate方法里设置方向: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // ... 其他初始化 } ``` **方法二:在系统服务中强制设置Launcher的方向(需要系统权限)** 类似于引用[1]中的代码,在系统服务(如ActivityTaskManagerService)中,找到Launcher对应的ActivityRecord,然后设置它的方向。但是,这种方法需要修改系统服务,并且需要知道如何识别Launcher的ActivityRecord。 在引用[1]的代码中,我们看到它通过一个IBinder token来获取ActivityRecord,然后设置方向。但是,我们如何获取Launcher的token呢?通常,系统启动Launcher时,我们可以通过监听 Activity 启动事件,或者通过PackageManager查询Launcher的Activity,然后获取它的token(这通常是系统内部管理的,不直接暴露给应用)。 实际上,在系统服务中,我们可以通过以下方式获取Launcher的ActivityRecord: - 系统服务中有一个RootWindowContainer,它管理所有的RootTask(也就是Activity栈),我们可以遍历所有的RootTask,然后找到Launcher的ActivityRecord。 但是,这种方法比较复杂,而且需要系统级别的修改权限。通常,在定制系统时才会使用。 **方法三:通过属性控制(如引用[1]中所示)** 引用[1]中的代码通过一个系统属性"persist.sys.force_land_enabled"来控制是否强制设置为横屏。我们可以类似地实现: ```java // 在系统服务中修改设置方向的方法 public void setRequestedOrientation(IBinder token, int requestedOrientation) { // ... 原有代码 if (SystemProperties.getInt("persist.sys.force_land_enabled", 1) == 1) { r.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); } else { r.setRequestedOrientation(requestedOrientation); } // ... } ``` 然后,我们可以通过设置系统属性来开关强制横屏: ``` adb shell setprop persist.sys.force_land_enabled 1 ``` 但是,这种方法会影响到所有调用`setRequestedOrientation`的Activity,包括Launcher。如果我们只想针对Launcher,那么我们需要在条件判断中加入对Activity包名或类名的判断。 例如,修改为: ```java if (SystemProperties.getInt("persist.sys.force_land_enabled", 1) == 1 && "com.android.launcher3".equals(r.packageName)) { r.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); } else { r.setRequestedOrientation(requestedOrientation); } ``` 这里,`r.packageName`就是当前Activity所在应用的包名,Launcher的包名通常是`com.android.launcher3`(也可能是其他,根据具体Launcher而定)。 **总结:** 根据用户的场景,如果是修改自己的Launcher(比如定制Launcher),那么修改Launcher的代码(方法一)即可。如果是系统级定制,希望强制所有Launcher都横屏(或者通过属性控制),那么可以在系统服务中修改(方法三)。 注意:方法二和三需要修改系统服务(ActivityTaskManagerService)并重新编译系统,适用于ROM开发者。 另外,在引用[2]中提到,也可以通过布局文件来控制,但这只是布局的排列方向(比如横向排列子视图),并不能改变整个Activity的方向(即屏幕旋转)。 所以,针对用户问题,我们有两种级别的修改方案:应用级和系统级。 下面给出应用级修改的步骤(方法一): 1. 打开Launcher的Activity类(例如`Launcher.java`)。 2. 在`onCreate`方法中调用`setRequestedOrientation`,传入需要的方向,如: ```java setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); ``` 系统级修改(方法三)步骤: 1. 在ActivityTaskManagerService中找到`setRequestedOrientation`方法(或类似的方法,不同的Android版本可能位置不同)。 2. 修改代码,在设置方向前判断当前Activity是否为Launcher,如果是且系统属性开启,则强制设置为横屏。 注意:系统级修改需要重新编译系统并刷机。 最后,根据用户的具体情况(是应用开发者还是系统开发者)选择合适的方法。 如果用户是系统开发者,那么可以参考引用[1]中的代码,但需要添加包名判断条件。 相关问题: 1. 如何在AndroidManifest.xml中设置Activity的方向? 2. 如何在系统服务中获取当前正在运行的Launcher的ActivityRecord? 3. 如何通过adb命令设置系统属性? </think> ### 修改 Launcher 方向 `setRequestedOrientation` 的方法 在 Android 系统中修改 Launcher 的屏幕方向,主要通过 `setRequestedOrientation()` 方法实现。以下是两种常用方法: --- #### **方法 1:在 Launcher 的 Activity 代码中修改** 在 Launcher 的主 Activity(如 `Launcher.java`)中直接调用 API: ```java // 强制设置为横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 或反向横屏(根据引用[1]的实现) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); ``` **关键点**: 1. 通常在 `onCreate()` 方法中调用 2. 方向常量包括: - `SCREEN_ORIENTATION_PORTRAIT`(竖屏) - `SCREEN_ORIENTATION_LANDSCAPE`(横屏) - `SCREEN_ORIENTATION_REVERSE_LANDSCAPE`(反向横屏) --- #### **方法 2:通过系统属性动态控制方向(系统级)** 参考引用[1]的实现逻辑,在系统服务层添加方向控制: ```java // 在系统服务(如 ActivityTaskManagerService)中修改 public void setRequestedOrientation(IBinder token, int requestedOrientation) { // ... [系统原有代码] if (SystemProperties.getInt("persist.sys.force_land_enabled", 0) == 1) { // 强制横屏模式 r.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); } else { // 使用默认设置 r.setRequestedOrientation(requestedOrientation); } // ... [系统原有代码] } ``` **操作步骤**: 1. 编译系统时添加此逻辑到 `ActivityTaskManagerService.java` 2. 通过 ADB 动态开关方向控制: ```bash adb shell setprop persist.sys.force_land_enabled 1 # 开启强制横屏 adb shell setprop persist.sys.force_land_enabled 0 # 关闭 ``` --- #### **补充方案:Manifest 静态配置** 在 `AndroidManifest.xml` 中声明默认方向: ```xml <activity android:name=".LauncherActivity" android:screenOrientation="landscape"> <!-- 或 reverseLandscape --> </activity> ``` > ⚠️ 此方式优先级低于代码动态设置,且无法运行时切换方向。 --- ### **方向选择建议** | 场景 | 推荐方法 | 灵活性 | |-------------------------------|-----------------------------|--------| | 定制 ROM 需动态控制方向 | 系统属性控制(方法 2)[^1] | 高 | | 普通 Launcher 应用开发 | Activity 代码设置(方法 1) | 中 | | 固定方向无需运行时切换 | Manifest 配置 | 低 | > **注意事项**: > 1. 系统级修改需要重新编译框架层代码 > 2. 横屏布局需配合 `res/layout-land` 目录(引用[2]) > 3. 使用 `REVERSE_LANDSCAPE` 需 API Level 18+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值