有空研究一下android 导航栏中的recent_app。
从资源文件下手,找到位于 frameworks\base\tools\layoutlib\bridge\src\com\android\layoutlib\bridge\bars的NavigationBar.java文件,这是一个linearlayout的子类,setBackgroundColor(0xFF000000);这个设置导航栏背景为黑色。
loadIcon就是导入图片的地方,根据linearlayout方向来确定back和recent 的位置。
loadicon定义在frameworks\base\tools\layoutlib\bridge\src\com\android\layoutlib\bridge\bars的CustomBar.java通过
Bridge.setCachedBitmap 或者imageView.setImageDrawable(drawable)来导入图片资源。
具体的点击事件在(frameworks\base\packages\systemui\src\com\android\systemui\recent) 的RecentsPanelView.java文件中。一个TaskDescriptionAdapter来匹配view。
TaskDescriptionAdapter中有 getcount,getItem,getItemID,createView,getView方法。
点击一个item的动作handleOnClick(View view)中处理
if (ad.taskId >= 0) {
// This is an active task; it should just go to the foreground.
am.moveTaskToFront(ad.taskId, ActivityManager.MOVE_TASK_WITH_HOME,
opts);
点击其中一项,就打开相应的activity。
长按item动作会弹出个删除和一个详细信息在handleLongPress(,,)方法中;
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.recent_remove_item) {
mRecentsContainer.removeViewInLayout(selectedView);
} else if (item.getItemId() == R.id.recent_inspect_item) {
ViewHolder viewHolder = (ViewHolder) selectedView.getTag();
if (viewHolder != null) {
final TaskDescription ad = viewHolder.taskDescription;
startApplicationDetailsActivity(ad.packageName);
show(false);
} else {
throw new IllegalStateException("Oops, no tag on view " + selectedView);
}
} else {
return false;
}
return true;
}
});
popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
public void onDismiss(PopupMenu menu) {
thumbnailView.setSelected(false);
mPopup = null;
}
});
popup.show();
这个界面其实一个activity。代码在RecentsActivity.java 中,如果要修改他的布局,修改onCreate()函数的setContentView(R.layout.status_bar_recent_panel)的布局文件。
RecentsActivity.java这个函数就是整个recent界面的相关的类。而RecentsPanelView.java就是单个项相关的类。