1.基础知识_基本布局

SDK目录结构

    |-- add-ons : API扩展程序, 如 google地图API等
    |-- build-tools : 构建工具, 编译项目时的一些工具, 如: aapt.exe(安卓应用打包工具),dx.bat(将 .class文件 编译成 .dex文件的程序), aidl.exe(安卓接口定义语言编译工具)等等.
    |-- docs : 开发文档, 要经常看.
    |-- extras : 系统扩展程序, 如 google平台支持库, usb驱动, web摄像头驱动, support v4/v7/v13
    |-- platforms : 平台, 2.2(8), 2.3.3(10), 4.1(16), 4.2(17), 4.3(18), 4.4(19)
    |-- platform-tools : 平台相关工具, 如 adb.exe, 4.3之前的sdk,这个目录和build-tools是在一起的.
    |-- sources : 源代码, 只包含平台核心源代码.
    |-- system-images : 系统镜像, intel 或者 ARM.
    |-- temp : 下载临时目录.
    |-- tools : 模拟器相关工具, 如 DDMS, emulator, draw9patch等等
另:
1. platform 并不是下的越多越好, 2.2, 2.3.3, 4.2, 4.4.4, 5.0足矣
2. 如果使用sdk中的模拟器, 最好下一个intel加速器, intel i3 以上的处理器在启动模拟器还是很快的.
3. docs 打开慢的解决方法: 

常用adb指令

adb: android debug bridge. 安卓调试桥. 底层是socket.
为了能在任意目录使用以下命令,需要将SDK目录下的platform-tools文件夹路径和tools文件夹路径配置到path环境变量中
下面列举了一些常用的命令:
    - 列出可以使用的android版本 : adb list targets
    - 列出可以使用的虚拟机: adb list avd
    - 创建虚拟机 adbcreate avd –n <虚拟机名> -t <Target版本ID> -c <SD卡大小> -s <屏幕尺寸>
    - 启动虚拟机 emulator –avd <虚拟机名>
    - 显示已连接的设备 adb devices
    - 导入文件到手机 adb push <Windows源文件路径> <手机目标路径>
    - 从手机导出文件 adb pull <手机源文件路径> <Windows目录路径>
    - 安装程序 : adb install -r <apk文件路径> 如果有多个设备,我们可以指定设备, -r 表示替换
        adb install -rs  emulator-5554 D:/xxx.apk
    - 卸载程序 adb uninstall <主包名>
    - 重启adb adb kill-server 然后 abd start-server
    - 挂载到linux : adb shell
    - ctrl + f11 : 切换横竖屏
有时候adb无响应,可以到进程列表里将adb.exe杀死,再重启reset adb

DDMS使用

Dilvik虚拟机调试管理系统, 可以在eclipse中打开这个视图, 有时候不太稳定, 需要点击 devices 视图的向下小箭头, 选择 reset adb.
使用ddms, 可以向模拟器打电话, 发短信, 模拟位置, 浏览/导出/导入文件, 杀死进程, 截图, 查看内存/cpu使用情况等等.
还有个很重要的功能: 调试程序, 即选中需要调试的应用进程, 点击此视图右上方的的绿色虫子按钮, 只要工作区里有打开的对应源码, 就可以调试了.

Android项目目录结构

  |-- src : 源代码目录
  |-- gen : android自动生成的文件
  |-- assets : 存放无需在 R 文件中生成 id 的资源.
  |-- bin : 编译后的字节码
  |-- libs : 第三方的jar放在这个目录,系统会自动把里面的jar包添加到环境变量
  |-- res : 资源目录, 图片, 布局文件, 字符串, 样式等等
      |-- drawable : 图片资源
      |-- layout : 布局文件, 非常重要.(xml)
      |-- menu : 菜单.(xml)
      |-- values : 字符串, 样式文件等.(xml)
  |-- AndroidManifest.xml : 项目清单文件
  |-- project.properties : 项目环境信息,比如使用的平台版本, 依赖项目, 混淆信息等等.

关于 gen 目录

gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件. 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,
同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。
R.java在应用中起到了字典的作用,它包含了各种资源的id ,通过R.java,应用可以很方便地找到对应资源。
另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,
这样可以减少应用在手机占用的空间。
 
R文件找不到了, 肯定是资源文件有问题, 如: 图片名称必须是小写字母, 数字和下划线组成, 而且不能包含一些关键字.

关于AndroidManifest.xml

这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
One of the most important elements your manifest should include is the <uses-sdk> element. This declares your app's compatibility with different Android versions using the android:minSdkVersion and android:targetSdkVersion attributes.
You should always set the android:targetSdkVersion as high as possible and test your app on the corresponding platform version.
清单文件中根节点下有个 package 属性, 这个属性指定的是 应用程序在系统中的唯一标识.
而且在 data/data/下创建的文件夹名也会用这个名字.
R文件也是存放在这个包名下的. 但是他和java代码中的包名没有关系.

为什么有时候运行项目会新开一个虚拟机?
1. 原来的关了(time out), 可以reset adb一下, 或者关掉虚拟机重来一个
2. 此项目无法运行在当前虚拟机上, 这是由清单文件中的配置决定的:
    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

