Android8.1 Launcher3 去掉抽屉方法
android8.1 launcher3 去掉抽屉方法
之前在如何把allapp放到workspace中,但是遗留了几个问题:
a.有app变化时,更新workspace;
b.隐藏allapp;
c.去掉长按时的删除选项。
这篇博客会解决这几个问题:
1:有app变化时,更新workspace
src/com/android/launcher3/model/packageupdatedtask.java -> execute():
...... final arraylist addedormodified = new arraylist<>(); addedormodified.addall(appslist.added); appslist.added.clear(); addedormodified.addall(appslist.modified); appslist.modified.clear(); //更新begin arraylist items = new arraylist<>(); synchronized (this) { for (appinfo ai : addedormodified) { intent data = ai.getintent(); data.putextra(intent.extra_shortcut_intent, data); data.putextra(intent.extra_shortcut_icon, ai.iconbitmap); data.putextra(intent.extra_shortcut_name, ai.title); installshortcutreceiver.pendinginstallshortcutinfo info = new installshortcutreceiver.pendinginstallshortcutinfo( data, ai.user, context); items.add(info); } } if (!items.isempty()) { app.getmodel().addandbindaddedworkspaceitems( new installshortcutreceiver.lazyshortcutsprovider(context.getapplicationcontext(), items)); } //更新end final arraylist removedapps = new arraylist<>(appslist.removed); appslist.removed.clear(); ......
2:隐藏allapp;
这里比较复杂,我用的方法简单粗暴;首先将展示allapp的地方注释
src/com/android/launcher3/launcher.java -> showappsview():
/** * shows the apps view. */ public void showappsview(boolean animated, boolean updatepredictedapps) { // markappsviewshown(); // if (updatepredictedapps) { //tryandupdatepredictedapps(); // } // showappsorwidgets(state.apps, animated); }
把方法内的代码全部注释;但是还没结束,因为这个时候你会发现在launcher中上滑还是能调出allapp的,于是又查看touch事件的调用地方,最终找到了是在allappstransitioncontroller.java这个类里面
src/com/android/launcher3/allapps/allappstransitioncontroller.java -> ondrag():
@override public boolean ondrag(float displacement, float velocity) { if (mappsview == null) { return false;// early termination. } mcontainervelocity = velocity; float shift = math.min(math.max(0, mshiftstart + displacement), mshiftrange); //把调用的地方注释 bengin // setprogress(shift / mshiftrange); //把调用的地方注释 end return true; }
做完这两步,allapp终于不出现了,但是这个时候还有问题,因为hotseat上面一点,还有有一个向上的箭头,并且在launcher的onresume状态时,hotseat和这个箭头会一起做一个向上跳动的动画;
这个肯定也是要去掉的,于是又去找动画的代码,用hierarchy view工具找到箭头的view是pageindicatorlinecaret.java,于是以这个为切入点,找了很久都没有找到地方,这个时候果断出去抽了根烟,抽烟的过程中猛然想起这个动画的效果应该是用bounceinterpolator来做的(这里装个13 ^_^),于是在代码中查找,发现在allappstransitioncontroller.java这个类中有showdiscoverybounce()这个方法
public void showdiscoverybounce() { // cancel existing animation in case user locked and unlocked at a super human speed. canceldiscoveryanimation(); // assumption is that this variable is always null mdiscobounceanimation = animatorinflater.loadanimator(mlauncher, r.animator.discovery_bounce); mdiscobounceanimation.addlistener(new animatorlisteneradapter() { @override public void onanimationstart(animator animator) { mistranslatewithoutworkspace = true; preparepull(true); } @override public void onanimationend(animator animator) { finishpulldown(); mdiscobounceanimation = null; mistranslatewithoutworkspace = false; } }); mdiscobounceanimation.settarget(this); mappsview.post(new runnable() { @override public void run() { if (mdiscobounceanimation == null) { return; } mdiscobounceanimation.start(); } }); }
查看调用的地方,是在
src/com/android/launcher3/launcher.java -> onresume():
将调用的地方注释:
...... if (shouldshowdiscoverybounce()) { //注释 begin //mallappscontroller.showdiscoverybounce(); //注释 end } if (mlaunchercallbacks != null) { mlaunchercallbacks.onresume(); } ......
最后把箭头去掉,因为调用地方比较多,我就直接把imageview的图片设置为空了
src/com/android/launcher3/pageindicators/pageindicatorlinecaret.java -> onfinishinflate()
@override protected void onfinishinflate() { super.onfinishinflate(); mallappshandle = (imageview) findviewbyid(r.id.all_apps_handle); //修改 begin // mallappshandle.setimagedrawable(getcaretdrawable()); mallappshandle.setimagedrawable(null); //修改 end mallappshandle.setonclicklistener(mlauncher); mallappshandle.setonfocuschangelistener(mlauncher.mfocushandler); mlauncher.setallappsbutton(mallappshandle); }
终于把这个搞定了!
3:去掉长按时的删除选项:
现在所有应用都已经在workspace中了,并且allapp也已经隐藏,但是长按workspace中的app会发现,可以 移除,这个肯定不是我们需要的,我们需要的是卸载
src/com/android/launcher3/deletedroptarget.java :
@override protected boolean supportsdrop(dragsource source, iteminfo info) { //添加判断 begin if (info instanceof shortcutinfo || info instanceof folderinfo) { return false; } //添加判断 end return true; }
下面这个看情况是否需要添加
src/com/android/launcher3/popup/popupcontainerwitharrow.java -> showforicon():
public static popupcontainerwitharrow showforicon(bubbletextview icon) { launcher launcher = launcher.getlauncher(icon.getcontext()); if (getopen(launcher) != null) { // there is already an items container open, so don't open this one. icon.clearfocus(); return null; } iteminfo iteminfo = (iteminfo) icon.gettag(); //修改类型 begin iteminfo.itemtype = launchersettings.favorites.item_type_application; //修改类型 end if (!deepshortcutmanager.supportsshortcuts(iteminfo)) { return null; } ...... }
到这里就基本可以了。
但是还有遗留问题:
a.hotseat中出现过的app在workspace仍然有;
b.hotseat可以创建文件夹。
推荐阅读
-
Android7.0开发实现Launcher3去掉应用抽屉的方法详解
-
Android7.0开发实现Launcher3去掉应用抽屉的方法详解
-
android 9.0 launcher3 去掉抽屉式显示所有 app(代码详解)
-
android 9.0 Launcher3 去掉抽屉式,显示所有 app
-
Android8.1 Launcher3 去掉抽屉方法
-
android10.0(Q) Launcher3 去掉抽屉
-
Android8.1去掉 Launcher3 默认给 icon 增加的APK图标白边
-
android 9.0 launcher3 去掉抽屉式显示所有 app(代码详解)
-
Android8.1 Launcher3 去掉抽屉方法
-
android 9.0 Launcher3 去掉抽屉式,显示所有 app