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
{
}
點(diǎn)擊桌面圖標(biāo):
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
<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進(jìn)入主菜單
刪除應(yīng)用圖標(biāo)或卸載應(yīng)用程序
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中間主菜單那個(gè)按鈕:
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)
{
}
//在主桌面長按圖標(biāo)
//Launcher.java
public boolean onLongClick(View v)
{
}
/** The different states thatLauncher can be in. */
private enum State
{
NONE, WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED
};
WORKSPACE:主桌面
APPS_CUSTOMIZE:應(yīng)用列表APP_LIST
APPS_CUSTOMIZE_SPRING_LOADED:在應(yīng)用列表中長按應(yīng)用圖標(biāo)
E:\work\android\凱斯達(dá)\20160511\Px4_Native_Launcher\res\layout\workspace_screen.xml
<com.android.launcher3.CellLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/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"http://ICON的寬
launcher:cellHeight="@dimen/workspace_cell_height"http://ICON的高
launcher:widthGap="@dimen/workspace_width_gap"http://ICON之間的水平間隔
launcher:heightGap="@dimen/workspace_height_gap"http://ICON之間的垂直間隔
launcher:maxGap="@dimen/workspace_max_gap" />
E:\work\android\凱斯達(dá)\20160511\Px4_Native_Launcher\src\com\android\launcher3\Utilities.java
static Bitmap createIconBitmap(Drawable icon, Context context)
{
final boolean icon_add_bg = false; //added byzyc 20150120
//給ICON加背景圖
if (icon_add_bg)
{
// draw a big box for the icon for debugging
DrawablebgDrawable = context.getResources().getDrawable(sBgIcons[sBgIconIndex]);
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>
<!-- <itemname="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>
<!-- <itemname="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 CacheEntrycacheLocked(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;
}
//修改顯示圖標(biāo) 默認(rèn)圖標(biāo)
private BitmapDrawableRegetBitmap(ComponentName cn)
{
ComponentNamecName = cn;
String strPName = cName.getPackageName();
String strClsName = cName.getClassName();
BitmapDrawable draw=null;
//設(shè)置
if (strPName.equals("com.android.settings")
&&strClsName.equals("com.android.settings.Settings"))
{
draw = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.kaisida_main_settings);
}
//藍(lán)牙
if (strPName.equals("com.AnywheeBt")
&&strClsName.equals("com.AnywheeBt.MainActivity"))
{
draw = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.kaisida_main_bt);
}
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 byzyc 20150120
if (icon_add_bg) {
// draw a big box for the icon for debugging
DrawablebgDrawable = context.getResources().getDrawable(sBgIcons[sBgIconIndex]);
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>
<itemname="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>
<itemname="android:minWidth">@dimen/kaisida_main_menu_title_bg_width</item>
<item name="android:marqueeRepeatLimit">2</item>
</style>
2016-6-23
// Workspace的繼承關(guān)系:
ViewGroup - PagedView – SmoothPagedView – Workspace
private void loadAllAppsByBatch()
{
//只有這兩個(gè)標(biāo)記,才需要app圖標(biāo)顯示在所有程序列表 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處理主桌面布局,主桌面每一頁就是一個(gè)cell,如cell1,cell2,cell3等,就是代表第一到第三頁。主桌面的最下面一排的hotset也是在這里
主桌面自定義的控件(如第一頁的時(shí)鐘天氣等控件)是在這里處理:
E:\work\android\RK_Common_UI\Code\Px4_Native_Launcher\res\layout\custom_appwidget_kaisida.xml
全部應(yīng)用列表ALLAPP, ICON圖標(biāo)和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圖標(biāo)和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 bindingsynchronously, and
// everything else that is to be bound normally (asynchronously).
bindWorkspace(synchronousBindPage);
// XXX: For now, continue posting the binding of AllApps as there are otherissues 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
public void bindAllApplications(final ArrayList<ApplicationInfo> apps)
{
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 zyc20160127
if (mApps != null) {
for (int i = 0; i < NeedHideAppsPkgNames.length; i++)
{
StringneedHideAppPkgStr = NeedHideAppsPkgNames[i];
for (int j = 0; j < mApps.size(); j++)
{
ApplicationInfoinfo = mApps.get(j);
if (info.componentName.getPackageName().equalsIgnoreCase(needHideAppPkgStr))
{
mApps.remove(info);
}
}
}
}
//****************************************************/
Collections.sort(mApps, LauncherModel.getAppNameComparator());
updatePageCounts();
invalidateOnDataChange();
}
聯(lián)系客服