其他的一些特殊配置:
真机调试, 清单文件 debugable 设为 true

关于assets目录

Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
另外, res目录还可以细分为很多子目录, 存放不同的资源, 如动画(anim), xml 等等. 
res/目录和 asset目录的区别: res/raw目录和asset目录的区别
 

Android系统目录结构

这里只列举几个重要的文件夹
    |-- data :
        |-- app : 安装应用时会先把apk上传到此目录, 并安装到此目录
        |-- data : 存放应用程序私有数据
            |-- com.gaoyuan.xxx : 每个应用的数据都在自己的文件夹下, 文件夹名字和主包名相同
            |-- com.itheima.xxx
            |-- system : 系统应用数据, 注册表 packages.list 和 packages.xml 就在这里
    |-- mnt
        |-- sdcard : SD 卡
    |-- sdcard : 指向 mnt/sdcard, 方便编程.
    |-- system : 系统目录,  和 data/system 不一样.
        |-- app: 系统应用安装目录,
 

Android应用安装过程

安装apk过程: 先上传到 data/app 目录, 然后释放文件, 写注册表.
Android中的注册表 : data/system 目录下的 package.list 和 package.xml

常用布局

1. 线性布局<br/>
LinearLayout, 所有控件线性排列, *可以选择横向(horizontal)或纵向(vertical)*
这个属性需要再LinearLayout标签中配置: android:orientation="vertical"
--------------
weightSum 和 layout_weight :
--------------
另: 每个控件都可以指定宽(width)和高(height),
还有 visibility 属性, 可设置为 visible(可见), invisible(不可见, 占位置) gone(不可见, 不占位置.)
这三个属性在任何布局里都是可以的.
 
-------
gravity: 重力?
android:gravity  针对控件内部的文本位置
android:layout_gravity  针对控件本身的位置? 一说是控件内部的控件的位置.
--------
 
2. 相对布局<br/>
控件与控件之间按照相对位置排列, 有很多可选的属性, 如:
    - layout_below : 此控件的上边界紧贴另一个控件的下边界, 需要指定另一控件的id
    - layout_above : 此控件的下边界紧贴另一个控件的上边界
    - layout_toLeftOf : 此控件的右边界紧贴另一个控件的左边界
    - layout_toRightOf : 此控件的左边界紧贴另一个控件的右边界
 
    - alignLeft : 此控件的左边界与给定控件的左边界对齐, right, top, bottom同样适用
 
    - alignParentLeft : 此控件的左边界与父控件的左边界对齐, right, top, bottom同样适用
 
    - marginLeft : 此控件与其他控件的左边距,  right, top, bottom同样适用, 这些属性在LinearLayout
        中也可以使用
 
    - centerInParent : 布尔值, 若为真, 则此控件在父控件的正中间
    - centerHorizontal : 在父控件水平方向中间
    - cneterVertical : 在父控件竖直方向中间
 
3. 表格布局<br/>
用的不多, 和web中的table类似:
  1. {{{class="brush:xml"
  2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TableRow
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent">
  8. <TextView
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="姓名"/>
  12. <EditText
  13. android:layout_width="200dip"
  14. android:layout_height="wrap_content"/>
  15. </TableRow>
  16. <TableRow
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent">
  19. <TextView
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="密码"/>
  23. <EditText
  24. android:layout_width="200dip"
  25. android:layout_height="wrap_content"/>
  26. </TableRow>
  27. </TableLayout>

 
4. 帧布局<br/>
其实就是上下层叠的层, 为什么叫 帧 呢?
如同播放器暂停后的那个暂停图标, 层叠在其他控件的上方.
 
5. 绝对布局<br/>
根据android屏幕坐标来确定组件的位置,以左上角为原点。这种布局已被废弃,因为坐标都写死了,不利于适配屏幕。
但是在游戏中还是有比较广泛的使用的,如QQ游戏大厅
 
----------
相对布局? 和盒子模型有关系吗?
----------
 

常用单位

- px (pixels)像素  一般HVGA代表320x480像素,代码里设置的大小都是这个单位.
- dip或dp (device independent pixels)设备独立像素, 这个和设备硬件有关,
    一般为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
- sp (scaled pixels)比例像素, 主要处理字体的大小,可以根据系统的字体自适应。

为了适应不同分辨率,不同的像素密度,推荐使用dip/dp,文字使用sp。

文字单位sp, 其他单位dp/dip, 不要使用px, 或者match_parent, warp_content, 一般都没问题,
但是有一点要注意, 在代码中指定大小的单位都是 px, 所以要把dp转化为px, 比如弹出popupWindow时距离屏幕左边的距离.

int dip60 = 60;
//根据当前手机的分辨率 计算 60个dip对应的像素是多少
int px = DensityUtil.dip2px(getApplicationContext(), dip60);
popWindow.showAtLocation(parent, Gravity.LEFT + Gravity.TOP,
    px, location[1]);
 
tv.setTextSize(16), 这个是是sp, 无需转换,
但是自定义控件里, 用画笔设置文字大小的时候是px, 需要转化.

版本号
 
 
 




posted @ 2016-09-30 21:52  杨伟乔  阅读(192)  评论(0编辑  收藏  举报