欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android8.1 Launcher3 去掉抽屉方法

程序员文章站 2022-05-03 13:34:03
android8.1 launcher3 去掉抽屉方法 之前在如何把allapp放到workspace中,但是遗留了几个问题: a.有app变化时,更新workspace; b.隐藏allapp;...

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可以创建文件夹。