安卓壁纸排行榜纸

3289人阅读
一、主要文件和类
1.Launcher.java:launcher中主要的activity。
2.DragLayer.java:launcher layout的rootview。DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步处理然后按情况分发下去,角色是一个controller。它首先用onInterceptTouchEvent(MotionEvent)来拦截所有的touch事件,如果是长按item拖动的话不把事件传下去,直接交由onTouchEvent()处理,这样就可以实现item的移动了,如果不是拖动item的话就把事件传到目标view,交有目标view的事件处理函数做相应处理。如过有要对事件的特殊需求的话可以修改onInterceptTouchEvent(MotionEvent)来实现所需要的功能。
3. DragController.java:为Drag定义的一个接口。包含一个接口,两个方法和两个静态常量。接口为DragListener(包含onDragStart(),onDragEnd()两个函数),onDragStart()是在刚开始拖动的时候被调用,onDragEnd()是在拖动完成时被调用。在launcher中典型的应用是DeleteZone,在长按拖动item时调用onDragStart()显示,在拖动结束的时候onDragEnd()隐藏。两个函数包括startDrag()和setDragItemInfo().startDrag()用于在拖动是传递要拖动的item的信息以及拖动的方式,setDragItemInfo()用于传递item的参数信息(包括位置以及大小)。两个常量为DRAG_ACTION_MOVE,DRAG_ACTION_COPY来标识拖动的方式,DRAG_ACTION_MOVE为移动,表示在拖动的时候需要删除原来的item,DRAG_ACTION_COPY为复制型的拖动,表示保留被拖动的item。
4.LauncherModel.java:辅助的文件。里面有许多封装的对数据库的操作。包含几个线程,其中最主要的是ApplicationsLoader和DesktopItemsLoader。ApplicationsLoader在加载所有应用程序时使用,DesktopItemsLoader在加载workspace的时候使用。其他的函数就是对数据库的封装,比如在删除,替换,添加程序的时候做更新数据库和UI的工作。
5.Workspace.java:抽象的桌面。由N个celllaout组成,从cellLayout更高一级的层面上对事件的处理。
6.LauncherProvider.java:launcher的数据库,里面存储了桌面的item的信息。在创建数据库的时候会loadFavorites(db)方法,loadFavorites()会解析xml目录下的default_workspace.xml文件,把其中的内容读出来写到数据库中,这样就做到了桌面的预制。
7.CellLayout.java:组成workspace的view,继承自viewgroup,既是一个dragSource,又是一个dropTarget,可以将它里面的item拖出去,也可以容纳拖动过来的item。在workspace_screen里面定了一些它的view参数。
8.ItemInfo.java:对item的抽象,所有类型item的父类,item包含的属性有id(标识item的id),cellX(在横向位置上的位置,从0开始),cellY(在纵向位置上的位置,从0开始)&,spanX(在横向位置上所占的单位格),spanY(在纵向位置上所占的单位格),screen(在workspace的第几屏,从0开始),itemType(item的类型,有widget,search,application等),container(item所在的)。
9.UserFolder.java:&用户创建的文件夹。可以将item拖进文件夹,单击时打开文件夹,长按文件夹上面标题处可以重命名文件夹。
10.LiveFolder.java:系统自带的文件夹。从系统中创建出的如联系人的文件夹等。
11.DeleteZone:删除框。在平时是出于隐藏状态,在将item长按拖动的时候会显示出来,如果将item拖动到删除框位置时会删除item。DeleteZone实现了DropTarget和DragListener两个接口。
12.LauncherSettings.java:字符串的定义。数据库项的字符串定义,另外在这里定义了container的类型,还有itemType的定义,除此还有一些特殊的widget(如search,clock的定义等)的类型定义。
二、主要模块
1.界面模型:
Launcher的界面的rootview是DragLayer,它是一个FrameLayout,在它上面workspace(应该说是celllayout)占了绝大部分的空间,celllayout的参数文件是workspace_screen.xml。workspace既是一个DropTarget又是一个DragSource,可以从AllAppGridView中拖出应用程序放在它上面,也可以把它里面的item拖走删除或者拖到bottomabr里面去。
2.Drop& Drag模型:
&&&&&&&&&DragSource:可以拖动的对象来源的容器,在launcher中主要有AllAppGridView,workspace等。
&&&&&&&&&&&&&&&&&&&void onDropCompleted(View target, boolean success,int x,int y);
DropTarget:可以放置被拖动的对象的容器。在launcher中有folder,workspace,bottombar等,一个View既可以是Dragsource也可以是DropTarget。主要包含以下几个接口:
boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
acceptDrop函数用来判断dropTarget是否可以接受item放置在自己里面。
&&&void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
&&&&&&&&&&onDragEnter是item被拖动进入到一个dropTarget的时候的回调。
&&&void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
&&&&&&&&&&onDragOver是item在上一次位置和这一次位置所处的dropTarget相同的时候的回调。
&&&void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
&&&&&&&&&&onDragExit是item被拖出dropTarget时的回调。
boolean onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
&&&&&onDrop是item被放置到dropTarget时的回调。&
函数的调用模式为:
DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
if&(dropTarget !=&null) {
&&&&&&&&&&&&&&/**
&&&&&&&&&&&&&&&*&当这一次的&target&跟上一次相同时,根据坐标来移动item
&&&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&if&(mLastDropTarget&== dropTarget) {
&&&&&&&&&&&&&&&&&&&&dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],
&&&&&&&&&&&&&&&&&&&&&&&&(int)&mTouchOffsetX, (int)&mTouchOffsetY,&mDragInfo);
&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&/**
&&&&&&&&&&&&&&&&&*&当上一次的位置跟这一次不同而且上一次的位置不为空,说明item移&&&&&&&&&&&*动出了,将上次的&View根据上次的坐标重新排列,并根据当前坐标重排*当前的*/
&&&&&&&&&&&&&&&&&&&&if&(mLastDropTarget&!=&null) {
&&&&&&&&&&&&&&&&&&&&&&&&mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(int)&mTouchOffsetX, (int)&mTouchOffsetY,&mDragInfo);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&dropTarget.onDragEnter(mDragSource, coordinates[0], coordinates[1],
&&&&&&&&&&&&&&&&&&&&&&&&(int)&mTouchOffsetX, (int)&mTouchOffsetY,&mDragInfo);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}&else&{//如果这一次为&null ,上一次不为&null ,那么把上一次坐标位置的&cell&去掉
&&&&&&&&&&&&&&&&if&(mLastDropTarget&!=&null) {
&&&&&&&&&&&&&&&&&&&&mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
&&&&&&&&&&&&&&&&&&&&&&&&&&&&(int)&mTouchOffsetX, (int)&mTouchOffsetY,&mDragInfo);
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&//记录上次的droptarget
&&&&&&&&&&&&mLastDropTarget&= dropT
3.Touch event总结:
&&&&&&&&&&&&&&&&&&&由于launcher的事件比较多比较复杂,所以在事件处理的时候一般采用rootview先用onInterceptTouchEvent(MotionEvent)拦截所有的touch事件,经过判断后分发给childview。
判断的规则如下:
&&&&&&&&a.down事件首先会传递到onInterceptTouchEvent()方法
&&&&&&&b.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
&&&&&&&c.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
&&&&&&&d.如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
&&&&&&&e.如果最终需要处理事件的view&的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
三、几种问题的解决方式
1.将所有的应用都排列在桌面上
&&&&&&&&&将所有的应用都排列在桌面是通过首先创建一个三维的boolean型全局数组来记录item的排列情况,第一维是屏数,第二维是纵向上的排列情况,第三维是横向的排列情况,如果那个位置被item所占用就标记为1,否则标记为0.在启动时把全局数组初始化为0,然后在添加的时候把相应的位置置1.凡是涉及到workspace上item的变化,比如移动、添加、删除操作时都需要维护数组,保持数组的正确性,因为在安装新程序时依据数组的状态去判断把item加到什么位置。
2.动态增加屏幕
动态增加屏幕是通过worksapce .addchild(view)的方式实现。基本思路是:首先预先规定所允许的最大的屏幕数,然后在需要增加屏幕而且当前屏幕数没有超过最大屏幕数的时候通过(CellLayout)mInflater.inflate(R.layout.workspace_screen,null)创建一个celllayout实例出来,然后通过addchild把它加入进去。在屏幕上的item被删除时通过从最后一屏起判断屏幕上是否有item,如果有的话保留,没有的话则删除最后一屏,以此类推。
3.预制桌面
&&&&&&&&&a.添加普通的应用程序快捷方式:
&&&&&&&&&在../res/xml下的default_workspace.xml文件中加入默认要放置的普通的应用程序。加入的格式为:
launcher:packageName=&... &&&&&//应用的packageName&&
launcher:className=&... &&&&&&&//应用启动时的第一个activity&
launcher:screen=&...&&&&&&&&&&//放置在第几屏(放在workspace的时候需要,从0开始,0为第一屏,1为第二屏,以此类推...)
launcher:x=&...&&&&&&&&&&&&&&&&//放置x方向的位置(在列中的位置)
launcher:y=&...& /&&&&&&&&&&&&//放置y方向的位置(在行中的位置)
packageName和className可以通过点击程序,然后在打印出的log中找到comp={...},例如如下信息:
comp={com.estrongs.android.taskmanager/com.estrongs.android.taskmanager.TaskManager}。其中com.estrongs.android.taskmanager为packageName, com.estrongs.android.taskmanager.TaskManager为className。
workspace的布局如下:
&&&&&&&&&b.添加widget:
&&&&&&&&&在../package/apps/VLauncher/res/xml下的default_workspace.xml文件中加入默认要放置的普通的应用程序。加入的格式为:
launcher:packageName=&...&&&&&&&&//widget的packageName
launcher:className=& ...&&&&&&&&//实现&widget的&receiver&类的名称.
&&&&launcher:container=&...&&&&&&&&&//放置的位置(只能为desktop)
&&&&&&&&launcher:screen=&...&&&&&&&&&//放置在第几屏上
&&&&&&&&launcher:x=&...&&&&&&&&&&&&&&&//放置的x位置
&&&&&&&&launcher:y=&...&&&&&&&&&&&&&&&//放置的y位置
&&&&&&&&launcher:spanx=&...&&&&&&&&&&//在x方向上所占格数
&&&&&&&&launcher:spany=&...&/&&&&&&&&//在y方向上所占格数
例如,要在第3屏的第一行第二列放置开始放置一个x方向上占两个单位格,y方向上占两个单位格的时钟,可以加入以下代码:
&appwidget
launcher:packageName=&com.android.alarmclock&&&&&&&launcher:className=&com.android.alarmclock.AnalogAppWidgetProvider&
&&&&&&&&launcher:container=&desktop&
&&&&&&&&launcher:screen=&2&
&&&&&&&&launcher:x=&1&
&&&&&&&&launcher:y=&0&
&&&&&&&&launcher:spanx=&2&
&&&&&&&&launcher:spany=&2&/&&
4.改变主界面的排列方式
&&&&&&&&&要修改桌面的排列方式,如下,先根据横竖屏设置修改workspace_screen.xml里shortAxisCells和longAxisCells的参数,然后在Launcher.java中修改NUMBER_CELLS_X和NUMBER_CELLS_Y的值,在2.3版本中刚开始往数据库中添加item的时候会去判断,如果不修改NUMBER_CELLS_X和NUMBER_CELLS_Y的话会导致一部分的item显示不出来,导致预制apk的失败。
5.增加worksapce上的屏数
&&&&&&&&&要增加屏数,首先在根据横竖屏在launcher.xml中的&com.android.launcher.Workspace&中删除或增加&&include android:id=&@+id/cellN& layout=&@layout/workspace_screen& /&,然后在Launcher.java中修改SCREEN_COUNT的值即可。
四、xml文件
&&&&&&&1.workspace_screen.xml
&&&&&&&&&&&&&&launcher:cellWidth=&95dip&
&&&&&&&&&&&cell(即item)的宽
&&&&&&&&launcher:cellHeight=&93dip&
&&&&&&&&&&&cell(即item)的宽
&&&&&&&&launcher:longAxisStartPadding=&25dip&
较长(屏幕的宽和高中较大的那一方向,根据横竖屏方向有所不同)方向上距离起点的像素数
&&&&&&&&launcher:longAxisEndPadding=&55dip&
较长(屏幕的宽和高中较大的那一方向,根据横竖屏方向有所不同)方向上距离终点的像素数
&&&&&&&&launcher:shortAxisStartPadding=&20dip&
较短(屏幕的宽和高中较大的那一方向,根据横竖屏方向有所不同)方向上距离起点的像素数
&&&&&&&&launcher:shortAxisEndPadding=&120dip&
较短(屏幕的宽和高中较大的那一方向,根据横竖屏方向有所不同)方向上距离起点的像素数
&&&&&&&&launcher:shortAxisCells=&3&
较短的方向上可以容纳的cell的数量
&&&&&&&&launcher:longAxisCells=&5&
较长的方向上可以容纳的cell的数量
shortAxisCells和longAxisCells决定一个workspace(即CellLayout)上可以容纳的item的个数为shortAxisCells*longAxisCells.
2. application_boxed.xml
&&&&&&&所有应用程序和系统文件夹中item的定义。
3.application.xml
&&&&&&&Workspace的item的layout定义。
解决壁纸显示不完整的问题:
问题在于Launcher.java里面的setWallpaperDimension方法,它检查横竖屏时将宽和高搞反了,所以造成设置壁纸尺寸时
wpm.suggestDesiredDimensions总是显示不正常。
壁纸分为动态和静态两种:
如果只需要修改默认静态壁纸,替换frameworks/base/core/res/res/drawable/default_wallpaper.jpg即可,或者在源码中修改对应default_wallpaper地址.
修改动态壁纸:在frameworks/base/core/res/res/values目录找到Config.xml文件,最后一行有定义:
&string name=&default_wallpaper_component&&null&/string&&
将其修改为对应的live wallpaper的启动component即可。
静态的图片壁纸和live wallpaper是两个系统,加载的时候是完全两套机制,静态图片通过launcher里面的一个xml文件配置来管理系统默认静态壁纸,live wallpaper则是通过intent机制向系统搜寻所有匹配Activity,所以,这里的默认值为null,而不是那个系统默认静态壁纸的地址,系统是读config.xml文件的设置,若为null才继续查找静态壁纸配置内容.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:126338次
积分:2460
积分:2460
排名:第7269名
原创:113篇
转载:23篇
评论:20条
(1)(1)(2)(5)(1)(1)(6)(5)(15)(1)(6)(10)(6)(12)(15)(29)(18)(2)(1)(1)想替换安卓手机自带的原生壁纸或图标?超详细图文教程一看就会。
以安卓2.2版的MOTO
ME525机器为例,首先提取手机的“BlurHome.apk”文件,先备份以防万一,此举主要针对那些较为粗心的朋友,备份好后再去操作替换一些不喜欢的自带原生壁纸。后面会提供MOTO
ME525机器提取的原生“BlurHome.apk”文件以备不时之需,更换桌面图标、美化状态栏以及托盘等都需此APK文件。
1、确认机器已经安装了“ER管理器”程序。打开“RE管理器”进入system/app,找到BlurHome.apk文件,复制到sdcard(SD卡)上。
2、机器连接电脑,从SD卡上将“BlurHome.apk”文件复制到电脑任何文件夹保存备份,然后再复制一份到另一个任一文件夹开始准备工作。
<font COLOR="#、将“BlurHome.apk”文件添加“.zip”后缀解压,选择“res”文件夹再进入“drawable-hdpi”文件夹。
在“drawable-hdpi”内可以看到大量图标,往下拉就可以看到机器自带的各种原生壁纸了,惊喜之余却发现每一张壁纸都还有张重复的,不错,只不过是分辨率各有不同而已,一张是960&854分辨率的(壁纸用),一张是160&142分辨率的(图标用)。
心理确定哪些喜欢哪些不喜欢,然后打开电脑上存储的壁纸,挑选几张自己喜欢的,也按每款壁纸一张960&854分辨率的和一张160&142分辨率的裁剪或压缩,作为替换原生自带壁纸之用。
然后再打开“drawable-hdpi”文件夹找出那些不喜欢的自带壁纸,复制壁纸名称粘贴到挑选出来准备替换的那些壁纸重命名,切记要对应各自相同的分辨率重命名(960&854复制名称粘贴重命名960&854的,160&142复制名称粘贴重命名160&142的)。
4、接着关闭退出解压文件,将解压文件“BlurHome.apk.zip”去掉zip后缀还原到初始APK文件,鼠标右键单击“BlurHome.apk”文件,选择用“WinRAR压缩管理器”方式打开文件,然后点击打开“res”文件夹,再点击打开“drawable-hdpi”文件夹,将挑选出来重命名的壁纸全部选择,一次性直接拖入到“drawable-hdpi”文件夹内,这些壁纸会自动替换掉原来相同名字的自带原生壁纸,然后关闭退出。
5、将已经替换好壁纸的“BlurHome.apk”复制到SD卡,再用“RE管理器”从“sdcard(SD卡)”上找到“BlurHome.apk”文件,粘贴复制到“system”文件夹,然后选择“BlurHome.apk”文件长按弹出操作菜单,点击权限一项进行权限修改,第一行1、2栏打勾;第三、四行1栏打勾,末行全勾。
权限修改好后再点击选择“BlurHome.apk”文件,长按选择“移动”一项,将“BlurHome.apk”文件再移动到“app”文件夹内,覆盖原来的“BlurHome.apk”文件,然后退出返回到桌面,重启即可。
6、重启机器到桌面后点击菜单键弹选择壁纸进入看看,一切大功告成!是不是很惊喜呢?自带的那些丑陋的壁纸没有了,都是自己喜欢的精美壁纸在里面了,随便选择可方便了,以后就再也不用为了壁纸而另建一个图片文件夹到SD卡上了,也不会因为机内壁纸收藏过多而影响对其它美图的欣赏了,至少有了更好的归类显得机器上的图片不至于那么凌乱,清爽最好。
大多数安卓机器的“Home.apk”文件都可以这样提取出来,无论是替换壁纸、图标,或者美化状态栏、托盘
等都是在这个“Home.apk”文件内进行,只不过前面的名称稍微有些诧异而已,后缀基本上都一样,所以也非常好找,这里提供壁纸替换教程主要是因为论坛上还是有很多机友在为寻找自带壁纸路径而不辞辛劳,这些图文也可以触类旁通的领会其它的桌面美化修改,希望对各位机友能有所裨益。
最后附上“RE管理器”和原生“BlurHome.apk”文件的链接,方便大家下载使用,而“BlurHome.apk”既可备份作为主屏崩溃时恢复之用,还可以作为桌面修改美化的实验文件,总之,一句话——一切为了方便喜欢安卓机器的机友们!
__________________________________________________________________________________________________&
附上自己的“微盘”地址提供下载————点击链接进入微群页面,看到“微盘”二字点击一下,打开所有软件下载列表,找到所需软件点击后面的“下载”字样进行下载就可以了,完全免费。
其中“BlurHome.apk”文件太大,已经压缩成“BlurHome.part1.rar、BlurHome.part2.rar”两个RAR文件,将两个文件都下载后解压即可。
高清晰图片教程请移步参看,还有更多惊喜
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。安卓手机在桌面如何设置文件夹里面再放一个文件夹 就像这样_百度知道
安卓手机在桌面如何设置文件夹里面再放一个文件夹 就像这样
com/zhidao/pic/item/fbf2b211b65380dd78eda.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.<a href="http./zhidao/wh%3D600%2C800/sign=ffc369cb6a1b4e168e087/fbf2b211b65380dd78eda.hiphotos://c.jpg" esrc="/zhidao/wh%3D450%2C600/sign=be15eedfcfbf6c81f7d03/fbf2b211b65380dd78eda&nbsp.baidu://c://c.baidu
把一个文件拖着不放放到另一个文件夹,就成了这样,建好的文件组可以自己改名
Ipad也不应行
这个不知道是不是通过第三方软件实现的,不好意思帮不了你
来自团队:
其他类似问题
为您推荐:
其他1条回答
好像不行,我试了
那怎么弄呀
别人都弄好了
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 壁纸 的文章

 

随机推荐