http://blog.csdn.net/AwayEagle/article/details/50223521
http://blog.csdn.net/wds1181977/article/details/42456441
http://blog.csdn.net/sdjzyuxinburen/article/details/49825449
http://blog.csdn.net/gf771115/article/details/8152837
//Launcher初始化――LauncherApplication public class LauncherApplication extends Application { }
点击桌面图标:
E:\8317\AC8317_新公版界面_及客户定制界面\AC8317_new\AC8317_Tuobu \AC8317_Native_Launcher\src\com\android\launcher3\Launcher.java
public void onClick(View v){}
public void funcLauncherSetting() { Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN"); intent.addCategory("android.intent.category.LAUNCHER"); intent.setComponent( new ComponentName("com.android.settings", "com.android.settings.SettingMainActivity")); //intent.setComponent( new ComponentName("com.android.settings",
"com.android.settings.Settings")); mContext.startActivity(intent); }
dimens.xml //修改桌面ICON大小: app_icon_size
<resources> <dimen name="app_icon_size">110dp</dimen><!-- 64dp --> <dimen name="reveal_radius">80dp</dimen><!-- 64dp --> <dimen name="app_icon_drawable_padding">3dp</dimen> <dimen name="app_icon_padding_top">4dp</dimen>
//修改ICON与文字之间的距离 <!-- Workspace cell size
--> <dimen name="workspace_cell_width_land">140dp</dimen> <dimen name="workspace_cell_width_port">96dp</dimen> <dimen name="workspace_cell_height_land">160dp</dimen> <dimen name="workspace_cell_height_port">96dp</dimen> <dimen name="workspace_width_gap_land">10dp</dimen> <dimen name="workspace_width_gap_port">10dp</dimen> <dimen name="workspace_height_gap_land">20dp</dimen> <dimen name="workspace_height_gap_port">24dp</dimen> <dimen name="workspace_bottom_padding_land">128dp</dimen><!-- 0dp --> <dimen name="workspace_icon_text_size">18dp</dimen>
Workspace.java桌面 AppsCustomizePagedView.java进入主菜单
删除应用图标或卸载应用程序 onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success)
安装APK后,AllAppsList.java public void addPackage(Context context, String packageName) { final List<ResolveInfo> matches = findActivitiesForPackage(context, packageName);
if (matches.size() > 0) { for (ResolveInfo info : matches) { add(new ApplicationInfo(context.getPackageManager(), info, mIconCache, null)); } } }
Hotseat中间主菜单那个按钮: Hotseat.java void resetLayout() { allAppsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(android.view.View v) { } } }
void showWorkspace(boolean animated, Runnable onCompleteRunnable) { } public void showAllApps(boolean animated) { }
//在主桌面长按图标 //Launcher.java public boolean onLongClick(View v) { }
/** The different states that
Launcher can be in. */ private enum State { NONE, WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED }; WORKSPACE:主桌面 APPS_CUSTOMIZE:应用列表APP_LIST APPS_CUSTOMIZE_SPRING_LOADED:在应用列表中长按应用图标
E:\work\android\凯斯达\20160511\Px4_Native_Launcher\res\layout\workspace_screen.xml
<com.android.launcher3.CellLayout xmlns:android="http://schemas./apk/res/android" xmlns:launcher="http://schemas./apk/res/com.android.launcher3" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/cell_layout_left_padding" android:paddingRight="@dimen/cell_layout_right_padding" android:paddingTop="3dip" android:layout_marginBottom="-1dip" android:hapticFeedbackEnabled="false" launcher:cellWidth="@dimen/workspace_cell_width"//ICON的宽 launcher:cellHeight="@dimen/workspace_cell_height"//ICON的高 launcher:widthGap="@dimen/workspace_width_gap"//ICON之间的水平间隔 launcher:heightGap="@dimen/workspace_height_gap"//ICON之间的垂直间隔 launcher:maxGap="@dimen/workspace_max_gap" />
E:\work\android\凯斯达\20160511\Px4_Native_Launcher\src\com\android\launcher3\Utilities.java static Bitmap createIconBitmap(Drawable icon, Context context) { final boolean icon_add_bg = false; //added by
zyc 20150120 //给ICON加背景图 if (icon_add_bg) { // draw a big box for the icon for debugging Drawable
bgDrawable = context.getResources(). bgDrawable.setBounds(0, 0, sIconTextureWidth, sIconTextureHeight); if (++sBgIconIndex >= sBgIcons.length) sBgIconIndex = 0; bgDrawable.draw(canvas); }
sOldBounds.set(icon.getBounds()); //icon的大小 //icon.setBounds(left+10, top+14, left+width-12, top+height-14); icon.setBounds(left, top, left+width, top+height); icon.draw(canvas); icon.setBounds(sOldBounds); canvas.setBitmap(null); }
<style name="KaisidaMainMenuItemTextViewStyle"> <item name="android:layout_width">@dimen/kaisida_main_menu_title_bg_width</item> <item name="android:layout_height">@dimen/kaisida_main_menu_title_bg_height</item> <item name="android:textColor">#FFFFFFFF</item> <item name="android:textSize">@dimen/kaisida_main_menu_title_bg_textsize</item> <!-- <item
name="android:background">@drawable/kaisida_main_menu_title_bg</item>
--> <item name="android:gravity">top|center</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">marquee</item> <item name="android:marqueeRepeatLimit">2</item> </style> <style name="KaisidaOrigMainMenuItemTextViewStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">@dimen/kaisida_main_menu_title_bg_height</item> <item name="android:textColor">#FFFFFFFF</item> <item name="android:textSize">@dimen/kaisida_main_menu_title_bg_textsize</item> <!-- <item
name="android:background">@drawable/kaisida_main_menu_title_bg</item>
--> <item name="android:gravity">top|center</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">marquee</item> <item name="android:paddingStart">7dip</item> <item name="android:paddingEnd">7dip</item> <item name="android:minWidth">@dimen/kaisida_main_menu_title_bg_width</item> <item name="android:marqueeRepeatLimit">2</item> </style>
//修改第三方软件的ICON E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3\IconCache.java
private CacheEntry
cacheLocked(ComponentName componentName, ResolveInfo info, HashMap<Object, CharSequence>
labelCache) { CacheEntry entry = mCache.get(componentName); if (entry == null) { entry = new CacheEntry();
mCache.put(componentName, entry);
ComponentName key = LauncherModel.getComponentNameFromResolveInfo(info); if (labelCache != null && labelCache.containsKey(key)) { entry.title = labelCache.get(key).toString(); } else { entry.title = info.loadLabel(mPackageManager).toString(); if (labelCache != null) { labelCache.put(key, entry.title); } } if (entry.title == null) { entry.title = info.activityInfo.name; }
BitmapDrawable bitmapDrawable = RegetBitmap(componentName); entry.icon = Utilities.createIconBitmap( getFullResIcon(info), mContext, bitmapDrawable);
/* entry.icon =
Utilities.createIconBitmap( getFullResIcon(info),
mContext);*/ } return entry; }
//修改显示图标 默认图标 private BitmapDrawable
RegetBitmap(ComponentName cn) { ComponentName
cName = cn; String strPName = cName.getPackageName(); String strClsName = cName.getClassName(); BitmapDrawable draw=null;
//设置 if (strPName.equals("com.android.settings") &&strClsName.equals("com.android.settings.Settings")) { draw = (BitmapDrawable)mContext.getResources(). } //蓝牙 if (strPName.equals("com.AnywheeBt") &&strClsName.equals("com.AnywheeBt.MainActivity")) { draw = (BitmapDrawable)mContext.getResources(). }
return draw!=null?draw:null; }
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \Utilities.java static Bitmap createIconBitmap(Drawable icon, Context context, Drawable iconbackground)
{ final boolean icon_add_bg = false; //added by
zyc 20150120 if (icon_add_bg) { // draw a big box for the icon for debugging Drawable
bgDrawable = context.getResources(). bgDrawable.setBounds(0, 0, sIconTextureWidth, sIconTextureHeight); if (++sBgIconIndex >= sBgIcons.length) sBgIconIndex = 0; bgDrawable.draw(canvas); } if (iconbackground!=null) { iconbackground.setBounds(0,
0, sIconTextureWidth, sIconTextureHeight); iconbackground.draw(canvas); canvas.setBitmap(null); return bitmap; } sOldBounds.set(icon.getBounds()); //icon.setBounds(left+10, top+14, left+width-12, top+height-14); icon.setBounds(left, top, left+width, top+height); icon.draw(canvas); icon.setBounds(sOldBounds); canvas.setBitmap(null);
return bitmap; }
修改桌面ICON文字大小 E:\work\android\RK_Common_UI\20160615Code\Px4_Native_Launcher\res\values\styles.xml
<style name="KaisidaOrigMainMenuItemTextViewStyle">
<item name="android:layout_width">140px</item>
<item name="android:layout_height">@dimen/kaisida_main_menu_title_bg_height</item>
<item name="android:textColor">#FFFFFFFF</item>
<item
name="android:textSize">@dimen/kaisida_main_menu_title_bg_textsize</item>
<item name="android:gravity">top|center</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">marquee</item>
<item name="android:paddingStart">7dip</item>
<item name="android:paddingEnd">7dip</item>
<item
name="android:minWidth">@dimen/kaisida_main_menu_title_bg_width</item>
<item name="android:marqueeRepeatLimit">2</item>
</style>
2016-6-23
// Workspace的继承关系: ViewGroup - PagedView – SmoothPagedView – Workspace
private void loadAllAppsByBatch() { //只有这两个标记,才需要app图标显示在所有程序列表 OWL final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); }
2016-6-27
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\res\layout\launcher.xml <com.oklcom4.launcher3.Workspace
android:id="@+id/workspace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="20dp"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:layout_marginTop="-5dp"
launcher:cellCountX="@integer/cell_count_x"
launcher:cellCountY="@integer/cell_count_y"
launcher:defaultScreen="0"
launcher:pageSpacing="@dimen/workspace_page_spacing" launcher:scrollIndicatorPaddingLeft="12dp"
launcher:scrollIndicatorPaddingRight="12dp"
>
<include android:id="@+id/cell1" layout="@layout/workspace_screen0"
/> <include
android:id="@+id/cell2" layout="@layout/workspace_screen1"
/> <!-- <include
android:id="@+id/cell3"
layout="@layout/workspace_screen" /> <include android:id="@+id/cell4"
layout="@layout/workspace_screen" /> <include
android:id="@+id/cell5"
layout="@layout/workspace_screen" /> --> </com.oklcom4.launcher3.Workspace> <include
android:id="@+id/hotseat"
android:layout_width="match_parent"
android:layout_height="@dimen/button_bar_height"
android:layout_gravity="bottom"
layout="@layout/hotseat" android:visibility="invisible"/>
由launcher处理主桌面布局,主桌面每一页就是一个cell,如cell1,cell2,cell3等,就是代表第一到第三页。主桌面的最下面一排的hotset也是在这里
主桌面自定义的控件(如第一页的时钟天气等控件)是在这里处理: E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\res\layout\custom_appwidget_kaisida.xml
全部应用列表ALLAPP, ICON图标和ICON文字的配置文件: E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\res\layout \apps_customize_application_kaisida.xml
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \AppsCustomizePagedView.java public void syncAppsPageItems(int page, boolean immediate) { PagedViewIcon icon; icon = (PagedViewIcon) mLayoutInflater.inflate( R.layout.apps_customize_application_kaisida, layout, false); }
主桌面 ICON图标和ICON文字的配置文件: E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\res\layout\application_kaisida.xml
android:layout_gravity="center_horizontal|top" android:layout_gravity="center_horizontal|center" android:layout_gravity="center_horizontal|bottom"
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \Workspace.java void addApplicationShortcut(ShortcutInfo info, CellLayout target, long container, int screen, int cellX, int cellY, boolean insertAtFirst, int intersectX, int intersectY) { View view;
view = mLauncher.createShortcut(R.layout.application_kaisida, target, (ShortcutInfo) info); }
2016-6-28 E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \Launcher.java @Override protected void onCreate(Bundle savedInstanceState) { mModel.startLoader(true, mWorkspace.getCurrentPage()); } E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \LauncherModel.java public void startLoader(boolean isLaunching, int synchronousBindPage) { synchronized (mLock) { if (synchronousBindPage > -1 && mAllAppsLoaded && mWorkspaceLoaded) { mLoaderTask.runBindSynchronousPage(synchronousBindPage); } else { sWorkerThread.setPriority(Thread.NORM_PRIORITY); sWorker.post(mLoaderTask); } } } } void runBindSynchronousPage(int synchronousBindPage) { // Divide the set of loaded items into those that we are binding
synchronously, and // everything else that is to be bound normally (asynchronously). bindWorkspace(synchronousBindPage); // XXX: For now, continue posting the binding of AllApps as there are other
issues that // arise from that. onlyBindAllApps(); } private void onlyBindAllApps() { callbacks.bindAllApplications(list); }
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \Launcher.java { Runnable setAllAppsRunnable = new Runnable() { public void run() { if (mAppsCustomizeContent != null) { mAppsCustomizeContent.setApps(apps); } } }; E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\src\com\oklcom4\launcher3 \AppsCustomizePagedView.java public void setApps(ArrayList<ApplicationInfo> list) { mApps = list; //delete the hide apps pkg here //added by zyc
20160127 if (mApps != null) { for (int i = 0; i < NeedHideAppsPkgNames.length; i++) { String
needHideAppPkgStr = NeedHideAppsPkgNames[i]; for (int j = 0; j < mApps.size(); j++) { ApplicationInfo
info = mApps.get(j); if (info.componentName.getPackageName().equalsIgnoreCase(needHideAppPkgStr)) { mApps.remove(info); } } } } //****************************************************/ Collections.sort(mApps, LauncherModel.getAppNameComparator()); updatePageCounts(); invalidateOnDataChange(); } |
|
来自: lhzstudio > 《android笔记》