Android Launcher3修改行数,列数,布局等;隐藏HostSeat,使用户无法拖拽应用图标到Hotseat

修改Launcher的行列数比较简单,在DeviceProfile类的构造方法中,可以修改行数,列数等。但是更严格的话需要到DynamicGrid方法中,调用DeviceProfile该方法时根据屏幕大小,动态控制行列数。图标大小等也可以在这里更改。

如果需要实现隐藏hostseat,就把hostseat的图标设置为0,但是会有一个地方报错,到时候可以做一下错误处理就可以了。当hostseat的数量为0时,返回屏幕的宽就可以了。这里不再贴代码展示。

 DeviceProfile(String n, float w, float h, float r, float c,
                  float is, float its, float hs, float his, int dlId) {
        // Ensure that we have an odd number of hotseat items (since we need to place all apps)
        if (!LauncherAppState.isDisableAllApps() && hs % 2 == 0) {
            throw new RuntimeException("All Device Profiles must have an odd number of hotseat spaces");
        }

        name = n;
        minWidthDps = w;
        minHeightDps = h;
        numRows = r;
        //修改行数
        numRows=3;
        numColumns = c;
        //修改列数
        numColumns=6;

        iconSize = is;
        //修改图标大小
        iconSize=90;
        iconTextSize = its;
        //修改应用名字大小
//        iconTextSize=10;
        numHotseatIcons = hs;
        //修改hostseat图标数量
        numHotseatIcons=0;

        hotseatIconSize = his;
        defaultLayoutId = dlId;
    }

控制屏幕的布局则是通过layout方法去设置,由于代码繁多,这里选择性去贴代码讲解。

 

把hostseat的图标总数设为0后,用户就无法拖拽图标到这里了。要隐藏他的布局,可以通过设置他的高度,也可以通过其他布局,把它挣到屏幕外。如下是设置hostseat布局的代码

// Layout the hotseat
View hotseat = launcher.findViewById(R.id.hotseat);
lp = (FrameLayout.LayoutParams) hotseat.getLayoutParams();
if (hasVerticalBarLayout) {
    // Vertical hotseat
    lp.gravity = Gravity.END;
    lp.width = hotseatBarHeightPx;
    lp.height = LayoutParams.MATCH_PARENT;
    hotseat.findViewById(R.id.layout).setPadding(0, 2 * edgeMarginPx, 0, 2 * edgeMarginPx);
} else if (isTablet()) {
    // Pad the hotseat with the workspace padding calculated above
    lp.gravity = Gravity.BOTTOM;
    lp.width = LayoutParams.MATCH_PARENT;
    lp.height = hotseatBarHeightPx;
    hotseat.setPadding(edgeMarginPx + padding.left, 0,
            edgeMarginPx + padding.right,
            2 * edgeMarginPx);
} else {
    // For phones, layout the hotseat without any bottom margin
    // to ensure that we have space for the folders
    lp.gravity = Gravity.BOTTOM;
    lp.width = LayoutParams.MATCH_PARENT;
    lp.height = hotseatBarHeightPx;
    hotseat.findViewById(R.id.layout).setPadding(2 * edgeMarginPx, 0,
            2 * edgeMarginPx, 0);
}
hotseat.setLayoutParams(lp);

其他搜索栏,workspace,indicators,AllApps,Overview等的大小设置和launcher布局的控制都是在这里设置的

这里就相当于xml中的layout一样,控制屏幕的布局,只是换了一种写法。

Android中,Launcher(通常指桌面应用)允许用户应用程序的快捷方式从WorkSpace(工作区或主屏幕)拖动到HotSeat(热点区域),这通常是系统的启动器小部件或最近任务栏的行为。以下是实现这一功能的基本步骤: 1. **权限设置**:首先,在AndroidManifest.xml文件中添加`<uses-permission>`标签来请求读取外部存储和操作文件系统权限。 ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> ``` 2. **创建AppWidget Provider**:为了支持将图标拖放到热点区域,你需要创建一个AppWidget Provider,并在清单文件(AndroidManifest.xml)中声明它。 ```xml <receiver android:name=".YourWidgetProvider"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" /> </receiver> ``` 3. **处理drag and drop事件**:在Launcher Activity或者其子类中,你需要监听ACTION_DRAG_ENTERED、ACTION_DRAG_EXITED、ACTION_DRAG_STARTED和ACTION_DROP等ACTION相关的意图,以便在用户拖动图标时作出响应。 4. **添加拖放回调**:当ACTION_DROP意图触发时,解析Intent并检查数据,如果是图标文件,则可以将其移动到相应的位置。例如: ```java @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_DROP)) { // 获取drop的数据 ClipData clipData = intent.getClipData(); for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); Uri uri = item.getUri(); handleDrop(context, uri); // 处理拖放操作 } } } private void handleDrop(Context context, Uri uri) { // 将uri路径解码为文件路径,然后将图标移动到HotSeat指定位置 String filePath = getFilePathFromUri(uri); moveIconToHotSeat(filePath); } ``` 5. **文件管理和移动图标**:`getFilePathFromUri()` 和 `moveIconToHotSeat(filePath)` 需要你自己实现,通常涉及到读取文件内容、打成Apk或UninstallApk格式,并将其放置在热点区域对应的目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值