Java 代 码 1. overridependingtransition(android.r.anim.fade_in,android.r.anim.fade_out); 由 左 向 右 滑 入 的 效 果 Java 代 码 1. overridependingtransition(android

Similar documents
I

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

修改版-操作手册.doc

第2章 数据类型、常量与变量


Microsoft Word - 第3章.doc

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

《C语言基础入门》课程教学大纲

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

深圳市新亚电子制程股份有限公司

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

登录、注册功能的测试用例设计.doc

Microsoft Word - 文件汇编.doc

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

Microsoft Word - 第7章 图表反转形态.doc

国债回购交易业务指引

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

生产支援功能 使用说明书(IP-110 篇)

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

珠江钢琴股东大会

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

电信系教学大纲的基本规范

2006年顺德区高中阶段学校招生录取分数线

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

2 熟 悉 Visual Basic 的 集 成 开 发 环 境 3 了 解 可 视 化 面 向 对 象 编 程 事 件 驱 动 交 互 式 开 发 等 基 本 概 念 4 了 解 Visual Basic 的 特 点 环 境 要 求 与 安 装 方 法 1 Visual Basic 开 发 应 用

全国艺术科学规划项目

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决


ETF、分级基金规模、份额变化统计

用节点法和网孔法进行电路分析

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

世华财讯模拟操作手册

4 进 入 交 互 区 设 置 的 组 件 管 理, 在 组 件 管 理 中, 教 师 可 以 选 择 课 程 空 间 中 的 所 有 组 件, 并 通 过 点 击 启 用 或 不 启 用 选 定 组 件 在 课 程 空 间 中 的 显 示 5 进 入 工 作 室 管 理 的 工 作 室 首 页,

教师上报成绩流程图

<443A5C6D B5C30312EB9A4D7F7CEC4B5B55C30322EBACFCDACCEC4B5B55C C30342EC8CBC9E7CCFC5C31332ECFEEC4BFC5E0D1B55C E30385C322EB2D9D7F7CAD6B2E12E646F63>

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

Template BR_Rec_2005.dot

证券代码: 证券简称:长城电脑 公告编号:

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅


Cybozu Garoon 3 管理员手册

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页

第 期 李 伟 等 用 方 法 对 中 国 历 史 气 温 数 据 插 值 可 行 性 讨 论

 编号:

引言

目 录 一 激 活 账 号... 2 二 忘 记 密 码 后 如 何 找 回 密 码?... 3 三 如 何 管 理 学 校 信 息 及 球 队 学 生 教 师 等 信 息... 6 四 如 何 发 布 本 校 校 园 文 化? 五 如 何 向 教 师 发 送 通 知? 六

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

Excel basics

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

第二讲 数列

一、资质申请

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

工 程 造 价 咨 询 企 业 管 理 系 统 操 作 手 册 目 录 1 造 价 企 业 登 录 企 业 基 本 信 息 查 看 企 业 人 员 信 息 查 看 企 业 基 本 信 息 操 作 企 业 简 介 企 业 章

上证指数

云信Linux SSH认证代理用户手册

操作手册

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

上海证券交易所会议纪要


目 录 办 公 OA 介 绍... 3 办 公 OA... 4 一. 收 件 箱 发 布 信 件 查 看 个 人 信 件... 7 二. 公 共 留 言 发 布 公 共 留 言 查 看 公 共 留 言... 9 三. 校 长 荐


四川省农村义务教育学生

微 积 分 ( 二 ) 教 学 大 纲 2 (2010 版 ) 课 程 编 码 : 课 程 名 称 : 微 积 分 学 时 / 学 分 :36/2 先 修 课 程 : 初 等 数 学 立 体 几 何 平 面 解 析 几 何 微 积 分 ( 一 ) 适 用 专 业 : 人 力 资 源 管

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

øÕªß∂À≤Ÿ◊˜ ÷≤·

微软用户

Microsoft Word - 第3章.doc

中 国 软 科 学 年 第 期!!!

富士通将军空调机 诺可力®X系列 样本

2.5 选 举 陈 晓 非 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.6 选 举 卢 婕 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.7 选 举 张 文 君 先 生 为 第 六 届 董 事 会 独 立 董 事 候 选 人 的 议 案

火车浏览器脚本制作教程

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

超 级 玛 丽 JAVA 小 游 戏 测 试 报 告 1. 导 言 1.1 编 写 目 的 该 文 档 的 目 的 是 描 述 超 级 玛 丽 JAVA 小 游 戏 的 系 统 测 试 的 总 结 报 告, 其 主 要 内 容 包 括 : 系 统 环 境 的 介 绍 功 能 的 实 现 的 测 试

·岗位设置管理流程


一 六 年 级 下 册 教 科 书 总 体 说 明 ( 一 ) 教 学 内 容 本 册 教 科 书 一 共 安 排 了 5 个 教 学 单 元, 其 中 前 4 个 单 元 为 新 知 识, 第 五 单 元 是 对 整 个 小 学 阶 段 所 学 数 学 知 识 系 统 的 整 理 和 复 习

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

三门峡市质量技术监督局清单公示


乐视云视频发行平台 操作手册 V1.1

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

抗 日 战 争 研 究 年 第 期

学位论文文档编辑与提交

课程类 别

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

<4D F736F F D20B3D6B2D6CFDEB6EEB1EDB8F1D7EED6D52E646F63>

Transcription:

( 一 )Activity 页 面 切 换 的 效 果 Android 2.0 之 后 有 了 overridependingtransition(), 其 中 里 面 两 个 参 数, 一 个 是 前 一 个 activity 的 退 出 两 一 个 activity 的 进 入, Java 代 码 1. @Override public void oncreate(bundle savedinstancestate) { 2. super.oncreate(savedinstancestate); 3. 4. setcontentview(r.layout.splashscreen); 5. 6. new Handler().postDelayed(new Runnable() { 7. @Override 8. public void run() { 9. Intent mainintent = new Intent(SplashScreen.this, AndroidNews.class); 10. SplashScreen.this.startActivity(mainIntent); 11. SplashScreen.this.finish(); 12. 13. overridependingtransition(r.anim.mainfadein, 14. R.anim.splashfadeout); 15. } 16.}, 3000); } 上 面 的 代 码 只 是 闪 屏 的 一 部 分 Java 代 码 1. getwindow (). setwindowanimations ( int ); 这 可 没 有 上 个 好 但 是 也 可 以 实 现 淡 入 淡 出 的 效 果

Java 代 码 1. overridependingtransition(android.r.anim.fade_in,android.r.anim.fade_out); 由 左 向 右 滑 入 的 效 果 Java 代 码 1. overridependingtransition(android.r.anim.slide_in_left,android. R.anim.slide_out_right); 实 现 zoomin 和 zoomout, 即 类 似 iphone 的 进 入 和 退 出 时 的 效 果 Java 代 码 1. overridependingtransition(r.anim.zoomin, R.anim.zoomout); 新 建 zoomin.xml 文 件 Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <set 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. Android:interpolator="@android:anim/decelerate_interpolator"> <scale Android:fromXScale="2.0" android:toxscale="1.0" 5. Android:fromYScale="2.0" android:toyscale="1.0" 6. Android:pivotX="50%p" android:pivoty="50%p" 7. Android:duration="@android:integer/config_mediumAnimTime" /> </set> 新 建 zoomout.xml 文 件 Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?>

2. <set 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. Android:interpolator="@android:anim/decelerate_interpolator" 5. Android:zAdjustment="top"> 6. <scale Android:fromXScale="1.0" android:toxscale=".5" 7. Android:fromYScale="1.0" android:toyscale=".5" 8. Android:pivotX="50%p" android:pivoty="50%p" 9. Android:duration="@android:integer/config_mediumAnimTime" /> 10.<alpha Android:fromAlpha="1.0" android:toalpha="0" 11.Android:duration="@android:integer/config_mediumAnimTime"/> 12.</set> ( 二 )android 菜 单 动 画 先 请 注 意, 这 里 的 菜 单 并 不 是 按 机 器 上 的 MENU 出 现 在 那 种 菜 单, 而 是 基 于 Android SDK 提 供 的 android.view.animation.translateanimation(extends android.view.animation.animation) 类 实 例 后 附 加 到 一 个 Layout 上 使 之 产 生 的 有 动 画 出 现 和 隐 藏 效 果 的 菜 单 原 理 :Layout( 菜 单 ) 从 屏 幕 内 ( 挨 着 屏 幕 边 沿, 其 实 并 非 一 定, 视 需 要 的 初 态 和 末 态 而 定 ) 动 态 的 移 动 到 屏 幕 外 ( 在 外 面 可 以 挨 着 边 沿, 也 可 以 离 远 点, 这 个 无 所 谓 了 ), 这 样 就 可 以 达 到 动 态 菜 单 的 效 果 了 但 是 由 于 Animation 的 一 些 奇 怪 特 性 (setfill**() 函 数 的 作 用 效 果, 这 个 在 我 使 用 的 某 几 个 Animation 当 中 出 现 了 没 有 想 明 白 的 效 果 ), 就 暂 不 理 会 这 个 东 西 了, 所 以 使 得 我 们 还 需 要 用 上 XML 属 性 android:visibility 当 Layout( 菜 单 ) 显 示 的 时 候, 设 置 android:visibility="visible", 当 Layout( 菜 单 ) 隐 藏 的 时 候, 设 置 android:visibility="gone", 这 里 android:visibility 可 以 有 3 个 值,"visible" 为 可 见,"invisible" 为 不 可 见 但 占 空 间,"gone" 为 不 可 见 且 不 占 空 间 ( 所 谓 的 占 不 占 空 间, 这 个 可 以 自 己 写 个 XML 来 试 试 就 明 白 了 ) Class TranslateAnimation 的 使 用 :Animation 有 两 种 定 义 方 法, 一 种 是 用 Java code, 一 种 是 用 XML, 这 里 只 介 绍 用 code 来 定 义 ( 因 为 用 XML 来 定 义 的 那 种 我 没 用 过 嘿 嘿 ) 多 的 不 说, 看 代 码 这 里 是 TranslateAnimationMenu.java( 我 在 里 面 还 另 加 入 了 ScaleAnimation 产 生 的 动 画, 各 位 朋 友 可 以 照 着 SDK 以 及 程 序 效 果 来 理 解 ): package com.translateanimation.menu; import android.app.activity; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener;

import android.view.animation.animation; import android.view.animation.translateanimation; import android.widget.button; import android.widget.linearlayout; public class TranslateAnimationMenu extends Activity { /** Called when the activity is first created. */ //TranslateAnimation showaction, hideaction; Animation showaction, hideaction; LinearLayout menu; Button button; boolean menushowed; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); menu = (LinearLayout) findviewbyid(r.id.menu); button = (Button) findviewbyid(r.id.button); // 这 里 是 TranslateAnimation 动 画 showaction = new TranslateAnimation( Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f); // 这 里 是 ScaleAnimation 动 画 //showaction = new ScaleAnimation( // 1.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, // Animation.RELATIVE_TO_SELF, 0.0f); showaction.setduration(500); // 这 里 是 TranslateAnimation 动 画 hideaction = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f);

} }); } // 这 里 是 ScaleAnimation 动 画 //hideaction = new ScaleAnimation( // 1.0f, 1.0f, 1.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f); hideaction.setduration(500); menushowed = false; menu.setvisibility(view.gone); button.setonclicklistener(new OnClickListener() { @Override public void onclick(view v) { // TODO Auto-generated method stub if (menushowed) { menushowed = false; menu.startanimation(hideaction); menu.setvisibility(view.gone); } else { menushowed = true; menu.startanimation(showaction); menu.setvisibility(view.visible); } } 这 里 是 main.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <LinearLayout android:id="@+id/menu" android:layout_height="100px" android:layout_width="fill_parent" android:layout_alignparenttop="true" android:background="#ffffff"> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="i am a menu"

android:gravity="center" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:text="click to show/hide menu" /> </RelativeLayout>Android 基 于 TranslateAnimation 的 动 画 动 态 菜 单 android 布 局 属 性 文 章 分 类 : 移 动 开 发 第 一 类 : 属 性 值 为 true 或 false android:layout_centerhrizontal 水 平 居 中 android:layout_centervertical 垂 直 居 中 android:layout_centerinparent 相 对 于 父 元 素 完 全 居 中 android:layout_alignparentbottom 贴 紧 父 元 素 的 下 边 缘 android:layout_alignparentleft 贴 紧 父 元 素 的 左 边 缘 android:layout_alignparentright 贴 紧 父 元 素 的 右 边 缘 android:layout_alignparenttop 贴 紧 父 元 素 的 上 边 缘 android:layout_alignwithparentifmissing 如 果 对 应 的 兄 弟 元 素 找 不 到 的 话 就 以 父 元 素 做 参 照 物 第 二 类 : 属 性 值 必 须 为 id 的 引 用 名 @id/id-name android:layout_below 在 某 元 素 的 下 方 android:layout_above 在 某 元 素 的 的 上 方 android:layout_toleftof 在 某 元 素 的 左 边 android:layout_torightof 在 某 元 素 的 右 边 齐 android:layout_aligntop 本 元 素 的 上 边 缘 和 某 元 素 的 的 上 边 缘 对 齐 android:layout_alignleft 本 元 素 的 左 边 缘 和 某 元 素 的 的 左 边 缘 对 齐 android:layout_alignbottom 本 元 素 的 下 边 缘 和 某 元 素 的 的 下 边 缘 对 android:layout_alignright 本 元 素 的 右 边 缘 和 某 元 素 的 的 右 边 缘 对 齐 第 三 类 : 属 性 值 为 具 体 的 像 素 值, 如 30dip,40px android:layout_marginbottom 离 某 元 素 底 边 缘 的 距 离 android:layout_marginleft 离 某 元 素 左 边 缘 的 距 离 android:layout_marginright 离 某 元 素 右 边 缘 的 距 离 android:layout_margintop 离 某 元 素 上 边 缘 的 距 离

EditText 的 android:hint 设 置 EditText 为 空 时 输 入 框 内 的 提 示 信 息 android:gravity android:gravity 属 性 是 对 该 view 内 容 的 限 定. 比 如 一 个 button 上 面 的 text. 你 可 以 设 置 该 text 在 view 的 靠 左, 靠 右 等 位 置. 以 button 为 例, android:gravity="right" 则 button 上 面 的 文 字 靠 右 android:layout_gravity android:layout_gravity 是 用 来 设 置 该 view 相 对 与 起 父 view 的 位 置. 比 如 一 个 button 在 linearlayout 里, 你 想 把 该 button 放 在 靠 左 靠 右 等 位 置 就 可 以 通 过 该 属 性 设 置. 以 button 为 例,android:layout_gravity="right" 则 button 靠 右 android:layout_alignparentright 使 当 前 控 件 的 右 端 和 父 控 件 的 右 端 对 齐 这 里 属 性 值 只 能 为 true 或 false, 默 认 false android:scaletype: android:scaletype 是 控 制 图 片 如 何 resized/moved 来 匹 对 ImageView 的 size ImageView.ScaleType / android:scaletype 值 的 意 义 区 别 : CENTER /center 按 图 片 的 原 来 size 居 中 显 示, 当 图 片 长 / 宽 超 过 View 的 长 / 宽, 则 截 取 图 片 的 居 中 部 分 显 示 CENTER_CROP / centercrop 按 比 例 扩 大 图 片 的 size 居 中 显 示, 使 得 图 片 长 ( 宽 ) 等 于 或 大 于 View 的 长 ( 宽 ) CENTER_INSIDE / centerinside 将 图 片 的 内 容 完 整 居 中 显 示, 通 过 按 比 例 缩 小 或 原 来 的 size 使 得 图 片 长 / 宽 等 于 或 小 于 View 的 长 / 宽 FIT_CENTER / fitcenter 把 图 片 按 比 例 扩 大 / 缩 小 到 View 的 宽 度, 居 中 显 示 FIT_END / fitend 的 下 部 分 位 置 FIT_START / fitstart 的 上 部 分 位 置 把 图 片 按 比 例 扩 大 / 缩 小 到 View 的 宽 度, 显 示 在 View 把 图 片 按 比 例 扩 大 / 缩 小 到 View 的 宽 度, 显 示 在 View FIT_XY / fitxy 把 图 片 不 按 比 例 扩 大 / 缩 小 到 View 的 大 小 显 示 MATRIX / matrix 用 矩 阵 来 绘 制, 动 态 缩 小 放 大 图 片 来 显 示 ** 要 注 意 一 点,Drawable 文 件 夹 里 面 的 图 片 命 名 是 不 能 大 写 的 2010-10-28

android 翻 页 : 之 前 看 到 不 少 翻 页, 不 过 人 家 没 有 分 享 出 代 码 来, 我 也 一 直 没 有 搞 出 来. 想 了 好 久, 实 现 原 理 并 不 是 那 么 的 难, 怎 么 实 现 就 比 较 难 了. 当 然 像 3D 现 实 模 拟 分 页 的 难 度 是 比 较 大 的. 平 面 的 分 页, 简 单 点 说 就 是 用 三 张 图 片, 模 拟 分 页 时 可 见 区, 这 里 我 弄 了 一 个 View, 里 面 有 翻 页 的 效 果. OnDraw 中 ; 最 底 一 张 是 将 要 显 示 的, 先 画 出 来, 接 着 画 原 来 那 张, 放 在 中 间, 因 为 这 张 图 片 要 在 翻 页 的 过 程 中 慢 慢 消 失, 一 点 一 点 被 拉 出 去, 最 后 一 张 就 是 最 上 面 的, 为 什 么 要 用 这 张 图 片 呢? 当 页 面 被 翻 起 后, 一 个 角 消 失 了, 就 比 如 第 二 张 不 显 示 的 部 分, 那 这 部 分, 就 是 第 三 张 了, 再 覆 盖 在 第 二 张 上 面, 形 成 一 种 看 似 翻 书 的. 效 果. 然 后 在 第 二 张 ( 假 设 从 左 边 开 始 被 翻 起, 左 边 先 消 失 ), 左 边 缘 再 画 出 一 条 线, 当 然 这 条 线 要 粗 点, 然 后 设 置 颜 色 渐 变, 还 要 透 明 的, 就 有 一 种 阴 影 的 效 果. 我 开 始 一 直 在 想, 像 这 样 的, 不 难 实 现 啊, 当 然 只 限 于 矩 形 的, 因 为 当 时 没 有 想 到 如 何 处 理 第 二 张 消 失 部 分 为 一 个 三 角 形. 可 以 通 过 Rect 来 设 置 一 个 Bitmap, 的 宽 度. Rect rect = new Rect(mWidth, 0, width, height); canvas.drawbitmap(image2, null, rect, paint2); mwidth 就 是 左 边 消 失 部 分 的 宽 度. 通 过 不 断 改 变 这 个 值, 然 后 再 刷 新 View 就 可 以 看 到 一 种 滚 动 的 效 果. 第 二 张 图 片 左 边 慢 慢 消 失, width,height 为 画 面 目 的 宽 高. 然 后 可 以 添 加 一 个 第 三 张 图 片, 也 用 同 样 的 方 法 设 置 了 它 显 示 的 宽, 高, 通 过 上 面 Rect 的 处 理, 看 到 一 般 的 效 果. 比 较 常 见 的 是 从 一 个 角 开 始, 然 后 慢 慢 的 卷 起 来, 而 不 是 像 上 面 平 行 的,( 上 面 只 能 看 到 平 行 的 效 果.) 这 里 就 涉 及 到 了 一 个 角, 就 是 三 角 形 如 何 产 生 的 问 题, 这 个 问 题 困 扰 了 好 久. 今 天 想 到 办 法 了. 就 是 用 Path 去 画 多 边 形. 一 个 矩 形, 减 去 一 个 多 边 形, 就 剩 下 一 个 三 角 形 了. 先 讨 论 上 面 那 种 效 果 的 处 理 方 式 : 首 先 是 View: 的 OnDraw 方 法. Java 代 码

1. width = getwidth(); 2. height = getheight(); 3. // 画 最 底 下 一 张 将 要 显 示 的 图 片 4. Rect rect = new Rect(0, 0, width, height); 5. canvas.drawbitmap(image1, null, rect, paint1); 6. // 画 上 面 卷 起 的 那 张. 实 现 平 行 翻 页 效 果. 7. rect = new Rect(mWidth, 0, width, height); 8. canvas.drawbitmap(image2, null, rect, paint2); 9. // 当 然 之 后 再 处 理 卷 起 边 缘 阴 影, 模 糊 等 效 果, 这 里 省 略 了. 还 有 图 片 Image1,image2 自 己 准 备 了 10. 然 后 就 是 手 势, 没 有 手 势, 翻 页 显 得 很 呆 板. 11. 这 个 View 实 现 OnGestureListener, 自 然 有 一 些 方 法 要 覆 盖 的. 12. 其 它 方 法 随 便 了, 有 返 回 值 的 给 它 一 个 True, 主 要 是 13.public boolean onfling(motionevent e1, MotionEvent e2, fl oat velocityx, float velocityy) 这 个 方 法, 比 较 有 用. 14.myHandler.removeMessage(0);/../ 我 觉 得 要 先 移 除 上 一 次 翻 页 的 动 作, 然 后 会 马 上 从 上 一 次 运 行 中 停 止, 而 立 即 向 当 前 需 要 的 方 向 变 化. 15.if(e1.getX() - e2.getx() > 0){ 16. turnleft(5);// 向 左 翻 17.}else if(e2.getx() - e1.getx() > 0){ 18. turnright(5);// 向 右 翻 19.} 20. 两 个 方 法 差 不 多, 也 可 以 合 并, 传 入 正 负 值. 21.delta = speed; 参 数 就 是 上 面 的 5, 作 为 变 化 速 度. 22.myHandler.sendEmptyMessage(0); 23. 普 通 的 View 要 Handler 来 更 新. 之 前 试 过 了, 以 为 在 View 直 接 Invalidate 可 以. 24. 虽 然 没 有 提 示 非 UI 线 程 的 问 题, 但 是 循 环 了 多 次 只 看 到 OnDraw 执 行 一 次 而 以. 25.public void handlemessage(message message){ 26. invalidate(); 27. mwidth += delta;// 变 化 第 二 张 图 片 的 宽. 28. if(delta > 0){// 向 右 滚 动 29. if(mwidth < width){// 当 第 二 张 图 片 的 左 侧 空 白 超 过 了 画 布 的 宽 时 停 止 30. sendemptymessage(0); 31. } 32.}else{// 向 左 滚 动 33.if(mWidth > 0){ 34. sendemptymessage(0); 35.} 36.} 37.} 38.

39. 然 后 在 XML 里 用 这 个 View, 最 后 Activity 里 SetContentView 就 OK 了 / 40.<com.me.page.PageView 41.android:id="@+id/pageView1" 42.android:layout_gravity="center" 43.android:layout_marginTop="5px" 44.android:layout_width="fill_parent" 45.android:layout_height="fill_parent"/> 46. 47. 由 于 使 用 XML, 所 以 构 造 方 法 必 须 要 有, 带 两 个 参 数 的. 48.public PageView(Context context, AttributeSet attrs){ 49. super(context, attrs); 50. initview(); 51.} 52.InitView: 53.private void initview(){ 54. image1 = Bitmap.createBitmap(BitmapFactory.decodeResource (getresources(), R.drawable.aac)); 55. image2 = Bitmap.createBitmap(BitmapFactory.decodeResource (getresources(), R.drawable.q1)); 56. image3 = Bitmap.createBitmap(BitmapFactory.decodeResource (getresources(), R.drawable.q2)); 57. 58. myhandler = new MyHandler(); 59. gesturedetector = new GestureDetector(this); 60. mshader = new LinearGradient(10, 250, 250, 250, 61. new int[]{color.red, Color.GREEN, Color.BLUE}, 62. null, Shader.TileMode.MIRROR); 63. paint1 = new Paint(); 64. paint1.setflags(paint.anti_alias_flag); // 去 除 插 刺 65. paint2 = new Paint(paint1); 66. paint3 = new Paint(paint2); 67. paint3.setcolor(0x45111111); 68. //paint.setshader(mshader);// 其 间 颜 色 会 有 变 化. 69. paint3.setstrokewidth(12); 70. paint4 = new Paint(paint2); 71. paint4.setcolor(0xff111111); 72. paint4.setshader(mshader);// 其 间 颜 色 会 有 变 化. 73. paint4.setstrokewidth(12); 74. } 75. 76. 代 码 就 到 这 里 了. 关 于 三 角 形 卷 动 翻 页, 代 码 没 有 写 完 整,( 第 三 张 图 片 还 没 有 弄, 也 没 有 阴 影 ), 先 不 写 了, 而 且 似 乎 也 不 止 我 这 样 一 种 写 法 的, 网 上 看 到 的 翻 页 还 有 其 它 的, 比 如 我 见 到 一 个,OnDraw 里 得 到 画 布 的 高, 然 后

一 行 一 行 描 述, 并 逐 行 递 减 宽 度, 这 样 造 成 一 个 三 角 形, 速 度 也 不 那 么 地 慢. 还 可 接 受. 77. 78. 来 些 图 片. 79.page-15.png 到 page-16.png, 宽 度 越 来 越 小 了. 80.page-12.png 到 page-14.png 是 三 角 形 的, 里 面 具 体 操 作 复 杂 一 些, 当 前 差 上 面 那 张 遮 罩. 以 后 再 完 善 了. 81. android 中 颜 色 对 应 的 值 82. 文 章 分 类 : 移 动 开 发 83. <?xml version="1.0" encoding="utf-8"?> < resources> < color name="white">#ffffff< /color><!-- 白 色 --> < color name="ivory">#fffff0< /color><!-- 象 牙 色 --> < color name="lightyellow">#ffffe0< /color><!-- 亮 黄 色 --> < color name="yellow">#ffff00< /color><!-- 黄 色 --> < color name="snow">#fffafa< /color><!-- 雪 白 色 --> < color name="floralwhite">#fffaf0< /color><!-- 花 白 色 --> < color name="lemonchiffon">#fffacd< /color><!-- 柠 檬 绸 色 --> < color name="cornsilk">#fff8dc< /color><!-- 米 绸 色 --> < color name="seashell">#fff5ee< /color><!-- 海 贝 色 --> < color name="lavenderblush">#fff0f5< /color><!-- 淡 紫 红 --> < color name="papayawhip">#ffefd5< /color><!-- 番 木 色 --> < color name="blanchedalmond">#ffebcd< /color><!-- 白 杏 色 --> < color name="mistyrose">#ffe4e1< /color><!-- 浅 玫 瑰 色 --> < color name="bisque">#ffe4c4< /color><!-- 桔 黄 色 --> < color name="moccasin">#ffe4b5< /color><!-- 鹿 皮 色 -->

< color name="navajowhite">#ffdead< /color><!-- 纳 瓦 白 --> < color name="peachpuff">#ffdab9< /color><!-- 桃 色 --> < color name="gold">#ffd700< /color><!-- 金 色 --> < color name="pink">#ffc0cb< /color><!-- 粉 红 色 --> < color name="lightpink">#ffb6c1< /color><!-- 亮 粉 红 色 --> < color name="orange">#ffa500< /color><!-- 橙 色 --> < color name="lightsalmon">#ffa07a< /color><!-- 亮 肉 色 --> < color name="darkorange">#ff8c00< /color><!-- 暗 桔 黄 色 --> < color name="coral">#ff7f50< /color><!-- 珊 瑚 色 --> < color name="hotpink">#ff69b4< /color><!-- 热 粉 红 色 --> < color name="tomato">#ff6347< /color><!-- 西 红 柿 色 --> < color name="orangered">#ff4500< /color><!-- 红 橙 色 --> < color name="deeppink">#ff1493< /color><!-- 深 粉 红 色 --> < color name="fuchsia">#ff00ff< /color><!-- 紫 红 色 --> < color name="magenta">#ff00ff< /color><!-- 红 紫 色 --> < color name="red">#ff0000< /color><!-- 红 色 --> < color name="oldlace">#fdf5e6< /color><!-- 老 花 色 --> < color name="lightgoldenrodyellow">#fafad2< /color><!-- 亮 金 黄 色 --> < color name="linen">#faf0e6< /color><!-- 亚 麻 色 --> < color name="antiquewhite">#faebd7< /color><!-- 古 董 白 --> < color name="salmon">#fa8072< /color><!-- 鲜 肉 色 --> < color name="ghostwhite">#f8f8ff< /color><!-- 幽 灵 白 -->

< color name="mintcream">#f5fffa< /color><!-- 薄 荷 色 --> < color name="whitesmoke">#f5f5f5< /color><!-- 烟 白 色 --> < color name="beige">#f5f5dc< /color><!-- 米 色 --> < color name="wheat">#f5deb3< /color><!-- 浅 黄 色 --> < color name="sandybrown">#f4a460< /color><!-- 沙 褐 色 --> < color name="azure">#f0ffff< /color><!-- 天 蓝 色 --> < color name="honeydew">#f0fff0< /color><!-- 蜜 色 --> < color name="aliceblue">#f0f8ff< /color><!-- 艾 利 斯 兰 --> < color name="khaki">#f0e68c< /color><!-- 黄 褐 色 --> < color name="lightcoral">#f08080< /color><!-- 亮 珊 瑚 色 --> < color name="palegoldenrod">#eee8aa< /color><!-- 苍 麒 麟 色 --> < color name="violet">#ee82ee< /color><!-- 紫 罗 兰 色 --> < color name="darksalmon">#e9967a< /color><!-- 暗 肉 色 --> < color name="lavender">#e6e6fa< /color><!-- 淡 紫 色 --> < color name="lightcyan">#e0ffff< /color><!-- 亮 青 色 --> < color name="burlywood">#deb887< /color><!-- 实 木 色 --> < color name="plum">#dda0dd< /color><!-- 洋 李 色 --> < color name="gainsboro">#dcdcdc< /color><!-- 淡 灰 色 --> < color name="crimson">#dc143c< /color><!-- 暗 深 红 色 --> --> < color name="palevioletred">#db7093< /color><!-- 苍 紫 罗 兰 色 < color name="goldenrod">#daa520< /color><!-- 金 麒 麟 色 -->

< color name="orchid">#da70d6< /color><!-- 淡 紫 色 --> < color name="thistle">#d8bfd8< /color><!-- 蓟 色 --> < color name="lightgray">#d3d3d3< /color><!-- 亮 灰 色 --> < color name="lightgrey">#d3d3d3< /color><!-- 亮 灰 色 --> < color name="tan">#d2b48c< /color><!-- 茶 色 --> < color name="chocolate">#d2691e< /color><!-- 巧 可 力 色 --> < color name="peru">#cd853f< /color><!-- 秘 鲁 色 --> < color name="indianred">#cd5c5c< /color><!-- 印 第 安 红 --> < color name="mediumvioletred">#c71585< /color><!-- 中 紫 罗 兰 色 --> < color name="silver">#c0c0c0< /color><!-- 银 色 --> < color name="darkkhaki">#bdb76b< /color><!-- 暗 黄 褐 色 < color name="rosybrown">#bc8f8f< /color><!-- 褐 玫 瑰 红 --> < color name="mediumorchid">#ba55d3< /color><!-- 中 粉 紫 色 --> < color name="darkgoldenrod">#b8860b< /color><!-- 暗 金 黄 色 --> < color name="firebrick">#b22222< /color><!-- 火 砖 色 --> < color name="powderblue">#b0e0e6< /color><!-- 粉 蓝 色 --> --> < color name="lightsteelblue">#b0c4de< /color><!-- 亮 钢 兰 色 < color name="paleturquoise">#afeeee< /color><!-- 苍 宝 石 绿 --> < color name="greenyellow">#adff2f< /color><!-- 黄 绿 色 --> < color name="lightblue">#add8e6< /color><!-- 亮 蓝 色 --> < color name="darkgray">#a9a9a9< /color><!-- 暗 灰 色 -->

< color name="darkgrey">#a9a9a9< /color><!-- 暗 灰 色 --> < color name="brown">#a52a2a< /color><!-- 褐 色 --> < color name="sienna">#a0522d< /color><!-- 赭 色 --> < color name="darkorchid">#9932cc< /color><!-- 暗 紫 色 --> < color name="palegreen">#98fb98< /color><!-- 苍 绿 色 --> < color name="darkviolet">#9400d3< /color><!-- 暗 紫 罗 兰 色 --> < color name="mediumpurple">#9370db< /color><!-- 中 紫 色 --> < color name="lightgreen">#90ee90< /color><!-- 亮 绿 色 --> < color name="darkseagreen">#8fbc8f< /color><!-- 暗 海 兰 色 --> < color name="saddlebrown">#8b4513< /color><!-- 重 褐 色 --> < color name="darkmagenta">#8b008b< /color><!-- 暗 洋 红 --> < color name="darkred">#8b0000< /color><!-- 暗 红 色 --> < color name="blueviolet">#8a2be2< /color><!-- 紫 罗 兰 蓝 色 < color name="lightskyblue">#87cefa< /color><!-- 亮 天 蓝 色 --> < color name="skyblue">#87ceeb< /color><!-- 天 蓝 色 --> < color name="gray">#808080< /color><!-- 灰 色 --> < color name="grey">#808080< /color><!-- 灰 色 --> < color name="olive">#808000< /color><!-- 橄 榄 色 --> < color name="purple">#800080< /color><!-- 紫 色 --> < color name="maroon">#800000< /color><!-- 粟 色 --> < color name="aquamarine">#7fffd4< /color><!-- 碧 绿 色 --> < color name="chartreuse">#7fff00< /color><!-- 黄 绿 色 -->

< color name="lawngreen">#7cfc00< /color><!-- 草 绿 色 --> --> < color name="mediumslateblue">#7b68ee< /color><!-- 中 暗 蓝 色 < color name="lightslategray">#778899< /color><!-- 亮 蓝 灰 --> < color name="lightslategrey">#778899< /color><!-- 亮 蓝 灰 --> < color name="slategray">#708090< /color><!-- 灰 石 色 --> < color name="slategrey">#708090< /color><!-- 灰 石 色 --> < color name="olivedrab">#6b8e23< /color><!-- 深 绿 褐 色 --> < color name="slateblue">#6a5acd< /color><!-- 石 蓝 色 --> < color name="dimgray">#696969< /color><!-- 暗 灰 色 --> < color name="dimgrey">#696969< /color><!-- 暗 灰 色 --> --> < color name="mediumaquamarine">#66cdaa< /color><!-- 中 绿 色 < color name="cornflowerblue">#6495ed< /color><!-- 菊 兰 色 --> < color name="cadetblue">#5f9ea0< /color><!-- 军 兰 色 --> < color name="darkolivegreen">#556b2f< /color><!-- 暗 橄 榄 绿 < color name="indigo">#4b0082< /color><!-- 靛 青 色 --> --> < color name="mediumturquoise">#48d1cc< /color><!-- 中 绿 宝 石 < color name="darkslateblue">#483d8b< /color><!-- 暗 灰 蓝 色 --> < color name="steelblue">#4682b4< /color><!-- 钢 兰 色 --> < color name="royalblue">#4169e1< /color><!-- 皇 家 蓝 --> < color name="turquoise">#40e0d0< /color><!-- 青 绿 色 --> < color name="mediumseagreen">#3cb371< /color><!-- 中 海 蓝 -->

< color name="limegreen">#32cd32< /color><!-- 橙 绿 色 --> < color name="darkslategray">#2f4f4f< /color><!-- 暗 瓦 灰 色 --> < color name="darkslategrey">#2f4f4f< /color><!-- 暗 瓦 灰 色 --> < color name="seagreen">#2e8b57< /color><!-- 海 绿 色 --> < color name="forestgreen">#228b22< /color><!-- 森 林 绿 --> < color name="lightseagreen">#20b2aa< /color><!-- 亮 海 蓝 色 --> < color name="dodgerblue">#1e90ff< /color><!-- 闪 兰 色 --> < color name="midnightblue">#191970< /color><!-- 中 灰 兰 色 --> < color name="aqua">#00ffff< /color><!-- 浅 绿 色 --> < color name="cyan">#00ffff< /color><!-- 青 色 --> < color name="springgreen">#00ff7f< /color><!-- 春 绿 色 --> < color name="lime">#00ff00< /color><!-- 酸 橙 色 --> < color name="mediumspringgreen">#00fa9a< /color><!-- 中 春 绿 色 --> < color name="darkturquoise">#00ced1< /color><!-- 暗 宝 石 绿 --> < color name="deepskyblue">#00bfff< /color><!-- 深 天 蓝 色 --> < color name="darkcyan">#008b8b< /color><!-- 暗 青 色 --> < color name="teal">#008080< /color><!-- 水 鸭 色 --> < color name="green">#008000< /color><!-- 绿 色 --> < color name="darkgreen">#006400< /color><!-- 暗 绿 色 --> < color name="blue">#0000ff< /color><!-- 蓝 色 --> < color name="mediumblue">#0000cd< /color><!-- 中 兰 色 -->

< color name="darkblue">#00008b< /color><!-- 暗 蓝 色 --> < color name="navy">#000080< /color><!-- 海 军 色 --> < color name="black">#000000< /color><!-- 黑 色 --> < /resources> android ListView 详 解 在 android 开 发 中 ListView 是 比 较 常 用 的 组 件, 它 以 列 表 的 形 式 展 示 具 体 内 容, 并 且 能 够 根 据 数 据 的 长 度 自 适 应 显 示 抽 空 把 对 ListView 的 使 用 做 了 整 理, 并 写 了 个 小 例 子, 如 下 图 列 表 的 显 示 需 要 三 个 元 素 : 1.ListVeiw 用 来 展 示 列 表 的 View 2. 适 配 器 用 来 把 数 据 映 射 到 ListView 上 的 中 介 3. 数 据 具 体 的 将 被 映 射 的 字 符 串, 图 片, 或 者 基 本 组 件 根 据 列 表 的 适 配 器 类 型, 列 表 分 为 三 种,ArrayAdapter,SimpleAdapter 和 SimpleCur soradapter 其 中 以 ArrayAdapter 最 为 简 单, 只 能 展 示 一 行 字 SimpleAdapter 有 最 好 的 扩 充 性, 可 以 自 定 义 出 各 种 效 果 SimpleCursorAdapter 可 以 认 为 是 SimpleAdapter 对 数 据 库 的 简 单 结 合, 可 以 方 面 的 把 数 据 库 的 内 容 以 列 表 的 形 式 展 示 出 来

我 们 从 最 简 单 的 ListView 开 始 : print? 01 /** 02 * @author allin 03 * 04 */ 05 public class MyListView extends Activity { 06 07 private ListView listview; 08 //private List<String> data = new ArrayList<String>(); 09 @Override 10 public void oncreate(bundle savedinstancestate){ 11 super.oncreate(savedinstancestate); 12 13 listview = new ListView(this); listview.setadapter(new ArrayAdapter<String>(this, 14 android.r.layout.simple_expandable_list_item_1,getdata())); 15 setcontentview(listview); 16 } 17 18 19 20 private List<String> getdata(){ 21 22 List<String> data = new ArrayList<String>(); 23 data.add(" 测 试 数 据 1"); 24 data.add(" 测 试 数 据 2"); 25 data.add(" 测 试 数 据 3"); 26 data.add(" 测 试 数 据 4"); 28 return data; 29 } 30 } 上 面 代 码 使 用 了 ArrayAdapter(Context context, int textviewresourceid, List<T> objects) 来 装 配 数 据, 要 装 配 这 些 数 据 就 需 要 一 个 连 接 ListView 视 图 对 象 和 数 组 数 据 的 适 配 器 来 两 者 的 适 配 工 作,ArrayAdapter 的 构 造 需 要 三 个 参 数, 依 次 为 this, 布 局 文 件 ( 注

意 这 里 的 布 局 文 件 描 述 的 是 列 表 的 每 一 行 的 布 局,android.R.layout.simple_list_item_ 1 是 系 统 定 义 好 的 布 局 文 件 只 显 示 一 行 文 字, 数 据 源 ( 一 个 List 集 合 ) 同 时 用 setadapter () 完 成 适 配 的 最 后 工 作 运 行 后 的 现 实 结 构 如 下 图 : SimpleCursorAdapter sdk 的 解 释 是 这 样 的 :An easy adapter to map columns from a cursor to T extviews or ImageViews defined in an XML file. You can specify which colu mns you want, which views you want to display the columns, and the XML file that defines the appearance of these views 简 单 的 说 就 是 方 便 把 从 游 标 得 到 的 数 据 进 行 列 表 显 示, 并 可 以 把 指 定 的 列 映 射 到 对 应 的 TextView 中 下 面 的 程 序 是 从 电 话 簿 中 把 联 系 人 显 示 到 类 表 中 先 在 通 讯 录 中 添 加 一 个 联 系 人 作 为 数 据 库 的 数 据 然 后 获 得 一 个 指 向 数 据 库 的 Cursor 并 且 定 义 一 个 布 局 文 件 ( 当 然 也 可 以 使 用 系 统 自 带 的 ) view source print? 01 /** 02 * @author allin 03 *

04 */ 05 public class MyListView2 extends Activity { 07 private ListView listview; 08 //private List<String> data = new ArrayList<String>(); 09 @Override 10 public void oncreate(bundle savedinstancestate){ 11 super.oncreate(savedinstancestate); 13 listview = new ListView(this); Cursor cursor = getcontentresolver().query(people.content_uri, 15 null, null, null, null); 16 startmanagingcursor(cursor); ListAdapter listadapter = new SimpleCursorAdapter(this, 18 android.r.layout.simple_expandable_list_item_1, 19 cursor, 20 new String[]{People.NAME}, 21 new int[]{android.r.id.text1}); 23 listview.setadapter(listadapter); 24 setcontentview(listview); 25 } Cursor cursor = getcontentresolver().query(people.content_uri, null, null, null, null); 先 获 得 一 个 指 向 系 统 通 讯 录 数 据 库 的 Cursor 对 象 获 得 数 据 来 源 startmanagingcursor(cursor); 我 们 将 获 得 的 Cursor 对 象 交 由 Activity 管 理, 这 样 C ursor 的 生 命 周 期 和 Activity 便 能 够 自 动 同 步, 省 去 自 己 手 动 管 理 Cursor SimpleCursorAdapter 构 造 函 数 前 面 3 个 参 数 和 ArrayAdapter 是 一 样 的, 最 后 两 个 参 数 : 一 个 包 含 数 据 库 的 列 的 String 型 数 组, 一 个 包 含 布 局 文 件 中 对 应 组 件 id 的 int 型 数 组 其 作 用 是 自 动 的 将 String 型 数 组 所 表 示 的 每 一 列 数 据 映 射 到 布 局 文 件 对 应 id 的 组 件 上 上 面 的 代 码, 将 NAME 列 的 数 据 一 次 映 射 到 布 局 文 件 的 id 为 text1 的 组 件 上 注 意 : 需 要 在 AndroidManifest.xml 中 如 权 限 :<uses-permission android:name=" android.permission.read_contacts"></uses-permission> 运 行 后 效 果 如 下 图 :

SimpleAdapter simpleadapter 的 扩 展 性 最 好, 可 以 定 义 各 种 各 样 的 布 局 出 来, 可 以 放 上 ImageView( 图 片 ), 还 可 以 放 上 Button( 按 钮 ),CheckBox( 复 选 框 ) 等 等 下 面 的 代 码 都 直 接 继 承 了 ListActivity,ListActivity 和 普 通 的 Activity 没 有 太 大 的 差 别, 不 同 就 是 对 显 示 ListView 做 了 许 多 优 化, 方 面 显 示 而 已 下 面 的 程 序 是 实 现 一 个 带 有 图 片 的 类 表 首 先 需 要 定 义 好 一 个 用 来 显 示 每 一 个 列 内 容 的 xml vlist.xml view source print? 01 <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 03 android:orientation="horizontal" android:layout_width="fill_parent" 04 android:layout_height="fill_parent"> 07 <ImageView android:id="@+id/img" 08 android:layout_width="wrap_content" 09 android:layout_height="wrap_content" 10 android:layout_margin="5px"/> 11 12 <LinearLayout android:orientation="vertical" 13 android:layout_width="wrap_content"

14 android:layout_height="wrap_content"> 15 16 <TextView android:id="@+id/title" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:textcolor="#ffffffff" 20 android:textsize="22px" /> 21 <TextView android:id="@+id/info" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:textcolor="#ffffffff" 25 android:textsize="13px" /> 26 27 </LinearLayout> 30 </LinearLayout> 下 面 是 实 现 代 码 : view source print? 01 /** 02 * @author allin 03 * 04 */ 05 public class MyListView3 extends ListActivity { 08 // private List<String> data = new ArrayList<String>(); 09 @Override 10 public void oncreate(bundle savedinstancestate) { 11 super.oncreate(savedinstancestate); 13 SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist, 14 new String[]{"title","info","img"}, 15 new int[]{r.id.title,r.id.info,r.id.img}); 16 setlistadapter(adapter); 17 } 18 19 private List<Map<String, Object>> getdata() { 20 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 22 Map<String, Object> map = new HashMap<String, Object>(); 23 map.put("title", "G1");

24 map.put("info", "google 1"); 25 map.put("img", R.drawable.i1); 26 list.add(map); 27 28 map = new HashMap<String, Object>(); 29 map.put("title", "G2"); 30 map.put("info", "google 2"); 31 map.put("img", R.drawable.i2); 32 list.add(map); 33 34 map = new HashMap<String, Object>(); 35 map.put("title", "G3"); 36 map.put("info", "google 3"); 37 map.put("img", R.drawable.i3); 38 list.add(map); 39 40 return list; 41 } 42 } 使 用 simpleadapter 的 数 据 用 一 般 都 是 HashMap 构 成 的 List,list 的 每 一 节 对 应 ListVi ew 的 每 一 行 HashMap 的 每 个 键 值 数 据 映 射 到 布 局 文 件 中 对 应 id 的 组 件 上 因 为 系 统 没 有 对 应 的 布 局 文 件 可 用, 我 们 可 以 自 己 定 义 一 个 布 局 vlist.xml 下 面 做 适 配,new 一 个 S impleadapter 参 数 一 次 是 :this, 布 局 文 件 (vlist.xml), HashMap 的 title 和 info, img 布 局 文 件 的 组 件 id,title,info,img 布 局 文 件 的 各 组 件 分 别 映 射 到 HashMap 的 各 元 素 上, 完 成 适 配 运 行 效 果 如 下 图 :

有 按 钮 的 ListView 但 是 有 时 候, 列 表 不 光 会 用 来 做 显 示 用, 我 们 同 样 可 以 在 在 上 面 添 加 按 钮 添 加 按 钮 首 先 要 写 一 个 有 按 钮 的 xml 文 件, 然 后 自 然 会 想 到 用 上 面 的 方 法 定 义 一 个 适 配 器, 然 后 将 数 据 映 射 到 布 局 文 件 上 但 是 事 实 并 非 这 样, 因 为 按 钮 是 无 法 映 射 的, 即 使 你 成 功 的 用 布 局 文 件 显 示 出 了 按 钮 也 无 法 添 加 按 钮 的 响 应, 这 时 就 要 研 究 一 下 ListView 是 如 何 现 实 的 了, 而 且 必 须 要 重 写 一 个 类 继 承 BaseAdapter 下 面 的 示 例 将 显 示 一 个 按 钮 和 一 个 图 片, 两 行 字 如 果 单 击 按 钮 将 删 除 此 按 钮 的 所 在 行 并 告 诉 你 ListView 究 竟 是 如 何 工 作 的 效 果 如 下 : vlist2.xml

view source print? 01 <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 03 android:orientation="horizontal" 04 android:layout_width="fill_parent " 05 android:layout_height="fill_parent"> 06 07 08 <ImageView android:id="@+id/img" 09 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:layout_margin="5px"/> 12 13 <LinearLayout android:orientation="vertical" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content"> 16 17 <TextView android:id="@+id/title" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:textcolor="#ffffffff" 21 android:textsize="22px" /> 22 <TextView android:id="@+id/info" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" 25 android:textcolor="#ffffffff" 26 android:textsize="13px" /> 27 28 </LinearLayout> 29 30 31 <Button android:id="@+id/view_btn" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" 34 android:text="@string/s_view_btn"

35 android:layout_gravity="bottom right" /> 36 </LinearLayout> 程 序 代 码 : view source print? 001 /** 002 * @author allin 003 * 004 */ 005 public class MyListView4 extends ListActivity { 008 private List<Map<String, Object>> mdata; 010 @Override 011 public void oncreate(bundle savedinstancestate) { 012 super.oncreate(savedinstancestate); 013 mdata = getdata(); 014 MyAdapter adapter = new MyAdapter(this); 015 setlistadapter(adapter); 016 } 017 018 private List<Map<String, Object>> getdata() { List<Map<String, Object>> list = new ArrayList<Map<String, 019 Object>>(); 020 021 Map<String, Object> map = new HashMap<String, Object>(); 022 map.put("title", "G1"); 023 map.put("info", "google 1"); 024 map.put("img", R.drawable.i1); 025 list.add(map); 026 027 map = new HashMap<String, Object>(); 028 map.put("title", "G2"); 029 map.put("info", "google 2"); 030 map.put("img", R.drawable.i2); 031 list.add(map); 032 033 map = new HashMap<String, Object>(); 034 map.put("title", "G3");

035 map.put("info", "google 3"); 036 map.put("img", R.drawable.i3); 037 list.add(map); 038 039 return list; 040 } 041 042 // ListView 中 某 项 被 选 中 后 的 逻 辑 043 @Override protected void onlistitemclick(listview l, View v, int position, 044 long id) { 045 Log.v("MyListView4-click", 046 (String)mData.get(position).get("title")); 047 } 048 049 /** 050 * listview 中 点 击 按 键 弹 出 对 话 框 051 */ 052 public void showinfo(){ 053 new AlertDialog.Builder(this) 054.setTitle(" 我 的 listview") 055.setMessage(" 介 绍...").setPositiveButton(" 确 定 ", 056 new DialogInterface.OnClickListener() { 057 @Override 058 public void onclick(dialoginterface dialog, int which) { 059 } 060 }) 061.show(); 062 067 public final class ViewHolder{ 068 public ImageView img; 069 public TextView title; 070 public TextView info; 071 public Button viewbtn; } 072 075

public class MyAdapter extends BaseAdapter{ 076 077 private LayoutInflater minflater; 080 public MyAdapter(Context context){ 081 this.minflater = LayoutInflater.from(context); 082 } 083 @Override 084 public int getcount() { 085 // TODO Auto-generated method stub 086 return mdata.size(); 087 } 088 089 @Override 090 public Object getitem(int arg0) { 091 // TODO Auto-generated method stub 092 return null; 093 } 094 095 @Override 096 public long getitemid(int arg0) { 097 // TODO Auto-generated method stub 098 return 0; 099 } 100 101 @Override public View getview(int position, View convertview, ViewGroup 102 parent) { 103 104 ViewHolder holder = null; 105 if (convertview == null) { 107 holder=new ViewHolder(); 109 convertview = minflater.inflate(r.layout.vlist2, null); 110 holder.img = (ImageView)convertView.findViewById(R.id.img); 111 holder.title = (TextView)convertView.findViewById(R.id.title); 112 holder.info = (TextView)convertView.findViewById(R.id.info); 113 holder.viewbtn = (Button)convertView.findViewById(R.id.view_btn); 114 convertview.settag(holder); 115 116 }else { 117

118 holder = (ViewHolder)convertView.getTag(); 119 } 120 12 2 holder.img.setbackgroundresource((integer)mdata.get(position).ge t("img")); 123 holder.title.settext((string)mdata.get(position).get("title")); 124 holder.info.settext((string)mdata.get(position).get("info")); 125 126 holder.viewbtn.setonclicklistener(new View.OnClickListener() { 127 128 @Override 129 public void onclick(view v) { 130 showinfo(); 131 } 132 }); 133 134 135 return convertview; 136 } 137 下 面 将 对 上 述 代 码, 做 详 细 的 解 释,listView 在 开 始 绘 制 的 时 候, 系 统 首 先 调 用 getc ount() 函 数, 根 据 他 的 返 回 值 得 到 listview 的 长 度 ( 这 也 是 为 什 么 在 开 始 的 第 一 张 图 特 别 的 标 出 列 表 长 度 ), 然 后 根 据 这 个 长 度, 调 用 getview() 逐 一 绘 制 每 一 行 如 果 你 的 g etcount() 返 回 值 是 0 的 话, 列 表 将 不 显 示 同 样 return 1, 就 只 显 示 一 行 系 统 显 示 列 表 时, 首 先 实 例 化 一 个 适 配 器 ( 这 里 将 实 例 化 自 定 义 的 适 配 器 ) 当 手 动 完 成 适 配 时, 必 须 手 动 映 射 数 据, 这 需 要 重 写 getview() 方 法 系 统 在 绘 制 列 表 的 每 一 行 的 时 候 将 调 用 此 方 法 getview() 有 三 个 参 数,position 表 示 将 显 示 的 是 第 几 行,covert View 是 从 布 局 文 件 中 inflate 来 的 布 局 我 们 用 LayoutInflater 的 方 法 将 定 义 好 的 vlist 2.xml 文 件 提 取 成 View 实 例 用 来 显 示 然 后 将 xml 文 件 中 的 各 个 组 件 实 例 化 ( 简 单 的 fi ndviewbyid() 方 法 ) 这 样 便 可 以 将 数 据 对 应 到 各 个 组 件 上 了 但 是 按 钮 为 了 响 应 点 击 事 件, 需 要 为 它 添 加 点 击 监 听 器, 这 样 就 能 捕 获 点 击 事 件 至 此 一 个 自 定 义 的 listview 就 完 成 了, 现 在 让 我 们 回 过 头 从 新 审 视 这 个 过 程 系 统 要 绘 制 ListView 了, 他 首 先 获 得 要 绘 制 的 这 个 列 表 的 长 度, 然 后 开 始 绘 制 第 一 行, 怎 么 绘 制 呢? 调 用 getview() 函 数 在 这 个 函 数 里 面 首 先 获 得 一 个 View( 实 际 上 是 一 个 ViewGroup), 然 后 再 实 例 并 设 置 各 个 组 件, 显

示 之 好 了, 绘 制 完 这 一 行 了 那 再 绘 制 下 一 行, 直 到 绘 完 为 止 在 实 际 的 运 行 过 程 中 会 发 现 listview 的 每 一 行 没 有 焦 点 了, 这 是 因 为 Button 抢 夺 了 listview 的 焦 点, 只 要 布 局 文 件 中 将 Button 设 置 为 没 有 焦 点 就 OK 了 Android API Demo 研 究 (2) 文 章 分 类 : 移 动 开 发 1. Forwarding 这 个 实 现 很 简 单, 就 是 启 动 新 的 Activity 或 者 Service 后, 增 加 一 个 finish() 语 句 就 可 以 了, 这 个 语 句 会 主 动 将 当 前 activity 从 历 史 stack 中 清 除, 这 样 back 操 作 就 不 会 打 开 当 前 activity 做 这 个 实 验 的 时 候, 发 现 开 发 Android 程 序 需 要 注 意 的 一 点 小 问 题 : 增 加 新 的 activity 时, 不 能 只 增 加 一 个 class, 一 定 要 记 得 要 在 manifest 文 件 中 增 加 该 activity 的 描 述 ( 这 个 简 单 的 功 能, 未 来 google 应 该 给 增 加 吧 ) android:name 中 的 点 意 义 : 首 先 manifest 会 有 一 个 默 认 指 定 的 package 属 性, 比 如 指 定 为 "com.android.sample", 如 果 我 们 增 加 的 activity 的 实 现 也 在 这 个 package 下, 则 android:name 为 实 现 的 类 名, 这 个 类 名 前 加 不 加 点 都 没 有 关 系, 都 会 自 动 找 到 该 实 现, 比 如 实 现 为 forwardtarget, 则 android:name 写 成 forwardtarget 或 者.forwardtarget 都 可 以 唯 一 有 区 别 的 是, 如 果 activity 的 实 现 是 在 默 认 包 的 子 包 里 面, 则 前 面 这 个 点 就 尤 为 重 要, 比 如 activity 的 实 现 是 com.android.sample.app.forwardtarget, 则 android:name 必 须 写 成.app.forwardtarget 或 者 com.android.sample.app.forwardtarget 如 果 只 写 app.forwardtarget, 通 常 编 辑 器 就 会 提 示 该 类 找 不 到, 但 不 巧 的 是, 你 恰 好 有 一 个 类 是 app.forwardtarget, 那 你 只 有 等 着 运 行 时 报 错 吧 所 以 建 议 养 成 习 惯 只 要 是 默 认 package 下 面 的 类, 无 论 是 否 是 在 子 包 里 面, 前 面 都 要 加 上 一 个 点, 现 在 当 前 实 现 是 在 默 认 package 下 2.Persistent 这 里 的 持 久 化 其 实 就 是 本 地 配 置 文 件 的 读 写, 实 现 方 法 是 通 过 Activity.getPreferences(int) 获 取 SharedPreferences 对 象, 然 后 操 作 配 置 文 件 的 读 写, 值 得 注 意 的 是 以 下 几 点 : 1)Activity.getPreferences(int mode) 等 价 于 Content.getSharedPreferences(String filename,int mode), 这 里 面 的 filename 就 是 当 前 class 的 名 称, 例 如 在 PersistentTest 类 中 调 用 getpreferences(0), 等 价 于 调 用 getpreferences("persistenttest", 0) 如 不 想 用 class name 做 文 件 名, 可 以 直 接 调 用 getsharedpreferences 方 法, 自 己 指 定 配 置 文 件 的 名 称

2)mode 值 的 定 义 : MODE_PRIVATE = 0, 表 示 当 前 配 置 文 件 为 私 有 文 件, 只 有 当 前 的 应 用 可 以 访 问 MODE_WORLD_READABLE = 1, 表 示 当 前 配 置 文 件 可 以 被 其 他 应 用 读 取 MODE_WORLD_WRITEABLE = 2, 表 示 当 前 配 置 文 件 可 以 被 其 他 应 用 写 入 如 果 配 置 文 件 又 想 被 人 读 又 想 被 写 人, 怎 么 办 呢, 呵 呵, 当 然 是 MODE_WORLD_READABLE&MODE_WORLD_WRITEABLE, 真 的 怀 疑 设 计 android 的 人 以 前 是 做 C/C++ 的 3)SharedPreferences 是 个 很 有 意 思 的 实 现, 读 取 数 据 的 时 候, 直 接 用 get 方 法 就 可 以 了, 可 是 写 数 据 的 时 候, 没 用 给 set 方 法, 呵 呵, 第 一 次 用 这 个 类 一 定 会 以 为 只 能 读 不 能 写 如 果 要 写 数 据 的 话, 需 要 用 editor() 方 法 ( 为 什 么 不 是 geteditor() 呢? 看 来 设 计 的 人 一 定 是 做 C/C++ 的 ) 获 取 SharedPreferences.Editor 类, 然 后 用 这 个 类 的 put 方 法 写 文 件 为 什 么 要 这 样 做 呢? 好 久 没 有 看 设 计 模 式 了, 不 知 道 他 采 用 是 哪 种 高 级 模 式, 等 以 后 有 时 间, 看 看 它 的 实 现 再 做 研 究 吧 4) 在 这 个 实 现 中, 读 文 件 是 放 在 onresume() 中, 写 文 件 是 在 onpause() 中, 为 什 么 要 这 么 做 呢, 看 字 面 意 思, 好 像 只 有 恢 复 和 暂 停 的 时 候 才 会 被 执 行, 那 程 序 第 一 次 创 建 的 时 候 会 读 文 件 吗? 来 让 我 们 看 看 Activity 的 生 命 周 期, 就 会 发 现 这 么 做 的 巧 妙 之 处 : 文 章 分 类 : 移 动 开 发 1. Custom Dialog Android 支 持 自 定 义 窗 口 的 风 格 : 1) 首 先 在 资 源 里 面 建 立 style 的 value; example: <style name="theme.customdialog" parent="android:style/theme.dialog"> <item name="android:windowbackground">@drawable/filled_box </item> </style>

drawable/filled_box.xml <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#f0600000"/> <stroke android:width="3dp" color="#ffff8080"/> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> PS: 关 于 Styles 的 学 习, 可 以 参 见 : http://code.google.com/android/reference/available-resour ces.html#stylesandthemes 2) 设 置 当 前 activity 的 属 性, 两 种 方 式 :1. 在 manifest 文 件 中 给 指 定 的 activity 增 加 属 性 android:theme="@android:style/theme.customdialog" 2. 在 程 序 中 增 加 语 句 settheme(r.style.theme_customdialog); PS1: 如 果 只 是 将 Acticity 显 示 为 默 认 的 Dialog, 跳 过 第 一 步, 只 需 要 在 manifest 文 中 增 加 属 性 : android:theme="@android:style/theme.dialog" 或 者 在 程 序 中 增 加 settheme(android.r.style.theme_dialog). PS2: 其 他 创 建 Dialog 的 方 法 : 创 建 app.dialog 类 或 者 创 建 app.alertdialog 类 Next Study: 能 不 能 在 Activity 已 经 打 开 以 后 动 态 修 改 当 前 Activity 的 风 格? 在 测 试 中 发 现, 在 oncreate() 事 件 中 增 加 settheme(), 必 须 在 setcontentview() 之 前, 否 则 指 定 Style 不 能 生 效 2.Custom Title Android 除 了 可 以 为 指 定 的 Activity 设 置 显 示 风 格, 此 外 也 可 以 为 指 定 的 Activity 设 置 一 些 特 效, 比 如 自 定 义 Title, 没 有 Title 的 Activity 或 者 增 加 一 个 ICON 等

有 意 思 的 一 点 是, 这 些 特 效 并 不 是 你 想 设 置 的 时 候 就 行 设 置, 你 需 要 在 Activity 显 示 之 前 向 系 统 申 请 要 显 示 的 特 效, 这 样 才 能 在 下 面 的 程 序 中 为 这 些 特 效 进 行 设 置 ( 这 样 是 不 是 多 此 一 举 有 待 研 究 ) 为 一 个 Activity 设 置 自 定 义 Title 的 流 程 : 1) 为 自 定 义 的 Title 建 立 一 个 layout(custom_title_1.xml) <RelativeLayout xmlns:android="http://schemas.android.com /apk/res/android" android:id="@+id/screen" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/left_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:text="left" /> <TextView android:id="@+id/right_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:text="right" /> </RelativeLayout> 关 于 为 什 么 采 用 RelativeLayout, 可 以 参 见 : http://code.google.com/android/devel/ui/layout.html 2) 为 activity 设 定 自 定 义 Title 特 效 并 指 定 Title 的 layout: 在 oncreate() 事 件 中 增 加 : requestwindowfeature(window.feature_custom_title); setcontentview(r.layout.custom_title); getwindow().setfeatureint(window.feature_custom_title, R.layout.custom_title_1); 这 三 条 语 句 的 次 序 不 能 颠 倒, 依 次 为 申 请 特 效, 创 建 view, 设 置 特 效 属 性 其 中 requestwindowfeature 等 价 于 getwindow().requestfeature()

3) 在 需 要 修 改 Title 的 地 方, 获 取 left_text 或 者 right_text 进 行 设 置 即 可 Next Study:Activity 的 其 他 显 示 特 效 Window 还 有 其 他 一 些 feature, 比 如 FEATURE_CONTEXT_MENU,FEATURE_NO_TITLE, FEATURE_LEFT_ICON 等, 有 待 继 续 学 习 研 究 Animations( 转 ) 文 章 分 类 : 移 动 开 发 仅 用 于 方 便 查 找 Animations 链 接 Android 支 持 2 种 类 型 的 动 画 内 插 动 画 可 以 应 用 于 旋 转 平 移 放 缩 和 渐 变 ; frame-by-frame 动 画 用 来 显 示 一 系 列 的 图 片 关 于 创 建 使 用 和 应 用 动 画 的 广 泛 概 述 可 以 在 11 章 找 到 把 动 画 定 义 成 外 部 资 源, 有 利 于 在 多 个 地 方 使 用, 并 且 能 基 于 设 备 硬 件 或 方 向 选 择 适 应 的 动 画 Tweened Animations 每 个 内 插 动 画 以 独 立 的 XML 文 件 存 储 在 /res/anim 文 件 夹 下 和 layouts 和 drawable 资 源 一 样, 动 画 XML 的 文 件 名 用 作 资 源 的 标 识 每 个 动 画 可 以 用 来 定 义 以 下 的 变 化 :alpha( 渐 变 ) scale( 放 缩 ) translate ( 平 移 ) 和 rotate( 旋 转 ) 每 个 类 型 的 动 画 都 有 特 性 来 定 义 内 插 序 列 如 何 作 用 : Alpha fromalpha/toalpha 0-1 Scale fromxscale/toxscale 0-1 fromyscale/toyscale 0-1 pivotx/pivoty 图 像 的 宽 度 / 高 度 的 百 分 比 字 符 串 0%-100%

Translate fromx/tox 0-1 fromy/toy 0-1 Rotate fromdegrees/todegrees 0-360 pivotx/pivoty 图 像 的 宽 度 / 高 度 的 百 分 比 字 符 串 0%-100% 你 可 以 使 用 <set/> 标 签 来 创 建 多 个 动 画 一 个 动 画 集 包 含 一 个 到 多 个 动 画 变 化, 并 且 支 持 一 些 额 外 的 标 签 和 特 性 来 定 制 动 画 集 中 的 动 画 何 时 以 及 怎 样 运 行 接 下 来 的 列 表 给 了 一 些 set 标 签 一 些 特 性 : duration 动 画 的 持 续 时 间 ( 毫 秒 ) startoffset 启 动 动 画 的 延 时 ( 毫 秒 ) fillbefore fillafter True 表 示 在 动 画 开 始 前 应 用 动 画 变 换 True 表 示 动 画 开 始 后 应 用 动 画 变 换 interpolator 设 置 整 个 时 间 范 围 如 何 影 响 动 画 的 速 度 在 11 章 中 会 探 讨 这 个 变 量 指 定 interpolator 时 需 要 引 用 系 统 的 动 画 资 源 (android:anim/interpolatorname) 如 果 你 不 使 用 startoffset 标 签, 动 画 集 中 的 动 画 将 同 步 执 行 接 下 来 的 例 子 显 示 了 动 画 集 控 制 目 标 在 缩 小 淡 出 的 同 时 旋 转 360 度 : Xml 代 码 Java 代 码 1. <?xml version= 1.0 encoding= utf-8?> 2. 3. <set xmlns:android= http://schemas.android.com/apk/res/androi d 4. 5. android:interpolator= @android:anim/accelerate_interpolator > 6. 7. <rotate 8.

9. android:fromdegrees= 0 10. 11.android:toDegrees= 360 12. 13.android:pivotX= 50% 14. 15.android:pivotY= 50% 16. 17.android:startOffset= 500 18. 19.android:duration= 1000 /> 20. 21.<scale 22. 23.android:fromXScale= 1.0 24. 25.android:toXScale= 0.0 26. 27.android:fromYScale= 1.0 28. 29.android:toYScale= 0.0 30. 31.android:pivotX= 50% 32. 33.android:pivotY= 50% 34. 35.android:startOffset= 500 36. 37.android:duration= 500 /> 38. 39.<alpha 40. 41.android:fromAlpha= 1.0 42. 43.android:toAlpha= 0.0 44. 45.android:startOffset= 500 46. 47.android:duration= 500 /> 48. 49.</set>

Frame-by-Frame Animations Frame-by-Frame 动 画 用 于 View 的 背 景 上, 显 示 一 系 列 的 图 片, 每 张 图 片 显 示 指 定 的 时 间 因 为 Frame-by-Frame 动 画 显 示 drawables, 所 以, 它 们 也 被 放 在 /res/drawble 文 件 夹 下 ( 和 Tweened 动 画 不 同 ), 并 且 使 用 它 们 的 文 件 名 作 为 它 们 的 资 源 标 识 接 下 来 的 XML 片 段 显 示 了 一 个 简 单 的 动 画, 它 循 环 显 示 一 些 位 图 资 源, 每 张 位 图 显 示 0.5 秒 为 了 能 使 用 这 个 XML 片 段, 你 需 要 创 建 rocket1-rocket3 三 个 新 的 图 片 资 源 Java 代 码 1. Xml 代 码 2. <animation-list 3. 4. xmlns:android= http://schemas.android.com/apk/res/android 5. 6. android:oneshot= false > 7. 8. <item android:drawable= @drawable/rocket1 android:duration= 500 /> 9. 10.<item android:drawable= @drawable/rocket2 android:duration= 500 /> 11. 12.<item android:drawable= @drawable/rocket3 android:duration= 500 /> 13. 14.</animation-list>

看 到 了 吧, 在 Activity 运 行 的 前 后, 无 论 状 态 怎 么 转 移,onResume() 和 onpause() 一 定 会 被 执 行, 与 其 说 实 现 的 巧 妙, 还 不 如 赞 一 下 这 个 生 命 周 期 的 设 计 的 巧 妙, 这 个 巧 妙 不 是 说 说 而 已, 有 时 间 的 话, 看 看 MFC 中 一 个 windows 或 者 dialog 的 生 命 周 期, 你 就 知 道 这 个 巧 妙 的 含 义 了, 我 们 可 以 省 多 少 的 事 情 啊! 所 以 值 得 记 住 的 是, 在 android 中 想 在 运 行 前 后 必 须 要 执 行 的 语 句, 就 应 该 放 在 onresume() 和 onpause() 中 4) 最 后 说 一 个 对 android 小 不 爽 的 地 方 :drawable, 什 么 鬼 东 西 啊! 在 res/drawable 放 一 个 文 件, 访 问 的 时 候 是 drawable/name, 如 果 在 values 里 面 建 立 一 个 drawable 的 变 量, 访 问 的 时 候 也 是 drawable/name, 例 如 在

drawable 目 录 下 放 入 一 个 red.xml 文 件, 访 问 的 时 候 是 @drawable/red, 如 果 建 立 一 个 drawable 的 变 量 red, 访 问 也 是 @drawable/red, 这 完 全 就 是 两 个 东 西 啊, 虽 然 最 新 的 编 辑 器 会 提 示 重 名, 但 查 找 的 时 候 真 的 很 不 方 便 啊, 尤 其 是 drawable 变 量, 可 以 放 在 一 个 abc.xml 中, 以 后 资 源 文 件 多 了, 管 理 起 来 想 想 都 头 麻, 就 不 能 把 其 中 一 个 改 改 名 字 吗? 把 drawable 变 量 叫 成 drawable_value 不 行 吗? 用 GridView 实 现 Gallery 的 效 果 ( 转 ) 在 实 现 横 向 的 类 似 Gallery 的 效 果 中 做 了 实 现 Gallery 的 尝 试, 但 是 效 果 不 好 使 用 的 是 TableLayout, 出 现 了 横 向 拖 动 图 片 的 时 候, 因 为 有 倾 斜 ( 轻 微 的 竖 向 拖 动 ), 会 整 个 列 表 竖 向 滚 动 其 实 这 个 问 题 可 以 将 TableRow 中 条 目 设 置 为 clickable 来 解 决 但 是 效 果 依 然 不 好 这 次 尝 试 通 过 GridView 来 解 决 问 题, 效 果 很 好, 见 截 图 : 基 本 思 路 是 : 每 个 可 选 的 图, 包 括 文 字 部 分, 是 GridView 中 的 一 个 条 目 ; 一 个 GridView 条 目 是 相 对 布 局 (RelativeLayout), 里 面 包 含 一 个 图 片 (ImageView) 和 一 个 文 字 (TextView); 关 键 点 是 GridView 如 何 保 持 横 向, 默 认 的 情 况 下 会 折 行 的, 首 先 要 用 一 个 HorizontalScrollView 提 供 横 向 滚 动 容 器, 然 后 内 部 放 置 一 个 FrameLayout, 如 果 不 放 置 FrameLayout 布 局, 直 接 放 入 下 面 的 布 局 或 者 视 图,GridView 将 会 变 成 单 列 纵 向 滚 动, 在 FrameLayout 布 局 中 加 入 横 向 的 LinearLayout 布 局, 要 设 置 它 的 layout_width, 要 足 够 大, 这 样 在 其 中 加 入 GridView 就 能 横 向 排 列 了 首 先 看 一 下 GridView 中 条 目 的 布 局 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android" android:paddingbottom="10.0dip" android:layout_width="90.0dip" android:layout_height="140.0dip"> <ImageView android:id="@+id/itemimage" android:layout_width="80.0dip" android:layout_height="108.0dip" android:layout_marginleft="10.0dip" android:layout_centerhorizontal="true"> </ImageView> <TextView android:layout_below="@+id/itemimage" android:id="@+id/itemtext" android:ellipsize="end" android:layout_width="80.0dip" android:layout_height="26.0dip" android:layout_margintop="5.0dip" android:singleline="true" android:layout_centerhorizontal="true"> </TextView> </RelativeLayout> 这 里 使 用 了 相 对 布 局 的 特 性,android:layout_below, 表 示 TextView 在 ImageView 下 面 这 里 的 图 都 是 用 的 res/drawable 目 录 下 的 静 态 图 形 文 件, 正 式 情 况 下, 应 该 是 从 网 络 获 取, 可 参 见 用 Java concurrent 编 写 异 步 加 载 图 片 功 能 的 原 型 实 现, 二 者 结 合 可 用 于 正 式 生 产 环 境 ListView 的 Header 使 用 了 自 定 义 视 图, 更 简 单 的 示 例 可 参 见 为 ListView 增 加 Header 表 头 (ListView Header) 的 布 局 文 件 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="200dp"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 最 近 访 问 人 物 " /> <HorizontalScrollView android:layout_width="fill_parent" android:layout_height="160dp"> <FrameLayout android:layout_width="fill_parent" android:layout_height="match_parent">

<LinearLayout android:layout_width="1100dp" android:layout_height="match_parent" android:orientation="horizontal"> <GridView android:id="@+id/grid" android:layout_width="fill_parent" android:gravity="center" android:layout_height="fill_parent" android:horizontalspacing="1.0dip" android:verticalspacing="1.0dip" android:stretchmode="spacingwidthuniform" android:numcolumns="auto_fit" android:columnwidth="80dip"> </GridView> </LinearLayout> </FrameLayout> </HorizontalScrollView> </LinearLayout> 这 是 比 较 关 键 的 布 局 文 件,GridView 能 实 现 横 向 滚 动 主 要 靠 它 了 其 中 : <LinearLayout android:layout_width="1100dp" 我 是 写 死 了 1100dp, 正 式 使 用 的 时 候, 因 为 图 片 都 可 能 是 动 态 从 服 务 器 上 获 取 的, 可 以 根 据 数 量 以 及 图 片 的 宽 度, 空 白 边 动 态 计 算 这 个 长 度 GridView 和 ListView 类 似, 都 需 要 ViewAdapter 来 适 配 数 据 和 视 图 见 Activity 的 源 代 码 : package com.easymorse.grid.demo; import java.util.arraylist; import java.util.hashmap; import android.app.listactivity; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.widget.arrayadapter; import android.widget.gridview; import android.widget.listview; import android.widget.simpleadapter; public class GridDemoActivity extends ListActivity { /** Called when the activity is first created. */ @Override

public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); LayoutInflater layoutinflater = (LayoutInflater) this.getsystemservice("layout_inflater"); View headerview=layoutinflater.inflate(r.layout.list_header, null); setgridview(headerview); ListView listview=(listview) this.findviewbyid(android.r.id.list); listview.addheaderview(headerview); listview.setadapter(new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1,new String[]{" 隋 "," 唐 "," 宋 "," 元 "," 明 "," 清 "})); } private void setgridview(view view) { GridView gridview = (GridView) view.findviewbyid(r.id.grid); gridview.setnumcolumns(10); ArrayList<HashMap<String, Object>> items = new ArrayList<HashMap<String, Object>>(); Object>(); for (int i = 0; i < 10; i++) { HashMap<String, Object> map = new HashMap<String, } map.put("itemimage", R.drawable.k); map.put("itemtext", " 清. 康 熙 " + "(" + i + ")"); items.add(map); R.layout.item, new int[] { SimpleAdapter adapter = new SimpleAdapter(this, items, R.id.ItemText }); gridview.setadapter(adapter); } } new String[] { "ItemImage", "ItemText" }, R.id.ItemImage,

Android 画 图 之 Matrix( 一 ) Matrix, 中 文 里 叫 矩 阵, 高 等 数 学 里 有 介 绍, 在 图 像 处 理 方 面, 主 要 是 用 于 平 面 的 缩 放 平 移 旋 转 等 操 作 首 先 介 绍 一 下 矩 阵 运 算 加 法 和 减 法 就 不 用 说 了, 太 简 单 了, 对 应 位 相 加 就 好 图 像 处 理, 主 要 用 到 的 是 乘 法 下 面 是 一 个 乘 法 的 公 式 : 在 Android 里 面, Matrix 由 9 个 float 值 构 成, 是 一 个 3*3 的 矩 阵 如 下 图 没 专 业 工 具, 画 的 挺 难 看 解 释 一 下, 上 面 的 sinx 和 cosx, 表 示 旋 转 角 度 的 cos 值 和 sin 值, 注 意, 旋 转 角 度 是 按 顺 时 针 方 向 计 算 的 translatex 和 translatey 表 示 x 和 y 的 平 移 量 scale 是 缩 放 的 比 例, 1 是 不 变, 2 是 表 示 缩 放 1/2, 这 样 子 下 面 在 Android 上 试 试 Matrix 的 效 果 Java 代 码 1. public class MyView extends View { 2. 3. private Bitmap mbitmap; 4. 5. private Matrix mmatrix = new Matrix(); 6. 7. public MyView(Context context) { 8. 9. super(context); 10. 11. initialize(); 12. 13. } 14. 15. private void initialize() { 16. 17. mbitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.sho 18. w)).getbitmap();

19. float cosvalue = (float) Math.cos(-Math.PI/6); 20. 21. float sinvalue = (float) Math.sin(-Math.PI/6); 22. 23. mmatrix.setvalues( 24. 25. new float[]{ 26. 27. cosvalue, -sinvalue, 100, 28. 29. sinvalue, cosvalue, 100, 30. 31. 0, 0, 2}); 32. 33. } 34. 35. @Override protected void ondraw(canvas canvas) { 36. 37. // super.ondraw(canvas); // 当 然, 如 果 界 面 上 还 有 其 他 元 素 需 要 绘 制, 只 需 要 将 这 句 话 写 上 就 行 了 38. 39. canvas.drawbitmap(mbitmap, mmatrix, null); 40. 41. } 42. 43. } 运 行 结 果 如 下 :

以 左 上 角 为 顶 点, 缩 放 一 半, 逆 时 针 旋 转 30 度, 然 后 沿 x 轴 和 y 轴 分 别 平 移 50 个 像 素, 代 码 里 面 写 的 是 100, 为 什 么 是 平 移 50 呢, 因 为 缩 放 了 一 半 大 家 可 以 自 己 设 置 一 下 Matrix 的 值, 或 者 尝 试 一 下 两 个 Matrix 相 乘, 得 到 的 值 设 置 进 去, 这 样 才 能 对 Matrix 更 加 熟 练 这 里 讲 的 直 接 赋 值 的 方 式 也 许 有 点 不 好 理 解, 不 过 还 好, andrid 提 供 了 对 矩 阵 的 更 方 便 的 方 法, 下 一 篇 介 绍 Android 画 图 之 Matrix( 二 ) 文 章 分 类 : 移 动 开 发 上 一 篇 Android 画 图 之 Matrix( 一 ) 讲 了 一 下 Matrix 的 原 理 和 运 算 方 法, 涉 及 到 高 等 数 学, 有 点 难 以 理 解 还 好 Android 里 面 提 供 了 对 Matrix 操 作 的 一 系 列 方 便 的 接 口

Matrix 的 操 作, 总 共 分 为 translate( 平 移 ),rotate( 旋 转 ),scale ( 缩 放 ) 和 skew( 倾 斜 ) 四 种, 每 一 种 变 换 在 Android 的 API 里 都 提 供 了 set, post 和 pre 三 种 操 作 方 式, 除 了 translate, 其 他 三 种 操 作 都 可 以 指 定 中 心 点 变 掉 set 是 直 接 设 置 Matrix 的 值, 每 次 set 一 次, 整 个 Matrix 的 数 组 都 会 post 是 后 乘, 当 前 的 矩 阵 乘 以 参 数 给 出 的 矩 阵 可 以 连 续 多 次 使 用 post, 来 完 成 所 需 的 整 个 变 换 例 如, 要 将 一 个 图 片 旋 转 30 度, 然 后 平 移 到 (100,100) 的 地 方, 那 么 可 以 这 样 做 : Java 代 码 1. Matrix m = new Matrix(); 2. 3. m.postrotate(30 ); 4. 5. m.posttranslate(100, 100 ); 这 样 就 达 到 了 想 要 的 效 果 pre 是 前 乘, 参 数 给 出 的 矩 阵 乘 以 当 前 的 矩 阵 所 以 操 作 是 在 当 前 矩 阵 的 最 前 面 发 生 的 例 如 上 面 的 例 子, 如 果 用 pre 的 话, 就 要 这 样 : Java 代 码 1. Matrix m = new Matrix(); 2. 3. m.settranslate(100, 100 ); 4. 5. m.prerotate(30 );

旋 转 缩 放 和 倾 斜 都 可 以 围 绕 一 个 中 心 点 来 进 行, 如 果 不 指 定, 默 认 情 况 下, 是 围 绕 (0,0) 点 来 进 行 Java 代 码 下 面 给 出 一 个 例 子 1. package chroya.demo.graphics; 2. 3. import android.content.context; 4. import android.graphics.bitmap; 5. import android.graphics.canvas; 6. import android.graphics.matrix; 7. import android.graphics.rect; 8. import android.graphics.drawable.bitmapdrawable; 9. import android.util.displaymetrics; 10.import android.view.motionevent; 11.import android.view.view; 12. 13.public class MyView extends View { 14. 15. private Bitmap mbitmap; 16. private Matrix mmatrix = new Matrix(); 17. 18. public MyView(Context context) { 19. super (context); 20. initialize(); 21. } 22. 23. private void initialize() { 24. 25. Bitmap bmp = ((BitmapDrawable)getResources().ge tdrawable(r.drawable.show)).getbitmap(); 26. mbitmap = bmp; 27. /* 首 先, 将 缩 放 为 100*100 这 里 scale 的 参 数 是 比 例 有 一 点 要 注 意, 如 果 直 接 用 100/ 28.bmp.getWidth() 的 话, 会 得 到 0, 因 为 是 整 型 相 除, 所 以 必 须 其 中 有 一 个 是 float 型 的, 直 接 用 100f 就 好 */ 29. mmatrix.setscale(100f/bmp.getwidth(), 100f/bmp.ge theight()); 30. // 平 移 到 (100,100) 处 31. mmatrix.posttranslate(100, 100 );

32. // 倾 斜 x 和 y 轴, 以 (100,100) 为 中 心 33. mmatrix.postskew(0.2f, 0.2f, 100, 100 ); 34. } 35. 36. @Override protected void ondraw(canvas canvas) { 37.// super.ondraw(canvas); // 如 果 界 面 上 还 有 其 他 元 素 需 要 绘 制, 只 需 要 将 这 句 话 写 上 就 行 了 38. 39. canvas.drawbitmap(mbitmap, mmatrix, null ); 40. } 41.} 运 行 效 果 如 下 : 红 色 的 x 和 y 表 示 倾 斜 的 角 度, 下 面 是 x, 上 面 是 y 看 到 了 没,Matrix 就 这 么 简 单

XML 属 性 文 章 分 类 : 移 动 开 发 一 属 性 分 类 1. View 的 属 性 2. TextView 的 属 性 二 View 的 属 性 1. 基 础 属 性 android:id : 设 定 view 的 id 之 后 在 代 码 里 面 可 以 通 过 View.findViewById() 来 获 取 相 应 的 View android:tag : 设 定 view 的 tag 之 后 可 以 再 代 码 里 面 通 过 View.findViewByTag 来 获 取 相 应 的 View 2. 事 件 相 关 2.1 Click 事 件 相 关 android:clickable : view 是 否 能 对 click 事 件 作 出 反 应 值 域 true, false android:onclick : 当 view 被 click 之 后,view 的 context 的 哪 个 方 法 被 呼 叫 通 常 这 个 context 是 指 view 所 在 的 Acitvity 例 如 : android:onclick = 'sayhello'. 则 相 应 的 Activity 里 面 有 一 个 方 法 public void sayhello(view view) 方 法 当 这 个 view 被 click 之 后, sayhello 方 法 就 会 被 调 用 android:longclickable : view 是 否 可 以 对 长 时 间 的 click 事 件 作 出 反 应 值 域 true,false 2.1 Focus 事 件 相 关 android:focusable : view 是 否 能 响 应 焦 点 事 件 android: 三 TextView 的 属 性

其 他 的 属 性 请 参 考 :View 的 属 性 1 文 本 相 关 的 属 性 1.1 文 本 属 性 android:text 文 字 android:typeface : 设 定 字 体 android:textstyle : 风 格 值 域 bold,italic,normal 可 以 组 合 设 定 例 如 :bold italic android:textsize : 文 字 大 小 android:textcolor : 文 字 的 颜 色 android:textcolorhight : 文 字 被 选 择 的 时 候, 高 亮 的 颜 色 1.2 提 示 文 本 相 关 的 属 性 android:hint 当 文 本 内 容 为 空 时, 提 示 信 息 android:textcolorhint 提 示 文 本 的 颜 色 2. 输 入 内 容 的 控 制 android:number 只 能 输 入 数 字 值 域 integer, decimal, signed, 可 以 组 合 设 定 例 如 :integer signed 2010-10-22 Android 中 的 长 度 单 位 详 解 (dp sp px in pt mm) 文 章 分 类 : 移 动 开 发 看 到 有 很 多 网 友 不 太 理 解 dp sp 和 px 的 区 别 : 现 在 这 里 介 绍 一 下 dp 和 sp dp 也 就 是 dip 这 个 和 sp 基 本 类 似 如 果 设 置 表 示 长 度 高 度 等 属 性 时 可 以 使 用 dp 或 sp 但 如 果 设 置 字 体, 需 要 使 用 sp dp 是 与 密 度 无 关,sp 除 了 与 密 度 无 关 外, 还 与 scale 无 关 如 果 屏 幕 密 度 为 160, 这 时 dp 和 sp 和 px 是 一 样 的 1dp=1sp=1px, 但 如 果 使 用 px 作 单 位, 如 果 屏 幕 大 小 不 变 ( 假 设 还 是 3.2 寸 ), 而 屏 幕 密 度 变 成 了 320 那 么 原 来 TextView 的 宽 度 设 成 160px, 在 密 度 为 320 的 3.2 寸 屏 幕 里 看 要 比 在 密 度 为 160 的 3.2 寸 屏 幕 上 看 短 了 一 半 但 如 果 设 置 成 160dp 或 160sp 的 话 系 统 会 自 动 将 width 属 性 值 设 置 成 320px 的 也 就 是 160 * 320 / 160 其 中 320 / 160 可 称 为 密 度 比 例 因 子 也 就 是 说, 如 果 使 用 dp 和 sp, 系 统 会 根 据 屏 幕 密 度 的 变 化 自 动 进 行 转 换

下 面 看 一 下 其 他 单 位 的 含 义 px: 表 示 屏 幕 实 际 的 象 素 例 如,320*480 的 屏 幕 在 横 向 有 320 个 象 素, 在 纵 向 有 480 个 象 素 in: 表 示 英 寸, 是 屏 幕 的 物 理 尺 寸 每 英 寸 等 于 2.54 厘 米 例 如, 形 容 手 机 屏 幕 大 小, 经 常 说,3.2( 英 ) 寸 3.5( 英 ) 寸 4( 英 ) 寸 就 是 指 这 个 单 位 这 些 尺 寸 是 屏 幕 的 对 角 线 长 度 如 果 手 机 的 屏 幕 是 3.2 英 寸, 表 示 手 机 的 屏 幕 ( 可 视 区 域 ) 对 角 线 长 度 是 3.2*2.54 = 8.128 厘 米 读 者 可 以 去 量 一 量 自 己 的 手 机 屏 幕, 看 和 实 际 的 尺 寸 是 否 一 致 mm: 表 示 毫 米, 是 屏 幕 的 物 理 尺 寸 pt: 表 示 一 个 点, 是 屏 幕 的 物 理 尺 寸 大 小 为 1 英 寸 的 1/72 原 创 -- 解 剖 android Style 原 理 从 Button 入 手 文 章 分 类 : 移 动 开 发 转 载 声 明 原 处 : 博 客 http://pk272205020.blog.163.com/ 参 考 论 坛 外 国 android 论 坛 http://www.androidpeople.com/ 参 考 资 料 :android Button 原 理 这 几 日 都 是 看 android SDK 原 码, 想 封 装 一 个 HERO 效 果 的 UI 界 面 刚 想 以 为 很 容 易, 但 越 做 越 难, 为 有 百 度,Google 求 救, 但 这 方 面 的 资 料 还 是 不 多, 这 个 我 也 不 怪 了, 可 能 android 在 中 国 的 市 场 还 是 刚 刚 起 步 外 面 的 一 些 网 站 android 技 术 论 坛 打 不 开, 闷... 但 我 发 现 http://www.android.com/ 可 以 打 开 了, 以 前 要 用 XX 软 件 先 打 得 开, 但 里 面 的 developer 标 签 还 是 俾 中 国 网 关 封, 这 个 更 郁 闷... 不 讲 了, 直 入 正 题 android Styel 原 理 刚 刚 开 始 得 写 时 从 最 简 单 的 Button 入 手, 下 载 SDK 原 码 候 Button 继 续 TextView 原 码 里 就 三 个 构 造 方 法... Java 代 码 1. @RemoteView 2. public class Button extends TextView {

3. public Button(Context context) { 4. this(context, null); 5. } 6. 7. public Button(Context context, AttributeSet attrs) { 8. this(context, attrs, com.android.internal.r.a ttr.buttonstyle); 9. } 10. 11. public Button(Context context, AttributeSet attrs, int defstyle) { 12. super(context, attrs, defstyle); 13. } 14.}[ 默 认 样 式 :com.android.internal.r.attr.buttonstyle,android 的 style 太 强 大, 网 上 有 人 说 过 是 GWT 模 式, 在 校 的 时 候 我 也 用 过 GWT 写 过 小 网 页,HTML 文 件 里 标 签 里 嵌 入 GWT 标 签, 通 过 服 务 端 Java 代 码 生 成 页 面,GWT 就 讲 到 这 里, 有 开 展 过 GWT 的 同 志 就 知 道 这 个 也 很 像 android 的 Layout 布 局 文 件, 哈 哈 我 也 是 认 同 网 上 的 人 说 知 道 android 的 Style 模 式 后, 我 们 要 进 一 步 了 解 内 部 的 实 现, 我 们 要 打 开 com.android.internal.r.attr.buttonstyle 这 个 对 应 的 XML Xml 代 码 1. < style name="widget.button" > 2. 3. < item name="android:background">@android:drawable/btn_defaul t< /item> 4. 5. < item name="android:focusable" >true< /item > 6. 7. < item name="android:clickable" >true< /item > 8. 9. < item name="android:textsize" >20sp< /item > 10. 11.< item name="android:textstyle" >normal< /item > 12. 13.< item name="android:textcolor" >@android:color/button_text </item >

14. 15.<item name="android:gravity">center_vertical center_horizontal> 16.< /item> 17. 18.< /style > 这 个 文 件 定 义 了 好 多 style 相 关 的 属 性, 每 个 属 性 都 好 理 解, 这 个 backgroud 属 性 难 道 仅 仅 是 一 个 drawable 图 片? 如 果 仅 仅 是 一 个 图 片 的 化, 怎 么 能 够 实 现 button 各 种 状 态 下 表 现 出 不 同 背 景 的 功 能 呢? 还 是 来 看 看 这 个 drawable 到 底 是 什 么 东 西 还 是 埋 头 苦 干 地 找 出 答 案 在 drwable 目 录 中 发 现 这 个 btn_default 这 个 文 件, 还 有 许 多 这 样 的 xml 文 件, 看 名 字 可 以 估 到 是 什 么 来 的 btn_default.xml 内 容 Xml 代 码 1. < selector xmlns:android="http://schemas.android.com/apk/res/ android"> 2. 3. < item android:state_window_focused="false" android:state_en abled="true" 4. android:drawable="@drawable/btn_default_normal" / > 5. 6. < item android:state_window_focused="false" android:state_ enabled="false" 7. android:drawable="@drawable/btn_default_normal_disable" / > 8. 9. < item android:state_pressed="true" 10.android:drawable="@drawable/btn_default_pressed" / > 11. 12.< item android:state_focused="true" android:state_enabled="t rue" 13.android:drawable="@drawable/btn_default_selected" / > 14. 15.< item android:state_enabled="true" 16.android:drawable="@drawable/btn_default_normal" / > 17. 18.< item android:state_focused="true"

19.android:drawable="@drawable/btn_default_normal_disable_focused" / > 20. 21.< item android:drawable="@drawable/btn_default_normal_disable " / > 22. 23.< /selector > 在 android 中 drawable 文 件 是 看 图 片 存 放 的, 最 普 通 的 就 是 一 个 图 片 而 这 里 用 到 的 是 StateListDrawable 当 Android 的 解 析 器 解 析 到 上 面 的 xml 时, 会 自 动 转 化 成 一 个 StateListDrawable 类 的 实 例, 看 看 SDK 是 这 样 说 的 Lets you assign a number of graphic images to a single Drawable and swap out the visible item by a string ID value. It can be defined in an XML file with the <selector> element. Each state Drawable is defined in a nested <item> element. For more information, see the guide to Drawable Resources. 意 思 就 是 通 过 字 符 串 标 识 符 值 ID 分 配 单 个 可 绘 制 可 切 换 的 可 视 图 形 项 看 看 核 心 代 码 吧 : 大 部 多 代 码 删 除 了 Java 代 码 1. public class StateListDrawable extends DrawableContainer { 2. /** 3. * To be proper, we should have a getter for dither (and alpha, etc.) 4. * so that proxy classes like this can save/restore their delegates' 5. * values, but we don't have getters. Since we do have s etters 6. * (e.g. setdither), which this proxy forwards on, we have to have some 7. * default/initial setting. 8. * 9. * The initial setting for dither is now true, since it almost always seems 10.* to improve the quality at negligible cost.

11.*/ 12.private static final boolean DEFAULT_DITHER = true; 13.private final StateListState mstateliststate; 14.private boolean mmutated; 15. 16.public StateListDrawable() { 17.this(null, null); 18.} 19. 20./** 21.* Add a new image/string ID to the set of images. 22.* 23.* @param stateset - An array of resource Ids to associat e with the image. 24.* Switch to this image by calling setstate(). 25.* @param drawable -The image to show. 26.*/ 27.public void addstate(int[] stateset, Drawable drawable) { 28.if (drawable!= null) { 29.mStateListState.addStateSet(stateSet, drawable); 30.// in case the new state matches our current state... 31.onStateChange(getState()); 32.} 33.} 34. 35.@Override 36.public boolean isstateful() { 37.return true; 38.} 39. 40.@Override 41.protected boolean onstatechange(int[] stateset) { 42.int idx = mstateliststate.indexofstateset(stateset); 43.if (idx < 0) { 44.idx = mstateliststate.indexofstateset(stateset.wild_card); 45.} 46.if (selectdrawable(idx)) { 47.return true; 48.} 49.return super.onstatechange(stateset); 50.} 51.

52. 53./** 54.* Gets the state set at an index. 55.* 56.* @param index The index of the state set. 57.* @return The state set at the index. 58.* @hide pending API council 59.* @see #getstatecount() 60.* @see #getstatedrawable(int) 61.*/ 62.public int[] getstateset(int index) { 63.return mstateliststate.mstatesets[index]; 64.} 65. 66. 67.static final class StateListState extends DrawableContainerSt ate { 68.private int[][] mstatesets; 69. 70.StateListState(StateListState orig, StateListDrawable owner, R esources res) { 71.super(orig, owner, res); 72. 73.if (orig!= null) { 74.mStateSets = orig.mstatesets; 75.} else { 76.mStateSets = new int[getchildren().length][]; 77.} 78.} 79. 80. 81. 82. 83. int addstateset(int[] stateset, Drawable drawable) { 84. final int pos = addchild(drawable); 85. mstatesets[pos] = stateset; 86. return pos; 87. } 88. 89. 90.} 91.

92.private StateListDrawable(StateListState state, Resources res) { 93.StateListState as = new StateListState(state, this, res); 94.mStateListState = as; 95.setConstantState(as); 96.onStateChange(getState()); 97.} 98.} xml 中 每 一 个 Item 就 对 应 一 种 状 态, 而 每 一 个 有 state_ 的 属 性 就 是 描 述 状 态, drawable 则 是 真 正 的 drawable 图 片 当 把 这 个 实 例 付 给 View 作 为 Background 的 时 候,View 会 根 据 不 同 的 state 来 切 换 不 同 状 态 的 图 片, 从 而 实 现 了 Press 等 诸 多 效 果 简 单 看 一 下 View 中 有 关 状 态 切 换 的 代 码 吧 : Java 代 码 1. /** 2. * The order here is very important to {@link #getdrawa blestate()} 3. */ 4. private static final int[][] VIEW_STATE_SETS = { 5. EMPTY_STATE_SET, // 0 0 0 0 0 6. WINDOW_FOCUSED_STATE_SET, // 0 0 0 0 1 7. SELECTED_STATE_SET, // 0 0 0 1 0 8. SELECTED_WINDOW_FOCUSED_STATE_SET, // 0 0 0 1 1 9. FOCUSED_STATE_SET, // 0 0 1 0 0 10.FOCUSED_WINDOW_FOCUSED_STATE_SET, // 0 0 1 0 1 11.FOCUSED_SELECTED_STATE_SET, // 0 0 1 1 0 12.FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 0 0 1 1 1 13.ENABLED_STATE_SET, // 0 1 0 0 0 14.ENABLED_WINDOW_FOCUSED_STATE_SET, // 0 1 0 0 1 15.ENABLED_SELECTED_STATE_SET, // 0 1 0 1 0 16.ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 0 1 0 1 1 17.ENABLED_FOCUSED_STATE_SET, // 0 1 1 0 0 18.ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET, // 0 1 1 0 1 19.ENABLED_FOCUSED_SELECTED_STATE_SET, // 0 1 1 1 0 20.ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 0 1 1 1 1 21.PRESSED_STATE_SET, // 1 0 0 0 0

22.PRESSED_WINDOW_FOCUSED_STATE_SET, // 1 0 0 0 1 23.PRESSED_SELECTED_STATE_SET, // 1 0 0 1 0 24.PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 1 0 0 1 1 25.PRESSED_FOCUSED_STATE_SET, // 1 0 1 0 0 26.PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET, // 1 0 1 0 1 27.PRESSED_FOCUSED_SELECTED_STATE_SET, // 1 0 1 1 0 28.PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 1 0 1 1 1 29.PRESSED_ENABLED_STATE_SET, // 1 1 0 0 0 30.PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET, // 1 1 0 0 1 31.PRESSED_ENABLED_SELECTED_STATE_SET, // 1 1 0 1 0 32.PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 1 1 0 1 1 33.PRESSED_ENABLED_FOCUSED_STATE_SET, // 1 1 1 0 0 34.PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET, // 1 1 1 0 1 35.PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET, // 1 1 1 1 0 36.PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 1 1 1 1 1 37.}; 详 细 打 开 View.java 自 己 看 下 面 是 setbackground 方 法, 红 字 就 是 是 state 切 换,View 这 个 类 太 长 了, android2.2 版 一 共 9321 行 Java 代 码 1. /** 2. * Set the background to a given Drawable, or remove the background. If the 3. * background has padding, this View's padding is set to the background's 4. * padding. However, when a background is remov ed, this View's padding isn't 5. * touched. If setting the padding is desired, please use 6. * {@link #setpadding(int, int, int, int)}. 7. *

8. * @param d The Drawable to use as the backgr ound, or null to remove the 9. * background 10. */ 11. public void setbackgrounddrawable(drawable d) { 12. boolean requestlayout = false; 13. 14. mbackgroundresource = 0; 15. 16.... 17. 18. if (d.isstateful()) { 19. d.setstate(getdrawablestate()); 20. } 21. d.setvisible(getvisibility() == VISIB LE, false); 22. mbgdrawable = d; 23. 24.... 25. 26. mbackgroundsizechanged = true; 27. invalidate(); 28.} setbackgound 方 法 先 判 断 Drawable 对 象 是 否 支 持 state 切 换 如 果 支 持, 设 置 状 态 就 可 达 到 图 片 切 换 的 效 果 就 写 到 这 里 Android----- 使 用 Button 特 效 selector+shape 文 章 分 类 : 移 动 开 发 当 然 除 了 使 用 drawable 这 样 的 图 片 外 今 天 谈 下 自 定 义 图 形 shape 的 方 法, 对 于 Button 控 件 Android 上 支 持 以 下 几 种 属 性 shape gradient stroke corners 等 我 们 就 以 目 前 系 统 的 Button 的 selector 为 例 说 下 :

Java 代 码 1. <shape> 2. <gradient 3. android:startcolor="#ff8c00" 4. android:endcolor="#ffffff" 5. android:angle="270" /> 6. <stroke 7. android:width="2dp" 8. android:color="#dcdcdc" /> 9. <corners 10. android:radius="2dp" /> 11.<padding 12. android:left="10dp" 13. android:top="10dp" 14. android:right="10dp" 15. android:bottom="10dp" /> 16.</shape> 对 于 上 面, 这 条 shape 的 定 义, 分 别 为 渐 变, 在 gradient 中 startcolor 属 性 为 开 始 的 颜 色, endcolor 为 渐 变 结 束 的 颜 色, 下 面 的 angle 是 角 度 接 下 来 是 stroke 可 以 理 解 为 边 缘,corners 为 拐 角 这 里 radius 属 性 为 半 径, 最 后 是 相 对 位 置 属 性 padding 对 于 一 个 Button 完 整 的 定 义 可 以 为 : Java 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <selector 3. xmlns:android="http://www.norkoo.com"> 4. <item android:state_pressed="true" > 5. <shape> 6. <gradient 7. android:startcolor="#ff8c00" 8. android:endcolor="#ffffff" 9. android:angle="270" /> 10. <stroke 11. android:width="2dp" 12. android:color="#dcdcdc" /> 13. <corners 14. android:radius="2dp" /> 15. <padding 16. android:left="10dp"

17. android:top="10dp" 18. android:right="10dp" 19. android:bottom="10dp" /> 20. </shape> 21. </item> 22. 23. <item android:state_focused="true" > 24. <shape> 25. <gradient 26. android:startcolor="#ffc2b7" 27. android:endcolor="#ffc2b7" 28. android:angle="270" /> 29. <stroke 30. android:width="2dp" 31. android:color="#dcdcdc" /> 32. <corners 33. android:radius="2dp" /> 34. <padding 35. android:left="10dp" 36. android:top="10dp" 37. android:right="10dp" 38. android:bottom="10dp" /> 39. </shape> 40. </item> 41. 42. <item> 43. <shape> 44. <gradient 45. android:startcolor="#ff9d77" 46. android:endcolor="#ff9d77" 47. android:angle="270" /> 48. <stroke 49. android:width="2dp" 50. android:color="#fad3cf" /> 51. <corners 52. android:radius="2dp" /> 53. <padding 54. android:left="10dp" 55. android:top="10dp" 56. android:right="10dp" 57. android:bottom="10dp" /> 58. </shape> 59. </item> 60.</selector>

注 意! 提 示 大 家, 以 上 几 个 item 的 区 别 主 要 是 体 现 在 state_pressed 按 下 或 state_focused 获 得 焦 点 时, 当 当 来 判 断 显 示 什 么 类 型, 而 没 有 state_xxx 属 性 的 item 可 以 看 作 是 常 规 状 态 下 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:color="hex_color" android:state_pressed=["true" "false"] android:state_focused=["true" "false"] android:state_selected=["true" "false"] android:state_active=["true" "false"] android:state_checkable=["true" "false"] android:state_checked=["true" "false"] android:state_enabled=["true" "false"] android:state_window_focused=["true" "false"] /> </selector> Elements: <selector> 必 须 必 须 是 根 元 素 包 含 一 个 或 多 个 <item> 元 素 Attributes: xmlns:android String, 必 须 定 义 XML 的 命 名 空 间, 必 须 是 http://schemas.android.com/apk/res/android. <item> 定 义 特 定 状 态 的 color, 通 过 它 的 特 性 指 定 必 须 是 <selector> 的 子 元 素 Attributes: android:color 16 进 制 颜 色 必 须 这 个 颜 色 由 RGB 值 指 定, 可 带 Alpha 这 个 值 必 须 以 # 开 头, 后 面 跟 随 Alpha-Red-Green-Blue 信 息 : #RGB #ARGB #RRGGBB

#AARRGGBB android:state_pressed Boolean true 表 示 按 下 状 态 使 用 ( 例 如 按 钮 按 下 ); false 表 示 非 按 下 状 态 使 用 android:state_focused Boolean true 表 示 聚 焦 状 态 使 用 ( 例 如 使 用 滚 动 球 /D-pad 聚 焦 Button); false 表 示 非 聚 焦 状 态 使 用 android:state_selected Boolean true 表 示 选 中 状 态 使 用 ( 例 如 Tab 打 开 ); false 表 示 非 选 中 状 态 使 用 android:state_checkable Boolean true 表 示 可 勾 选 状 态 时 使 用 ; false 表 示 非 可 勾 选 状 态 使 用 ( 只 对 能 切 换 可 勾 选 非 可 勾 选 的 构 件 有 用 ) android:state_checked Boolean true 表 示 勾 选 状 态 使 用 ; false 表 示 非 勾 选 状 态 使 用 android:state_enabled Boolean true 表 示 可 用 状 态 使 用 ( 能 接 收 触 摸 / 点 击 事 件 ); false 表 示 不 可 用 状 态 使 用 android:window_focused Boolean true 表 示 应 用 程 序 窗 口 有 焦 点 时 使 用 ( 应 用 程 序 在 前 台 ); false 表 示 无 焦 点 时 使 用 ( 例 如 Notification 栏 拉 下 或 对 话 框 显 示 ) 注 意 : 记 住 一 点,StateList 中 第 一 个 匹 配 当 前 状 态 的 item 会 被 使 用 因 此, 如 果 第 一 个 item 没 有 任 何 状 态 特 性 的 话, 那 么 它 将 每 次 都 被 使 用, 这 也 是 为 什 么 默 认 的 值 必 须 总 是 在 最 后 ( 如 下 面 的 例 子 所 示 ) Examples: XML 文 件 保 存 在 res/color/button_text.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#ffff0000"/> <!-- pressed --> <item android:state_focused="true" android:color="#ff0000ff"/> <!-- focused --> <item android:color="#ff000000"/> <!-- default -->

</selector> 这 个 Layout XML 会 应 用 ColorStateList 到 一 个 View 上 : <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button_text" android:textcolor="@color/button_text" /> Android 字 符 高 亮 显 示 ( 转 载 ) 文 章 分 类 : 移 动 开 发 Java 代 码 1. String str="adsjoiasdjpaisdjpaidj"; 2. /** Called when the activity is first created. */ 3. @Override 4. public void oncreate(bundle savedinstancestate) { 5. super.oncreate(savedinstancestate); 6. setcontentview(r.layout.main); 7. TextView textview=(textview)findviewbyid(r.id.textview); 8. SpannableStringBuilder style=new SpannableStringBuilder(s tr); 9. style.setspan(new ForegroundColorSpan(Color.RED),3,8,Spann able.span_exclusive_exclusive); 10. textview.settext(style); 11.} Android SDCard 操 作 ( 文 件 读 写, 容 量 计 算 ) 文 章 分 类 : 移 动 开 发 android.os.environment 提 供 访 问 环 境 变 量 java.lang.object android.os.environment Environment 静 态 方 法 :

方 法 : getdatadirectory () 返 回 : File 解 释 : 返 回 Data 的 目 录 方 法 : getdownloadcachedirectory () 返 回 : File 解 释 : 返 回 下 载 缓 冲 区 目 录 方 法 : getexternalstoragedirectory () 返 回 : File 解 释 : 返 回 扩 展 存 储 区 目 录 (SDCard) 方 法 : getexternalstoragepublicdirectory (String type) 返 回 : File 解 释 : 返 回 一 个 高 端 的 公 用 的 外 部 存 储 器 目 录 来 摆 放 某 些 类 型 的 文 件 ( 来 自 网 上 ) 方 法 : getrootdirectory () 返 回 : File 解 释 : 返 回 Android 的 根 目 录 方 法 : getexternalstoragestate () 返 回 : String 解 释 : 返 回 外 部 存 储 设 备 的 当 前 状 态

getexternalstoragestate () 返 回 的 状 态 String 类 型 常 量 : 常 量 : MEDIA_BAD_REMOVAL 值 : "bad_removal" 解 释 : 在 没 有 正 确 卸 载 SDCard 之 前 移 除 了 常 量 :MEDIA_CHECKING 值 : "checking" 解 释 : 正 在 磁 盘 检 查 常 量 : MEDIA_MOUNTED 值 : "mounted" 解 释 : 已 经 挂 载 并 且 拥 有 可 读 可 写 权 限 常 量 : MEDIA_MOUNTED_READ_ONLY 值 : "mounted_ro" 解 释 : 已 经 挂 载, 但 只 拥 有 可 读 权 限 常 量 :MEDIA_NOFS 值 : "nofs" 解 释 : 对 象 空 白, 或 者 文 件 系 统 不 支 持 常 量 : MEDIA_REMOVED 值 : "removed" 解 释 : 已 经 移 除 扩 展 设 备

常 量 : MEDIA_SHARED 值 : "shared" 解 释 : 如 果 SDCard 未 挂 载, 并 通 过 USB 大 容 量 存 储 共 享 常 量 : MEDIA_UNMOUNTABLE 值 : "unmountable" 解 释 : 不 可 以 挂 载 任 何 扩 展 设 备 常 量 : MEDIA_UNMOUNTED 值 : "unmounted" 解 释 : 已 经 卸 载 使 用 时 只 需 先 判 断 SDCard 当 前 的 状 态 然 后 取 得 SdCard 的 目 录 即 可 ( 见 源 代 码 ) Java 代 码 1. <SPAN style="font-size: small"> 1 //SDcard 操 作 2. public void SDCardTest() { 3. // 获 取 扩 展 SD 卡 设 备 状 态 4. String sdstatestring = android.os.environment.getexternalsto ragestate(); 5. 6. // 拥 有 可 读 可 写 权 限 if (sdstatestring.equals(android.os.environment.media_mounted)) { try { // 获 取 扩 展 存 储 设 备 的 文 件 目 录 7. File SDFile = android.os.environment 8..getExternalStorageDirectory();

// 打 开 文 件 9. File myfile = new File(SDFile.getAbsolutePath() 10. + File.separator + "MyFile.txt"); 11. // 判 断 是 否 存 在, 不 存 在 则 创 建 12. if (!myfile.exists()) { 13. myfile.createnewfile(); 14. } 15. // 写 数 据 16. String szouttext = "Hello, World!"; 17. FileOutputStream outputstream = new FileOutputStream (myfile); 18. outputstream.write(szouttext.getbytes()); 19. outputstream.close(); 20. } catch (Exception e) { 21. // TODO: handle exception }// end of try 22.}// end of if(media_mounted) 23.// 拥 有 只 读 权 限 24.else if (sdstatestring 25..endsWith(android.os.Environment.MEDIA_MOUNTED_READ_ONLY)) { 26. // 获 取 扩 展 存 储 设 备 的 文 件 目 录 27. File SDFile = android.os.environment 28..getExternalStorageDirectory(); 29.// 创 建 一 个 文 件 30.File myfile = new File(SDFile.getAbsolutePath() 31. + File.separator 32. + "MyFile.txt"); 33.// 判 断 文 件 是 否 存 在 34.if (myfile.exists()) { 35. try { 36. // 读 数 据 37. FileInputStream inputstream = new FileInputStream(myFile); 38. byte[] buffer = new byte[1024]; 39. inputstream.read(buffer); 40. inputstream.close(); 41. } catch (Exception e) { 42. // TODO: handle exception 43.}// end of try

}// end of if(myfile) 44.}// end of if(media_mounted_read_only) 45.}// end of func</span> 计 算 SDCard 的 容 量 大 小 android.os.statfs 一 个 模 拟 linux 的 df 命 令 的 一 个 类, 获 得 SD 卡 和 手 机 内 存 的 使 用 情 况 java.lang.object android.os.statfs 构 造 方 法 : StatFs (String path) 公 用 方 法 : 方 法 : getavailableblocks () 返 回 : int 解 释 : 返 回 文 件 系 统 上 剩 下 的 可 供 程 序 使 用 的 块 方 法 : getblockcount () 返 回 : int 解 释 : 返 回 文 件 系 统 上 总 共 的 块 方 法 : getblocksize () 返 回 : int 解 释 : 返 回 文 件 系 统 一 个 块 的 大 小 单 位 byte 方 法 : getfreeblocks () 返 回 : int

解 释 : 返 回 文 件 系 统 上 剩 余 的 所 有 块 包 括 预 留 的 一 般 程 序 无 法 访 问 的 方 法 : restat (String path) 返 回 : void 解 释 : 执 行 一 个 由 该 对 象 所 引 用 的 文 件 系 统 雷 斯 塔 特.(Google 翻 译 ) 想 计 算 SDCard 大 小 和 使 用 情 况 时, 只 需 要 得 到 SD 卡 总 共 拥 有 的 Block 数 或 是 剩 余 没 用 的 Block 数, 再 乘 以 每 个 Block 的 大 小 就 是 相 应 的 容 量 大 小 了 单 位 byte.( 见 代 码 ) Java 代 码 1. <SPAN style="font-size: small"> 1 2. public void SDCardSizeTest() { 3. 2 4. 3 // 取 得 SDCard 当 前 的 状 态 5. 4 String sdcstring = android.os.environme nt.getexternalstoragestate(); 6. 5 7. 6 if (sdcstring.equals(android.os.environme nt.media_mounted)) { 8. 7 9. 8 // 取 得 sdcard 文 件 路 径 10. 9 File pathfile = android.os.envi ronment 11.10.getExternalStorage Directory(); 12.11 13.12 android.os.statfs statfs = new android.os.statfs(pathfile.getpath()); 14.13 15.14 // 获 取 SDCard 上 BLOCK 总 数 16.15 long ntotalblocks = statfs.getbl ockcount(); 17.16

18.17 // 获 取 SDCard 上 每 个 block 的 SIZE 19.18 long nblocsize = statfs.getblock Size(); 20.19 21.20 // 获 取 可 供 程 序 使 用 的 Block 的 数 量 22.21 long navailablock = statfs.getav ailableblocks(); 23.22 24.23 // 获 取 剩 下 的 所 有 Block 的 数 量 ( 包 括 预 留 的 一 般 程 序 无 法 使 用 的 块 ) 25.24 long nfreeblock = statfs.getfree Blocks(); 26.25 27.26 // 计 算 SDCard 总 容 量 大 小 MB 28.27 long nsdtotalsize = ntotalblocks * nblocsize / 1024 / 1024; 29.28 30.29 // 计 算 SDCard 剩 余 大 小 MB 31.30 long nsdfreesize = navailablock * nblocsize / 1024 / 1024; 32.31 }// end of if 33.32 }// end of func</span> Android 将 ButtonBar 放 在 屏 幕 底 部? 转 烛 空 间 ( 转 载 ) 文 章 分 类 : 移 动 开 发 接 上 篇 Android 将 TAB 选 项 卡 放 在 屏 幕 底 部 写 上 篇 提 到 ButtonBar 的 方 式 写 底 部 button, 试 了 试, 看 起 来 外 观 貌 似 比 Tab 好 看, 不 过 恐 怕 没 有 Tab 管 理 Activity 方 便 吧, 毕 竟 一 个 Tab 就 是 一 个 Activity, 但 是 这 样 用 Button 的 话, 却 并 不 如 此, 所 以 这 样 的 涉 及 可 能 虽 然 好 看 点, 但 是 管 理 起 来 却 是 相 当 麻 烦 那 么 暂 且 把 对 activity 的 管 理 放 在 一 边, 只 看 界 面 的 设 计 吧

要 涉 及 这 样 的 一 个 buttonbar, 主 要 就 是 要 用 到 style="@android:style/buttonbar" 这 个 风 格 首 先 还 是 来 看 xml 的 设 计, 保 存 layout/bottombtn.xml Java 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a ndroid" 3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent"> 6. 7. <TabHost android:id="@+id/edit_item_tab_host" 8. android:layout_width="fill_parent" 9. android:layout_height="fill_parent"> 10.<LinearLayout android:orientation="vertical" 11. android:layout_width="fill_parent" 12. android:layout_height="fill_parent" 13. android:padding="5dp"> 14.<FrameLayout android:id="@android:id/tabcontent" 15. android:layout_width="fill_parent" 16. android:layout_height="wrap_content" 17. android:padding="5dp" 18. android:layout_weight="1" /> 19.<TabWidget android:id="@android:id/tabs" 20. android:layout_width="fill_parent" 21. android:layout_height="wrap_content" 22. android:layout_weight="0" /> 23.</LinearLayout> 24.</TabHost> 25.</LinearLayout> 然 后 以 下 就 是 完 整 的 代 码 了 :

Java 代 码 1. package net.wangliping.test; 2. 3. import android.app.activitygroup; 4. import android.content.intent; 5. import android.os.bundle; 6. import android.widget.tabhost; 7. import android.widget.tabhost.tabspec; 8. 9. public class TestTab extends ActivityGroup { 10. public static TabHost tab_host; 11. @Override 12. protected void oncreate(bundle savedinstancestate) { 13. super.oncreate(savedinstancestate); 14. setcontentview(r.layout.bottomtab); 15. 16. tab_host = (TabHost) findviewbyid(r.id.edit_ item_tab_host); 17. tab_host.setup(this.getlocalactivitymanager()); 18. 19. TabSpec ts1 = tab_host.newtabspec("tab_weath ER"); 20. ts1.setindicator("weather"); 21. ts1.setcontent(new Intent(this, Weather.class )); 22. tab_host.addtab(ts1); 23. 24. TabSpec ts2 = tab_host.newtabspec("tab_mail" ); 25. ts2.setindicator("mail"); 26. ts2.setcontent(new Intent(this, MailSend.clas s)); 27. tab_host.addtab(ts2); 28. 29. TabSpec ts3 = tab_host.newtabspec("tab_jump" ); 30. ts3.setindicator("jump");

31. ts3.setcontent(new Intent(this, TabJump.class )); 32. tab_host.addtab(ts3); 33. 34. tab_host.setcurrenttab(0); 35. } 36.} 而 关 于 页 面 的 跳 转, 就 是 : Java 代 码 1. TestTab.tabHost.setCurrentTab(0); 如 此 这 般, 就 形 成 了 下 面 的 这 个 东 西, 其 实 还 没 有 放 在 上 面 好 看 所 以 也 证 实 了 上 面 那 个 应 用 不 是 简 单 地 放 置 TAB 在 底 端 了 有 机 会 还 是 再 看 看 ButtonBar 了

Android2.2 API 中 文 文 档 系 列 (1) TextView 文 章 分 类 : 移 动 开 发 正 文 一 TextView 的 API 中 文 文 档 1.1 结 构 java.lang.object android.view.view android.widget.textview 直 接 子 类 : Button, CheckedTextView, Chronometer, DigitalClock, EditText

间 接 子 类 : AutoCompleteTextView, CheckBox, CompoundButton, ExtractEditText,MultiAutoCompleteTextView, RadioButton, ToggleButton 1.2 API 属 性 名 称 描 述 android:autol ink android:autot ext android:buffe rtype android:capit alize 设 置 是 否 当 文 本 为 URL 链 接 /email/ 电 话 号 码 /map 时, 文 本 显 示 为 可 点 击 的 链 接 可 选 值 (none/web/email/phone/map/all) 如 果 设 置, 将 自 动 执 行 输 入 值 的 拼 写 纠 正 此 处 无 效 果, 在 显 示 输 入 法 并 输 入 的 时 候 起 作 用 指 定 gettext() 方 式 取 得 的 文 本 类 别 选 项 editable 类 似 于 StringBuilder 可 追 加 字 符, 也 就 是 说 gettext 后 可 调 用 append 方 法 设 置 文 本 内 容 spannable 则 可 在 给 定 的 字 符 区 域 使 用 样 式, 参 见 这 里 1 这 里 2 设 置 英 文 字 母 大 写 类 型 此 处 无 效 果, 需 要 弹 出 输 入 法 才 能 看 得 到, 参 见 EditText 此 属 性 说 明 android:curso rvisible 设 定 光 标 为 显 示 / 隐 藏, 默 认 显 示 android:digit s android:drawa blebottom android:drawa bleleft android:drawa blepadding 设 置 允 许 输 入 哪 些 字 符 如 1234567890.+-*/%\n() 在 text 的 下 方 输 出 一 个 drawable, 如 图 片 如 果 指 定 一 个 颜 色 的 话 会 把 text 的 背 景 设 为 该 颜 色, 并 且 同 时 和 background 使 用 时 覆 盖 后 者 在 text 的 左 边 输 出 一 个 drawable, 如 图 片 设 置 text 与 drawable( 图 片 ) 的 间 隔, 与 drawableleft drawableright drawabletop drawablebottom 一 起 使 用, 可 设 置 为 负 数, 单 独 使 用 没 有 效 果 android:drawa bleright android:drawa 在 text 的 右 边 输 出 一 个 drawable, 如 图 片 在 text 的 正 上 方 输 出 一 个 drawable, 如 图 片

bletop android:edita ble 设 置 是 否 可 编 辑 这 里 无 效 果, 参 见 EditView android:edito rextras android:ellip size 设 置 文 本 的 额 外 的 输 入 数 据 在 EditView 再 讨 论 设 置 当 文 字 过 长 时, 该 控 件 该 如 何 显 示 有 如 下 值 设 置 : start 省 略 号 显 示 在 开 头 ; end 省 略 号 显 示 在 结 尾 ; middle - 省 略 号 显 示 在 中 间 ; marquee 以 跑 马 灯 的 方 式 显 示 ( 动 画 横 向 移 动 ) android:freez estext 设 置 保 存 文 本 的 内 容 以 及 光 标 的 位 置 参 见 : 这 里 android:gravi ty android:hint android:imeop tions android:imeac tionid 设 置 文 本 位 置, 如 设 置 成 center, 文 本 将 居 中 显 示 Text 为 空 时 显 示 的 文 字 提 示 信 息, 可 通 过 textcolorhint 设 置 提 示 信 息 的 颜 色 此 属 性 在 EditView 中 使 用, 但 是 这 里 也 可 以 用 附 加 功 能, 设 置 右 下 角 IME 动 作 与 编 辑 框 相 关 的 动 作, 如 actiondone 右 下 角 将 显 示 一 个 完 成, 而 不 设 置 默 认 是 一 个 回 车 符 号 这 个 在 EditText 中 再 详 细 说 明, 此 处 无 用 设 置 IME 动 作 ID 在 EditText 再 做 说 明, 可 以 先 看 这 篇 帖 子 : 这 里 android:imeac tionlabel 设 置 IME 动 作 标 签 在 EditText 再 做 说 明 android:inclu defontpadding android:input Method android:input Type 设 置 文 本 是 否 包 含 顶 部 和 底 部 额 外 空 白, 默 认 为 true 为 文 本 指 定 输 入 法, 需 要 完 全 限 定 名 ( 完 整 的 包 名 ) 例 如 : com.google.android.inputmethod.pinyin, 但 是 这 里 报 错 找 不 到 设 置 文 本 的 类 型, 用 于 帮 助 输 入 法 显 示 合 适 的 键 盘 类 型 在 EditText 中 再 详 细 说 明, 这 里 无 效 果 android:links Clickable 设 置 链 接 是 否 点 击 连 接, 即 使 设 置 了 autolink

在 ellipsize 指 定 marquee 的 情 况 下, 设 置 重 复 滚 动 的 次 数, android:marqu 当 设 置 为 marquee_forever 时 表 示 无 限 次 eerepeatlimit 设 置 TextView 的 宽 度 为 N 个 字 符 的 宽 度 这 里 测 试 为 一 个 android:ems 汉 字 字 符 宽 度, 如 图 : android:maxem s android:minem s 设 置 TextView 的 宽 度 为 最 长 为 N 个 字 符 的 宽 度 与 ems 同 时 使 用 时 覆 盖 ems 选 项 设 置 TextView 的 宽 度 为 最 短 为 N 个 字 符 的 宽 度 与 ems 同 时 使 用 时 覆 盖 ems 选 项 android:maxle ngth android:lines android:maxli nes 限 制 显 示 的 文 本 长 度, 超 出 部 分 不 显 示 设 置 文 本 的 行 数, 设 置 两 行 就 显 示 两 行, 即 使 第 二 行 没 有 数 据 设 置 文 本 的 最 大 显 示 行 数, 与 width 或 者 layout_width 结 合 使 用, 超 出 部 分 自 动 换 行, 超 出 行 数 将 不 显 示 android:minli nes 设 置 文 本 的 最 小 行 数, 与 lines 类 似 android:lines pacingextra 设 置 行 间 距 android:lines pacingmultipl ier android:numer ic 设 置 行 间 距 的 倍 数 如 1.2 如 果 被 设 置, 该 TextView 有 一 个 数 字 输 入 法 此 处 无 用, 设 置 后 唯 一 效 果 是 TextView 有 点 击 效 果, 此 属 性 在 EditText 将 详 细 说 明 android:passw ord 以 小 点. 显 示 文 本 android:phone Number android:priva 设 置 为 电 话 号 码 的 输 入 方 式 设 置 输 入 法 选 项, 此 处 无 用, 在 EditText 将 进 一 步 讨 论

teimeoptions android:scrol lhorizontally 设 置 文 本 超 出 TextView 的 宽 度 的 情 况 下, 是 否 出 现 横 拉 条 android:selec tallonfocus android:shado wcolor 如 果 文 本 是 可 选 择 的, 让 他 获 取 焦 点 而 不 是 将 光 标 移 动 为 文 本 的 开 始 位 置 或 者 末 尾 位 置 EditText 中 设 置 后 无 效 果 果 : 指 定 文 本 阴 影 的 颜 色, 需 要 与 shadowradius 一 起 使 用 效 android:shado wdx 设 置 阴 影 横 向 坐 标 开 始 位 置 android:shado wdy 设 置 阴 影 纵 向 坐 标 开 始 位 置 android:shado wradius android:singl eline 设 置 阴 影 的 半 径 设 置 为 0.1 就 变 成 字 体 的 颜 色 了, 一 般 设 置 为 3.0 的 效 果 比 较 好 设 置 单 行 显 示 如 果 和 layout_width 一 起 使 用, 当 文 本 不 能 全 部 显 示 时, 后 面 用 来 表 示 如 android:text="test_ singleline " android:singleline="true" android:layout_width="20dp" 将 只 显 示 t 如 果 不 设 置 singleline 或 者 设 置 为 false, 文 本 将 自 动 换 行 android:text 设 置 显 示 文 本. 设 置 文 字 外 观 如?android:attr/textAppearanceLargeInverse android:texta ppearance 这 里 引 用 的 是 系 统 自 带 的 一 个 外 观,? 表 示 系 统 是 否 有 这 种 外 观, 否 则 使 用 默 认 的 外 观 可 设 置 的 值 如 下 : textappearancebutton/textappearanceinverse/textappearan celarge /textappearancelargeinverse/textappearancemedium/textap pearancemediuminverse/textappearancesmall/textappearanc esmallinverse android:textc olor 设 置 文 本 颜 色 android:textc olorhighlight 被 选 中 文 字 的 底 色, 默 认 为 蓝 色

android:textc olorhint 设 置 提 示 信 息 文 字 的 颜 色, 默 认 为 灰 色 与 hint 一 起 使 用 android:textc olorlink 文 字 链 接 的 颜 色. 设 置 文 字 之 间 间 隔, 默 认 为 1.0f 分 别 设 置 android:texts calex 0.5f/1.0f/1.5f/2.0f 效 果 如 下 : android:texts ize 设 置 文 字 大 小, 推 荐 度 量 单 位 sp, 如 15sp android:texts tyle android:typef ace android:heigh t 设 置 字 形 [bold( 粗 体 ) 0, italic( 斜 体 ) 1, bolditalic( 又 粗 又 斜 ) 2] 可 以 设 置 一 个 或 多 个, 用 隔 开 设 置 文 本 字 体, 必 须 是 以 下 常 量 值 之 一 :normal 0, sans 1, serif 2, monospace( 等 宽 字 体 ) 3] 设 置 文 本 区 域 的 高 度, 支 持 度 量 单 位 :px( 像 素 )/dp/sp/in/mm( 毫 米 ) android:maxhe ight 设 置 文 本 区 域 的 最 大 高 度 android:minhe ight android:width 设 置 文 本 区 域 的 最 小 高 度 设 置 文 本 区 域 的 宽 度, 支 持 度 量 单 位 :px( 像 素 )/dp/sp/in/mm( 毫 米 ), 与 layout_width 的 区 别 看 这 里 android:maxwi dth 设 置 文 本 区 域 的 最 大 宽 度 android:minwi dth 设 置 文 本 区 域 的 最 小 宽 度 1.3 补 充 说 明

1.3.1 以 下 几 个 属 性 以 及 输 入 法 相 关 的 在 这 里 都 没 有 效 果, 在 EditText 将 补 充 说 明 android:numeric/android:digits/android:phonenumber/android:inputmetho d/android:capitalize/android:autotext 1.4 Word 格 式 的 API 文 档 下 载 http://download.csdn.net/source/2649980 二 例 子 2.1 跑 马 灯 的 效 果 http://www.cnblogs.com/over140/archive/2010/08/20/1804770.html 结 束 鉴 于 至 此 仍 未 有 完 整 的 Android API 中 文 文 档 公 布 出 来, 我 会 一 直 坚 持 翻 译 到 有 其 他 组 织 或 官 方 出 完 整 的 API 中 文 文 档 为 止 在 这 里 感 谢 女 朋 友 的 支 持 和 帮 助, 为 我 提 供 日 中 翻 译 ( 将 Android API 日 文 版 翻 译 成 中 文 ) 和 英 中 翻 译 ; 感 谢 翻 译 工 具 和 搜 索 引 擎 以 及 其 他 提 供 部 分 属 性 翻 译 参 考 的 分 享 者 ; 感 谢 大 家 的 支 持! Android 震 动 示 例 -- 心 跳 效 果 正 在 开 发 第 二 个 游 戏, 计 时 就 要 结 束 的 时 候, 为 了 营 造 紧 张 的 气 氛, 会 利 用 手 机 自 身 的 震 动 模 拟 心 跳 效 果, 其 实 这 个 心 跳 效 果 做 起 来 真 的 非 常 的 简 单 所 以 直 接 上 代 码 了 ( 注 意 模 拟 器 是 模 拟 不 了 震 动 的, 得 真 机 测 试 哦 ): 程 序 效 果 : Java 代 码 1. package com.ray.test; 2. 3. import android.app.activity; 4. import android.os.bundle; 5. import android.os.vibrator; 6. import android.view.motionevent; 7. 8. public class TestViberation extends Activity { 9. Vibrator vibrator; 10. /** Called when the activity is first created. */ 11. @Override 12. public void oncreate(bundle savedinstancestate) {

13. super.oncreate(savedinstancestate); 14. setcontentview(r.layout.main); 15. } 16. 17. @Override 18. protected void onstop() { 19. if(null!=vibrator){ 20. vibrator.cancel(); 21. } 22. super.onstop(); 23. } 24. 25. @Override 26. public boolean ontouchevent(motionevent event) { 27. 28. if(event.getaction() == MotionEvent.ACTION_DOWN){ 29. vibrator = (Vibrator) getsystemservice(vibrator_service); 30. long[] pattern = {800, 50, 400, 30}; // OFF/ON/OFF/ON... 31. vibrator.vibrate(pattern, 2);//-1 不 重 复, 非 -1 为 从 pattern 的 指 定 下 标 开 始 重 复 32. } 33. return super.ontouchevent(event); 34. } 35. 36. 37. } android animation 动 画 效 果 编 程 基 础 --AnimationAndroid 在 Android 中, 分 别 可 以 在 xml 中 定 义 Animation, 也 可 以 在 程 序 代 码 中 定 义 动 画 类 型 Android 的 animation 由 四 种 类 型 组 成 XML 中 alpha 渐 变 透 明 度 动 画 效 果 scale 渐 变 尺 寸 伸 缩 动 画 效 果 translate 画 面 转 换 位 置 移 动 动 画 效 果 rotate 画 面 转 移 旋 转 动 画 效 果

代 码 中 AlphaAnimation 渐 变 透 明 度 动 画 效 果 ScaleAnimation 渐 变 尺 寸 伸 缩 动 画 效 果 TranslateAnimation 画 面 转 换 位 置 移 动 动 画 效 果 RotateAnimation 画 面 转 移 旋 转 动 画 效 果 Android 动 画 模 式 Animation 主 要 有 两 种 动 画 模 式 : 一 种 是 tweened animation( 渐 变 动 画 ) alpha AlphaAnimation scale ScaleAnimation 一 种 是 frame by frame( 画 面 转 换 动 画 ) translate TranslateAnimation rotate RotateAnimation 如 何 在 XML 文 件 中 定 义 动 画 1 打 开 Eclipse, 新 建 Android 工 程 2 在 res 目 录 中 新 建 anim 文 件 夹 3 在 anim 目 录 中 新 建 一 个 myanim.xml( 注 意 文 件 名 小 写 ) 4 加 入 XML 的 动 画 代 码 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha/> <scale/> <translate/> <rotate/> </set> 每 个 元 素 表 示 不 同 的 动 画 效 果 Android 动 画 解 析 --XML

<alpha> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:fromalpha="0.1" android:toalpha="1.0" android:duration="3000" /> <!-- 透 明 度 控 制 动 画 效 果 alpha 浮 点 型 值 : fromalpha 属 性 为 动 画 起 始 时 透 明 度 toalpha 属 性 为 动 画 结 束 时 透 明 度 说 明 : 0.0 表 示 完 全 透 明 1.0 表 示 完 全 不 透 明 以 上 值 取 0.0-1.0 之 间 的 float 数 据 类 型 的 数 字 长 整 型 值 : duration 属 性 为 动 画 持 续 时 间 说 明 : 时 间 以 毫 秒 为 单 位 --> </set> <scale> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromxscale="0.0" android:toxscale="1.4" android:fromyscale="0.0" android:toyscale="1.4" android:pivotx="50%" android:pivoty="50%" android:fillafter="false" android:startoffset= 700 android:duration="700" /> </set> <!-- 尺 寸 伸 缩 动 画 效 果 scale

属 性 :interpolator 指 定 一 个 动 画 的 插 入 器 在 我 试 验 过 程 中, 使 用 android.res.anim 中 的 资 源 时 候 发 现 有 三 种 动 画 插 入 器 : accelerate_decelerate_interpolator 加 速 - 减 速 动 画 插 入 器 accelerate_interpolator 加 速 - 动 画 插 入 器 decelerate_interpolator 减 速 - 动 画 插 入 器 其 他 的 属 于 特 定 的 动 画 效 果 浮 点 型 值 : fromxscale 属 性 为 动 画 起 始 时 X 坐 标 上 的 伸 缩 尺 寸 toxscale 属 性 为 动 画 结 束 时 X 坐 标 上 的 伸 缩 尺 寸 fromyscale 属 性 为 动 画 起 始 时 Y 坐 标 上 的 伸 缩 尺 寸 toyscale 属 性 为 动 画 结 束 时 Y 坐 标 上 的 伸 缩 尺 寸 startoffset 属 性 为 从 上 次 动 画 停 多 少 时 间 开 始 执 行 下 个 动 画 说 明 : 以 上 四 种 属 性 值 0.0 表 示 收 缩 到 没 有 1.0 表 示 正 常 无 伸 缩 值 小 于 1.0 表 示 收 缩 值 大 于 1.0 表 示 放 大 pivotx pivoty 属 性 为 动 画 相 对 于 物 件 的 X 坐 标 的 开 始 位 置 属 性 为 动 画 相 对 于 物 件 的 Y 坐 标 的 开 始 位 置 说 明 : 以 上 两 个 属 性 值 从 0%-100% 中 取 值 50% 为 物 件 的 X 或 Y 方 向 坐 标 上 的 中 点 位 置 长 整 型 值 : duration 属 性 为 动 画 持 续 时 间 说 明 : 时 间 以 毫 秒 为 单 位 --> 布 尔 型 值 : fillafter 属 性 当 设 置 为 true, 该 动 画 转 化 在 动 画 结 束 后 被 应 用 <translate> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromxdelta="30" android:toxdelta="-80" android:fromydelta="30" android:toydelta="300" android:duration="2000" /> <!-- translate 位 置 转 移 动 画 效 果 整 型 值 : fromxdelta 属 性 为 动 画 起 始 时 X 坐 标 上 的 位 置 toxdelta 属 性 为 动 画 结 束 时 X 坐 标 上 的 位 置 fromydelta 属 性 为 动 画 起 始 时 Y 坐 标 上 的 位 置 toydelta 属 性 为 动 画 结 束 时 Y 坐 标 上 的 位 置 注 意 : 没 有 指 定 fromxtype toxtype fromytype toytype 时 候, 默 认 是 以 自 己 为 相 对 参 照 物 长 整 型 值 : duration 属 性 为 动 画 持 续 时 间 说 明 : 时 间 以 毫 秒 为 单 位 --> </set> <rotate> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromdegrees="0" android:todegrees="+350" android:pivotx="50%" android:pivoty="50%" android:duration="3000" /> <!-- rotate 旋 转 动 画 效 果 属 性 :interpolator 指 定 一 个 动 画 的 插 入 器 在 我 试 验 过 程 中, 使 用 android.res.anim 中 的 资 源 时 候 发 现 有 三 种 动 画 插 入 器 : accelerate_decelerate_interpolator 加 速 - 减 速 动 画 插 入 器 accelerate_interpolator 加 速 - 动 画 插 入 器 decelerate_interpolator 减 速 - 动 画 插 入 器 其 他 的 属 于 特 定 的 动 画 效 果

浮 点 数 型 值 : fromdegrees 属 性 为 动 画 起 始 时 物 件 的 角 度 todegrees 属 性 为 动 画 结 束 时 物 件 旋 转 的 角 度 可 以 大 于 360 度 说 明 : 当 角 度 为 负 数 表 示 逆 时 针 旋 转 当 角 度 为 正 数 表 示 顺 时 针 旋 转 ( 负 数 from to 正 数 : 顺 时 针 旋 转 ) ( 负 数 from to 负 数 : 逆 时 针 旋 转 ) ( 正 数 from to 正 数 : 顺 时 针 旋 转 ) ( 正 数 from to 负 数 : 逆 时 针 旋 转 ) pivotx pivoty 属 性 为 动 画 相 对 于 物 件 的 X 坐 标 的 开 始 位 置 属 性 为 动 画 相 对 于 物 件 的 Y 坐 标 的 开 始 位 置 说 明 : 以 上 两 个 属 性 值 从 0%-100% 中 取 值 50% 为 物 件 的 X 或 Y 方 向 坐 标 上 的 中 点 位 置 长 整 型 值 : duration 属 性 为 动 画 持 续 时 间 说 明 : 时 间 以 毫 秒 为 单 位 --> </set> 在 编 码 中 如 何 使 用 如 何 使 用 XML 中 的 动 画 效 果 在 代 码 中 使 用 这 个 方 法 得 到 Animation 实 例 public static Animation loadanimation (Context context, int id) // 第 一 个 参 数 Context 为 程 序 的 上 下 文 // 第 二 个 参 数 id 为 动 画 XML 文 件 的 引 用 // 例 子 : myanimation= AnimationUtils.loadAnimation(this,R.anim.my_action); // 使 用 AnimationUtils 类 的 静 态 方 法 loadanimation() 来 加 载 XML 中 的 动 画 XML 文 件 如 何 在 Java 代 码 中 定 义 动 画 // 在 代 码 中 定 义 动 画 实 例 对 象 private Animation myanimation_alpha; private Animation myanimation_scale; private Animation myanimation_translate;

private Animation myanimation_rotate; // 根 据 各 自 的 构 造 方 法 来 初 始 化 一 个 实 例 对 象 myanimation_alpha=new AlphaAnimation(0.1f, 1.0f); myanimation_scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myanimation_translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myanimation_rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f); -------------------------------------------------------------------- Android 动 画 解 析 AlphaAnimation 1 AlphaAnimation 类 对 象 定 义 private AlphaAnimation myanimation_alpha; 2 AlphaAnimation 类 对 象 构 造 AlphaAnimation(float fromalpha, float toalpha) // 第 一 个 参 数 fromalpha 为 动 画 开 始 时 候 透 明 度 // 第 二 个 参 数 toalpha 为 动 画 结 束 时 候 透 明 度 myanimation_alpha=new AlphaAnimation(0.1f, 1.0f); // 说 明 : // 0.0 表 示 完 全 透 明 // 1.0 表 示 完 全 不 透 明 3 设 置 动 画 持 续 时 间 myanimation_alpha.setduration(5000); // 设 置 时 间 持 续 时 间 为 5000 毫 秒 ScaleAnimation 1ScaleAnimation 类 对 象 定 义 private AlphaAnimation myanimation_scale; 2 ScaleAnimation 类 对 象 构 造 ScaleAnimation(float fromx, float tox, float fromy, float toy, int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue) // 第 一 个 参 数 fromx 为 动 画 起 始 时 X 坐 标 上 的 伸 缩 尺 寸 // 第 二 个 参 数 tox 为 动 画 结 束 时 X 坐 标 上 的 伸 缩 尺 寸 // 第 三 个 参 数 fromy 为 动 画 起 始 时 Y 坐 标 上 的 伸 缩 尺 寸 // 第 四 个 参 数 toy 为 动 画 结 束 时 Y 坐 标 上 的 伸 缩 尺 寸

/* 说 明 : 以 上 四 种 属 性 值 0.0 表 示 收 缩 到 没 有 1.0 表 示 正 常 无 伸 缩 值 小 于 1.0 表 示 收 缩 值 大 于 1.0 表 示 放 大 */ // 第 五 个 参 数 pivotxtype 为 动 画 在 X 轴 相 对 于 物 件 位 置 类 型 // 第 六 个 参 数 pivotxvalue 为 动 画 相 对 于 物 件 的 X 坐 标 的 开 始 位 置 // 第 七 个 参 数 pivotxtype 为 动 画 在 Y 轴 相 对 于 物 件 位 置 类 型 // 第 八 个 参 数 pivotyvalue 为 动 画 相 对 于 物 件 的 Y 坐 标 的 开 始 位 置 myanimation_scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 3 设 置 动 画 持 续 时 间 myanimation_scale.setduration(700); // 设 置 时 间 持 续 时 间 为 700 毫 秒 TranslateAnimation 1 TranslateAnimation 类 对 象 定 义 private AlphaAnimation myanimation_translate; 2 TranslateAnimation 类 对 象 构 造 TranslateAnimation(float fromxdelta, float toxdelta, float fromydelta, float toydelta) // 第 一 个 参 数 fromxdelta 为 动 画 起 始 时 X 坐 标 上 的 移 动 位 置 // 第 二 个 参 数 toxdelta 为 动 画 结 束 时 X 坐 标 上 的 移 动 位 置 // 第 三 个 参 数 fromydelta 为 动 画 起 始 时 Y 坐 标 上 的 移 动 位 置 // 第 四 个 参 数 toydelta 为 动 画 结 束 时 Y 坐 标 上 的 移 动 位 置 3 设 置 动 画 持 续 时 间 myanimation_translate.setduration(2000); // 设 置 时 间 持 续 时 间 为 2000 毫 秒 RotateAnimation 1 RotateAnimation 类 对 象 定 义 private AlphaAnimation myanimation_rotate; 2 RotateAnimation 类 对 象 构 造 RotateAnimation(float fromdegrees, float todegrees, int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue) // 第 一 个 参 数 fromdegrees 为 动 画 起 始 时 的 旋 转 角 度 // 第 二 个 参 数 todegrees 为 动 画 旋 转 到 的 角 度 // 第 三 个 参 数 pivotxtype 为 动 画 在 X 轴 相 对 于 物 件 位 置 类 型 // 第 四 个 参 数 pivotxvalue 为 动 画 相 对 于 物 件 的 X 坐 标 的 开 始 位 置 // 第 五 个 参 数 pivotxtype 为 动 画 在 Y 轴 相 对 于 物 件 位 置 类 型 // 第 六 个 参 数 pivotyvalue 为 动 画 相 对 于 物 件 的 Y 坐 标 的 开 始 位 置

myanimation_rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f) 3 设 置 动 画 持 续 时 间 myanimation_rotate.setduration(3000); // 设 置 时 间 持 续 时 间 为 3000 毫 秒 --------------------------------------------------------------------- 下 面 的 小 例 子 是 利 用 RotateAnimation 简 单 展 示 一 下 两 种 方 法 的 用 法, 对 于 其 他 动 画, 如 ScaleAnimation,AlphaAnimation, 原 理 是 一 样 的 方 法 一 : 在 xml 中 定 义 动 画 : Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <set xmlns:android="http://schemas.android.com/apk/res/android"> 3. 4. <rotate 5. android:interpolator="@android:anim/accelerate_decelerate_interpolator" 6. android:fromdegrees="0" 7. android:todegrees="+360" 8. android:duration="3000" /> 9. 10. <!-- rotate 旋 转 动 画 效 果 11. 属 性 :interpolator 指 定 一 个 动 画 的 插 入 器, 用 来 控 制 动 画 的 速 度 变 化 12. fromdegrees 属 性 为 动 画 起 始 时 物 件 的 角 度 13. todegrees 属 性 为 动 画 结 束 时 物 件 旋 转 的 角 度, 正 代 表 顺 时 针 14. duration 属 性 为 动 画 持 续 时 间, 以 毫 秒 为 单 位 15. --> 16. lt;/set> 使 用 动 画 的 Java 代 码, 程 序 的 效 果 是 点 击 按 钮,TextView 旋 转 一 周 : Java 代 码 1. package com.ray.animation; 2. 3. import android.app.activity; 4. import android.os.bundle; 5. import android.view.view; 6. import android.view.view.onclicklistener; 7. import android.view.animation.animation; 8. import android.view.animation.animationutils; 9. import android.widget.button;

10. import android.widget.textview; 11. 12. public class TestAnimation extends Activity implements OnClickListener{ 13. public void oncreate(bundle savedinstancestate) { 14. super.oncreate(savedinstancestate); 15. setcontentview(r.layout.main); 16. Button btn = (Button)findViewById(R.id.Button01); 17. btn.setonclicklistener(this); 18. } 19. 20. @Override 21. public void onclick(view v) { 22. Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_rotate_action); 23. findviewbyid(r.id.textview01).startanimation(anim); 24. } 25. } 方 法 二 : 直 接 在 代 码 中 定 义 动 画 ( 效 果 跟 方 法 一 类 似 ): Java 代 码 1. package com.ray.animation; 2. 3. import android.app.activity; 4. import android.os.bundle; 5. import android.view.view; 6. import android.view.view.onclicklistener; 7. import android.view.animation.acceleratedecelerateinterpolator; 8. import android.view.animation.animation; 9. import android.view.animation.rotateanimation; 10. import android.widget.button; 11. 12. public class TestAnimation extends Activity implements OnClickListener{ 13. 14. public void oncreate(bundle savedinstancestate) { 15. super.oncreate(savedinstancestate); 16. setcontentview(r.layout.main); 17. Button btn = (Button)findViewById(R.id.Button); 18. btn.setonclicklistener(this); 19. } 20. 21. public void onclick(view v) { 22. Animation anim = null; 23. anim = new RotateAnimation(0.0f,+360.0f);

24. anim.setinterpolator(new AccelerateDecelerateInterpolator()); 25. anim.setduration(3000); 26. findviewbyid(r.id.textview01).startanimation(anim); 27. } 28. } 29. 一 Android 中 的 通 知 30. 一 般 手 机 上 边 都 有 一 个 状 态 条, 显 示 电 池 电 量 信 号 强 度 未 接 来 电 短 信... Android 的 屏 幕 上 方 也 具 有 状 态 条 这 里 所 说 的 通 知, 就 是 在 这 个 状 态 条 上 显 示 通 知 31. 32. 发 送 通 知 的 步 骤 如 下 : 33. 1). 获 取 通 知 管 理 器 34. NotificationManager mnotificationmanager = (NotificationManager) getsystemservice(context.notification_service); 35. 2). 新 建 一 个 通 知, 指 定 其 图 标 和 标 题 36. int icon = android.r.drawable.stat_notify_chat; 37. long when = System.currentTimeMillis(); 38. // 第 一 个 参 数 为 图 标, 第 二 个 参 数 为 标 题, 第 三 个 为 通 知 时 间 39. Notification notification = new Notification(icon, null, when);

40. Intent openintent = new Intent(this, OtherActivity.class); 41. // 当 点 击 消 息 时 就 会 向 系 统 发 送 openintent 意 图 42. PendingIntent contentintent = PendingIntent.getActivity(this, 0, openintent, 0); 43. notification.setlatesteventinfo(this, 标 题, 内 容 ", contentintent); 44. mnotificationmanager.notify(0, notification); 45. Android 中 的 样 式 和 主 题 46. android 中 的 样 式 和 CSS 样 式 作 用 相 似, 都 是 用 于 为 界 面 元 素 定 义 显 示 风 格, 它 是 一 个 包 含 一 个 戒 者 多 个 view 控 件 属 性 的 集 合 如 : 需 要 定 义 字 体 的 颜 色 和 大 小 47. 48. 1). 在 values 目 录 下 添 加 styles.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <style name="changcheng"> <item name="android:textsize">18px</item> <item name="android:textcolor">#0000cc</item> </style> </resources> 49.

50. 2). 在 layout 文 件 中 可 以 通 过 style 戒 theme 属 性 设 置 样 式 戒 主 题 三 使 用 HTML 做 为 UI 51. 使 用 LayoutUI 比 较 麻 烦, 丌 能 让 美 工 参 不 进 来, 这 样 就 为 开 发 人 员 带 来 了 麻 烦 但 我 们 可 以 通 过 HTML+JS 来 进 行 UI 的 设 计 不 操 作 52. 53. 1). 在 assets 添 加 Html 页 面 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 联 系 人 列 表 </title> <script type="text/javascript"> function show(jsondata){ var jsonobjs = eval(jsondata); var table = document.getelementbyid("persontable"); for(var y=0; y<jsonobjs.length; y++){ var tr = table.insertrow(table.rows.length); // 添 加 一 行 // 添 加 三 列 var td1 = tr.insertcell(0); var td2 = tr.insertcell(1); td2.align = "center"; var td3 = tr.insertcell(2); // 设 置 列 内 容 和 属 性 td1.innerhtml = jsonobjs[y].id; td2.innerhtml = jsonobjs[y].name; td3.innerhtml = "<a href='javascript:itcast.call(\""+ jsonobjs[y].phone +"\")'>"+ jsonobjs[y].phone+ "</a>"; } } </script> </head> <body>

<body bgcolor="#000000" text="#ffffff" style="margin:0 0 0 0" onload="javascript:itcast.getcontacts()"> <table border="0" width="100%" id="persontable" cellspacing="0"> <tr> <td width="15%"> 编 号 </td><td align="center"> 姓 名 </td><td width="15%"> 电 话 </td> </tr> </table> </body> </html> 54. 55. 2). 在 main.xlm 中 添 加 一 个 WebView 控 件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/webview" /> </LinearLayout> 56. 57. 3).Activity 类 package cn.itcast.html; import java.util.arraylist; import java.util.list; import org.json.jsonarray; import org.json.jsonobject; import cn.itcast.domain.contact; import android.app.activity; import android.content.intent;

import android.net.uri; import android.os.bundle; import android.os.handler; import android.util.log; import android.webkit.webview; public class ContactActivity extends Activity { private static final String TAG = "ContactActivity"; private WebView webview; private Handler handler = new Handler(); @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); webview = (WebView)this.findViewById(R.id.webView); webview.getsettings().setjavascriptenabled(true);// 设 置 支 持 javascript webview.getsettings().setsaveformdata(false);// 丌 保 存 表 单 数 据 webview.getsettings().setsavepassword(false);// 丌 保 存 密 码 webview.getsettings().setsupportzoom(false);// 丌 支 持 页 面 放 大 功 能 //addjavascriptinterface 方 法 中 要 绑 定 的 Java 对 象 及 方 法 要 运 行 在 另 外 的 线 程 中, 丌 能 运 行 在 构 造 他 的 线 程 中 webview.addjavascriptinterface(new MyJavaScript(), "itcast"); webview.loadurl("file:///android_asset/index.html"); } private final class MyJavaScript{ public void call(final String phone){ handler.post(new Runnable() { @Override public void run() { Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ phone)); startactivity(intent); } }); } /** * 获 取 所 有 联 系 人 */ public void getcontacts(){ handler.post(new Runnable() { @Override public void run() { // 可 以 通 过 访 问 SQLLite 数 据 库 得 到 联 系 人 List<Contact> contacts = new ArrayList<Contact>(); contacts.add(new Contact(27, " 路 飞 ", "12345"));

contacts.add(new Contact(28, " 索 隆 ", "67890")); String json = buildjson(contacts); webview.loadurl("javascript:show('"+ json +"')"); } }); } // 生 成 Json 格 式 的 数 据 private String buildjson(list<contact> contacts){ try { JSONArray array = new JSONArray(); for(contact contact : contacts){ JSONObject item = new JSONObject(); item.put("id", contact.getid()); item.put("name", contact.getname()); item.put("phone", contact.getphone()); array.put(item); } return array.tostring(); } catch (Exception e) { Log.e(TAG, e.tostring()); } return ""; } } } 58. 59. MyJavaScript 接 口 实 现 的 方 法 正 是 提 供 给 页 面 中 的 JS 代 码 调 用 的! 60. 2. 将 APK 包 放 入 到 SDCard 目 录 中 61. 在 FileExplorer 面 板 的 右 上 角 有 一 个 导 入 手 机 图 标, 将 上 面 生 成 的 APK 包 导 入 到 SDCard 目 录 中

Android 选 项 卡 效 果 首 先 创 建 Android 工 程 命 名 自 己 的 Activity 为 HelloTabWidget 在 main.xml 或 者 自 己 定 义 的 *.xml 文 件 中 创 建 一 个 TabHost, 需 要 两 个 元 素 TabWidget 和 FrameLayout 通 常 会 把 这 两 个 元 素 放 到 LinearLayout 中 FrameLayout 作 为 改 变 内 容 content 用 的 注 意 :TabWidget 和 FrameLayout 有 不 同 的 ID 命 名 空 间 android:id="@android:id/idnames", 这 个 是 必 须 的 因 此 TabHost 才 能 自 动 找 到 它,Activity 需 要 继 承 TabActivity Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 3. android:id="@android:id/tabhost" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent"> 6. <LinearLayout 7. android:orientation="vertical" 8. android:layout_width="fill_parent" 9. android:layout_height="fill_parent"> 10. <TabWidget 11. android:id="@android:id/tabs" 12. android:layout_width="fill_parent" 13. android:layout_height="wrap_content" /> 14. <FrameLayout 15. android:id="@android:id/tabcontent" 16. android:layout_width="fill_parent" 17. android:layout_height="fill_parent"> 18. <TextView 19. android:id="@+id/textview1" 20. android:layout_width="fill_parent" 21. android:layout_height="fill_parent" 22. android:text="this is a tab" /> 23. <TextView 24. android:id="@+id/textview2" 25. android:layout_width="fill_parent" 26. android:layout_height="fill_parent" 27. android:text="this is another tab" /> 28. <TextView 29. android:id="@+id/textview3"

30. android:layout_width="fill_parent" 31. android:layout_height="fill_parent" 32. android:text="this is a third tab" /> 33. </FrameLayout> 34. </LinearLayout> 35. </TabHost> Activity 需 要 继 承 TabActivity Java 代 码 1. public class HelloTabWidget extends TabActivity Java 代 码 1. public void oncreate(bundle savedinstancestate) { 2. super.oncreate(savedinstancestate); 3. setcontentview(r.layout.main); 4. mtabhost = gettabhost(); 5. mtabhost.addtab(mtabhost.newtabspec("tab_test1").setindicator("tab 1") 6.. setcontent(r.id.textview1)); 7. mtabhost.addtab(mtabhost.newtabspec("tab_test2").setindicator("tab 2").setConte nt(r.id.textview2)); 8. mtabhost.addtab(mtabhost.newtabspec("tab_test3").setindicator("tab 3").setConte nt(r.id.textview3)); 9. 10. mtabhost.setcurrenttab(0); 11. } Android BaseExpandableListAdapter 教 程 文 章 分 类 : 移 动 开 发 先 上 图 再 说, 实 现 效 果 如 下 图, 选 项 可 多 少 可 变 化

BaseExpandableListAdapter 实 现 Java 代 码 1. import java.util.list; 2. 3. import android.content.context; 4. import android.graphics.drawable.drawable; 5. import android.view.layoutinflater; 6. import android.view.view; 7. import android.view.viewgroup; 8. import android.widget.baseexpandablelistadapter; 9. import android.widget.checkbox; 10. import android.widget.imageview;

11. import android.widget.textview; 12. import com.iwidsets.clear.manager.r; 13. import com.iwidsets.clear.manager.adapter.browserinfo; 14. 15. public class ClearExpandableListAdapter extends BaseExpandableListAdapter { 16. 17. class ExpandableListHolder { 18. ImageView appicon; 19. TextView appinfo; 20. CheckBox appcheckbox; 21. } 22. 23. private Context context; 24. private LayoutInflater mchildinflater; 25. private LayoutInflater mgroupinflater; 26. private List<GroupInfo> group; 27. 28. public ClearExpandableListAdapter(Context c, List<GroupInfo> group) { 29. this.context = c; 30. mchildinflater = (LayoutInflater) context 31..getSystemService(Context.LAYOUT_INFLATER_SERVICE); 32. mgroupinflater = (LayoutInflater) context 33..getSystemService(Context.LAYOUT_INFLATER_SERVICE); 34. this.group = group; 35. } 36. 37. public Object getchild(int childposition, int itemposition) { 38. return group.get(childposition).getchild(itemposition); 39. } 40. 41. public long getchildid(int childposition, int itemposition) { 42. 43. return itemposition; 44. } 45. 46. @Override 47. public int getchildrencount(int index) { 48. return group.get(index).getchildsize(); 49. } 50. 51. public Object getgroup(int index) { 52. return group.get(index); 53. } 54.

55. public int getgroupcount() { 56. return group.size(); 57. } 58. 59. public long getgroupid(int index) { 60. return index; 61. } 62. 63. public View getgroupview(int position, boolean flag, View view, 64. ViewGroup parent) { 65. ExpandableListHolder holder = null; 66. if (view == null) { 67. view = mgroupinflater.inflate( 68. R.layout.browser_expandable_list_item, null); 69. holder = new ExpandableListHolder(); 70. holder.appicon = (ImageView) view.findviewbyid(r.id.app_icon); 71. view.settag(holder); 72. holder.appinfo = (TextView) view.findviewbyid(r.id.app_info); 73. holder.appcheckbox = (CheckBox) view 74..findViewById(R.id.app_checkbox); 75. } else { 76. holder = (ExpandableListHolder) view.gettag(); 77. } 78. GroupInfo info = this.group.get(position); 79. if (info!= null) { 80. holder.appinfo.settext(info.getbrowserinfo().getappinfoid()); 81. Drawable draw = this.context.getresources().getdrawable( 82. info.getbrowserinfo().getimageid()); 83. holder.appicon.setimagedrawable(draw); 84. holder.appcheckbox.setchecked(info.getbrowserinfo().ischecked()); 85. } 86. return view; 87. } 88. 89. public boolean hasstableids() { 90. return false; 91. } 92. 93. public boolean ischildselectable(int arg0, int arg1) { 94. return false; 95. } 96. 97. @Override 98. public View getchildview(int groupposition, int childposition,

99. boolean islastchild, View convertview, ViewGroup parent) { 100. ExpandableListHolder holder = null; 101. if (convertview == null) { 102. convertview = mchildinflater.inflate( 103. R.layout.browser_expandable_list_item, null); 104. holder = new ExpandableListHolder(); 105. holder.appicon = (ImageView) convertview 106..findViewById(R.id.app_icon); 107. convertview.settag(holder); 108. holder.appinfo = (TextView) convertview.findviewbyid(r.id.app_info); 109. holder.appcheckbox = (CheckBox) convertview 110..findViewById(R.id.app_checkbox); 111. } else { 112. holder = (ExpandableListHolder) convertview.gettag(); 113. } 114. BrowserInfo info = this.group.get(groupposition) 115..getChild(childPosition); 116. if (info!= null) { 117. holder.appinfo.settext(info.getappinfoid()); 118. Drawable draw = this.context.getresources().getdrawable( 119. info.getimageid()); 120. holder.appicon.setimagedrawable(draw); 121. holder.appcheckbox.setchecked(info.ischecked()); 122. } 123. return convertview; 124. } 125. 126. } 要 想 让 child 获 得 焦 点, 只 在 改 Java 代 码 1. public boolean ischildselectable(int arg0, int arg1) { 2. return true; 3. }

browser_expandable_list_item.xml 用 于 显 示 每 一 个 ITEM 的 XML Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="fill_parent" android:layout_height="wrap_content" 4. android:orientation="horizontal" android:minheight="40px" 5. android:layout_gravity="center_vertical"> 6. <CheckBox android:id="@+id/app_checkbox" android:focusable="false" 7. android:layout_width="wrap_content" android:layout_height="wrap_content" 8. android:layout_marginleft="35px" android:checked="true"/> 9. <ImageView android:id="@+id/app_icon" android:layout_width="wrap_content" 10. android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> 11. 12. <TextView android:id="@+id/app_info" android:layout_width="wrap_content" 13. android:layout_height="wrap_content" android:textcolor="?android:attr/textcolorprim ary" 14. android:paddingleft="3px" android:layout_gravity="center_vertical" /> 15. </LinearLayout> browserlayout.xml 用 于 显 示 整 个 界 面 Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="fill_parent" android:layout_height="fill_parent" 4. android:orientation="vertical"> 5. <ExpandableListView android:id="@+id/applist" 6. android:layout_width="fill_parent" android:layout_height="0dip" 7. android:layout_weight="1" /> 8. <LinearLayout android:layout_height="wrap_content" 9. android:layout_width="fill_parent" android:paddingleft="4dip" 10. android:paddingright="4dip" android:paddingbottom="1dip"

11. android:paddingtop="5dip" android:background="@android:drawable/bottom_bar" 12. android:id="@+id/app_footer"> 13. <Button android:layout_weight="1" android:id="@+id/btn_export" 14. android:layout_width="0dip" android:layout_height="fill_parent" 15. android:text="@string/clear"></button> 16. <Button android:layout_weight="1" android:id="@+id/btn_sel_all" 17. android:layout_width="0dip" android:layout_height="fill_parent" 18. android:text="select_all"></button> 19. <Button android:layout_weight="1" android:id="@+id/btn_desel_all" 20. android:layout_width="0dip" android:layout_height="fill_parent" 21. android:text="deselect_all"></button> 22. </LinearLayout> 23. 24. </LinearLayout> BrowserInfo 用 于 提 供 一 个 项 的 信 息 Java 代 码 1. public class BrowserInfo { 2. 3. private int appinfoid; 4. private int imageid; 5. private boolean checked; 6. 7. public BrowserInfo(int appinfoid, int imageid, boolean checked) { 8. this.appinfoid = appinfoid; 9. this.imageid = imageid; 10. this.checked = checked; 11. } 12. 13. public boolean ischecked() { 14. return checked; 15. } 16. 17. public void setchecked(boolean checked) { 18. this.checked = checked; 19. } 20. 21. public int getappinfoid() {

22. return appinfoid; 23. } 24. 25. public void setappinfoid(int appinfoid) { 26. this.appinfoid = appinfoid; 27. } 28. 29. public int getimageid() { 30. return imageid; 31. } 32. 33. public void setimageid(int imageid) { 34. this.imageid = imageid; 35. } 36. 37. } GroupInfo 用 于 显 示 一 个 组 的 信 息 Java 代 码 1. import java.util.list; 2. 3. public class GroupInfo { 4. 5. private BrowserInfo group; 6. private List<BrowserInfo> child; 7. 8. public GroupInfo(BrowserInfo group, List<BrowserInfo> child) { 9. 10. this.group = group; 11. this.child = child; 12. } 13. 14. public void add(browserinfo info){ 15. child.add(info); 16. } 17. 18. public void remove(browserinfo info){ 19. child.remove(info); 20. }

21. 22. public void remove(int index){ 23. child.remove(index); 24. } 25. 26. public int getchildsize(){ 27. return child.size(); 28. } 29. 30. public BrowserInfo getchild(int index){ 31. return child.get(index); 32. } 33. 34. public BrowserInfo getbrowserinfo() { 35. return group; 36. } 37. 38. public void setbrowserinfo(browserinfo group) { 39. this.group = group; 40. } 41. 42. public List<BrowserInfo> getchild() { 43. return child; 44. } 45. 46. public void setchild(list<browserinfo> child) { 47. this.child = child; 48. } 49. 50. } ClearBrowserActivity 最 后 就 是 把 要 显 示 的 内 容 显 示 出 来 的 Java 代 码 1. public class ClearBrowserActivity extends Activity implements ExpandableListView.OnGr oupclicklistener,expandablelistview.onchildclicklistener{

2. 3. private List<GroupInfo> group; 4. 5. private ClearExpandableListAdapter listadapter = null; 6. private ExpandableListView applist; 7. 8. public void oncreate(bundle savedinstancestate) { 9. super.oncreate(savedinstancestate); 10. setcontentview(r.layout.browserlayout); 11. applist = (ExpandableListView) findviewbyid(r.id.applist); 12. init(); 13. BrowserInfo browsinghistoryparents = newbrowserinfo( 14. R.string.browsinghistory, R.drawable.browser_image,true); 15. List<BrowserInfo> browsinghistorychild = new ArrayList<BrowserInfo>(); 16. BrowserInfo browser = newbrowserinfo(r.string.browser, 17. R.drawable.browser_image, true); 18. browsinghistorychild.add(browser); 19. 20. BrowserInfo operaclear = newbrowserinfo(r.string.opera_clear, 21. R.drawable.browser_image,true); 22. browsinghistorychild.add(operaclear); 23. 24. BrowserInfo firefoxclear = newbrowserinfo(r.string.firefox_clear, 25. R.drawable.browser_image,true); 26. browsinghistorychild.add(firefoxclear); 27. 28. BrowserInfo ucwebclear = newbrowserinfo(r.string.ucweb_clear, 29. R.drawable.browser_image,false); 30. browsinghistorychild.add(ucwebclear); 31. 32. GroupInfo browsergroup = new GroupInfo(browsingHistoryParents, 33. browsinghistorychild); 34. addgroup(browsergroup); 35. 36. listadapter = new ClearExpandableListAdapter(this, group); 37. applist.setonchildclicklistener(this); 38. applist.setongroupclicklistener(this); 39. applist.setadapter(listadapter); 40. } 41. 42. private void init() { 43. group = new ArrayList<GroupInfo>(); 44. } 45.

46. private void addgroup(groupinfo info) { 47. group.add(info); 48. } 49. 50. private static BrowserInfo newbrowserinfo(int infoid, int imageid,boolean checked) { 51. return new BrowserInfo(infoId, imageid,checked); 52. } 53. 54. @Override 55. public boolean ongroupclick(expandablelistview parent, View v, 56. int groupposition, long id) { 57. return false; 58. } 59. 60. @Override 61. public boolean onchildclick(expandablelistview parent, View v, 62. int groupposition, int childposition, long id) { 63. return false; 64. } 65. } android 3d 旋 转 文 章 分 类 :Java 编 程 在 javaeye 里 看 到 了 关 于 3d 旋 转 的 文 章, 可 是 博 主 没 有 透 入 什 么 技 术 细 节 由 于 一 直 想 做 出 那 种 旋 转 效 果, 所 以 就 想 啊 想, 终 于 想 出 来 了 ( 我 是 个 小 菜 鸟 ) 呵 呵, 不 管 怎 样, 希 望 对 想 做 还 没 做 出 来 的 朋 友 一 些 帮 助 先 上 一 个 效 果 图 :

这 是 你 想 要 的 吗? 如 果 是 就 继 续 往 下 看 吧 其 实, 这 个 效 果 是 用 animation 配 合 camera 做 出 来 的, 相 信 大 家 在 apidemo 里 面 看 过 类 似 的 那 么 先 写 一 个 继 承 animation 的 类 :Rotate3d Rotate3d 代 码 1. public class Rotate3d extends Animation { 2. private float mfromdegree; 3. private float mtodegree; 4. private float mcenterx; 5. private float mcentery; 6. private float mleft; 7. private float mtop; 8. private Camera mcamera; 9. private static final String TAG = "Rotate3d"; 10. 11. public Rotate3d(float fromdegree, float todegree, float left, float top, 12. float centerx, float centery) { 13. this.mfromdegree = fromdegree;

14. this.mtodegree = todegree; 15. this.mleft = left; 16. this.mtop = top; 17. this.mcenterx = centerx; 18. this.mcentery = centery; 19. 20. } 21. 22. @Override 23. public void initialize(int width, int height, int parentwidth, 24. int parentheight) { 25. super.initialize(width, height, parentwidth, parentheight); 26. mcamera = new Camera(); 27. } 28. 29. @Override 30. protected void applytransformation(float interpolatedtime, Transformation t) { 31. final float FromDegree = mfromdegree; 32. float degrees = FromDegree + (mtodegree - mfromdegree) 33. * interpolatedtime; 34. final float centerx = mcenterx; 35. final float centery = mcentery; 36. final Matrix matrix = t.getmatrix(); 37. 38. if (degrees <= -76.0f) { 39. degrees = -90.0f; 40. mcamera.save(); 41. mcamera.rotatey(degrees); 42. mcamera.getmatrix(matrix); 43. mcamera.restore(); 44. } else if(degrees >=76.0f){ 45. degrees = 90.0f; 46. mcamera.save(); 47. mcamera.rotatey(degrees); 48. mcamera.getmatrix(matrix); 49. mcamera.restore(); 50. }else{ 51. mcamera.save(); 52. // 这 里 很 重 要 哦 53. mcamera.translate(0, 0, centerx); 54. mcamera.rotatey(degrees); 55. mcamera.translate(0, 0, -centerx); 56. mcamera.getmatrix(matrix); 57. mcamera.restore();

58. } 59. 60. matrix.pretranslate(-centerx, -centery); 61. matrix.posttranslate(centerx, centery); 62. } 63. } 有 了 这 个 类 一 切 都 会 变 得 简 单 的, 接 着 只 要 在 activity 中 写 两 个 Rotate3d 的 对 象, 让 两 个 view, 分 别 做 这 两 个 对 象 的 animation 就 好 了 ( 原 来 就 这 么 简 单 啊! 无 语 ) Activity 代 码 1. // 下 面 两 句 很 关 键 哦, 呵 呵, 心 照 不 宣 2. Rotate3d leftanimation = new Rotate3d(-0, -90, 0, 0, mcenterx, mcentery); 3. Rotate3d rightanimation = new Rotate3d(-0+90, -90+90, 0.0f, 0.0f, mcenterx, mcent 4. ery); 5. leftanimation.setfillafter(true); 6. leftanimation.setduration(1000); 7. rightanimation.setfillafter(true); 8. rightanimation.setduration(1000); 9. 10. mimageview1.startanimation(leftanimation); 11. mimageview2.startanimation(rightanimation); 还 要 写 一 下 mimageview1,mimageview2 的 xml, Xml 代 码 1. <?xml version="1.0" encoding="utf-8"?>

2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="wrap_content" 6. > 7. 8. <FrameLayout 9. android:layout_width="fill_parent" 10. android:layout_height="fill_parent"> 11. 12. <ImageView 13. android:id="@+id/image1" 14. android:layout_gravity="center_horizontal" 15. android:layout_width="fill_parent" 16. android:layout_height="wrap_content" 17. android:src="@drawable/image1" 18. /> 19. <ImageView 20. android:id="@+id/image2" 21. android:background="#ffff0000" 22. android:layout_gravity="center_horizontal" 23. android:layout_width="fill_parent" 24. android:layout_height="wrap_content" 25. android:src="@drawable/image2" 26. /> 27. 28. </FrameLayout> 29. </LinearLayout> 写 完 收 工 如 果 有 不 足 之 处, 还 请 朋 友 们 不 吝 指 教 Android File Explorer 展 示 图 片 文 章 分 类 : 移 动 开 发

res/layout/row.xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rowtext" android:layout_width="fill_parent" android:layout_height="25px" android:textsize="23sp" /> /res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/path" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView

android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="no Data" /> </LinearLayout> /res/layout/jpgdialog.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_root" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingleft="10dip" android:paddingright="10dip" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="11sp" /> /> <ImageView android:id="@+id/image" android:layout_width="150px" android:layout_height="150px" /> <Button android:id="@+id/okdialogbutton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ok" /> </LinearLayout> import java.io.file; import java.io.ioexception; import java.util.arraylist;

import java.util.list; import android.app.alertdialog; import android.app.dialog; import android.app.listactivity; import android.content.context; import android.content.dialoginterface; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.media.exifinterface; import android.os.bundle; import android.view.view; import android.widget.arrayadapter; import android.widget.button; import android.widget.imageview; import android.widget.listview; import android.widget.textview; public class AndroidExplorer extends ListActivity { static final int ID_JPGDIALOG = 0; String filename; String exifattribute; TextView exiftext; ImageView bmimage; BitmapFactory.Options bmoptions; File jpgfile; Dialog jpgdialog; private List<String> item = null; private List<String> path = null; private String root="/"; private TextView mypath; /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); mypath = (TextView)findViewById(R.id.path); getdir(root); } private void getdir(string dirpath)

{ mypath.settext("location: " + dirpath); item = new ArrayList<String>(); path = new ArrayList<String>(); File f = new File(dirPath); File[] files = f.listfiles(); if(!dirpath.equals(root)) { } item.add(root); path.add(root); item.add("../"); path.add(f.getparent()); for(int i=0; i < files.length; i++) { File file = files[i]; path.add(file.getpath()); if(file.isdirectory()) item.add(file.getname() + "/"); else item.add(file.getname()); } } ArrayAdapter<String> filelist = new ArrayAdapter<String>(this, R.layout.row, item); setlistadapter(filelist); @Override protected void onlistitemclick(listview l, View v, int position, long id) { File file = new File(path.get(position)); if (file.isdirectory()) { if(file.canread())

getdir(path.get(position)); else { new AlertDialog.Builder(this).setIcon(R.drawable.icon).setTitle("[" + file.getname() + "] folder can't be read!").setpositivebutton("ok", new DialogInterface.OnClickListener() { @Override public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub } }).show(); } } else { exifattribute = null; filename = file.getname(); String ext = filename.substring(filename.lastindexof('.')+1, filename.length()); if(ext.equals("jpg") ext.equals("jpg")) { try { ExifInterface exif = new ExifInterface(file.toString()); exifattribute = getexif(exif); } catch (IOException e) { // TODO Auto-generated catch block ; } jpgfile = file; showdialog(id_jpgdialog); } else{ new AlertDialog.Builder(this).setIcon(R.drawable.icon).setTitle("[" + filename + "]").setmessage(exifattribute).setpositivebutton("ok", new DialogInterface.OnClickListener() { @Override

which) { } } } public void onclick(dialoginterface dialog, int // TODO Auto-generated method stub } }).show(); private String getexif(exifinterface exif) { String myattribute=null; myattribute += gettagstring(exifinterface.tag_datetime, exif); myattribute += gettagstring(exifinterface.tag_flash, exif); myattribute += gettagstring(exifinterface.tag_gps_latitude, exif); myattribute += gettagstring(exifinterface.tag_gps_latitude_ref, exif); myattribute += gettagstring(exifinterface.tag_gps_longitude, exif); myattribute += gettagstring(exifinterface.tag_gps_longitude_ref, exif); myattribute += gettagstring(exifinterface.tag_image_length, exif); myattribute += gettagstring(exifinterface.tag_image_width, exif); myattribute += gettagstring(exifinterface.tag_make, exif); myattribute += gettagstring(exifinterface.tag_model, exif); myattribute += gettagstring(exifinterface.tag_orientation, exif); myattribute += gettagstring(exifinterface.tag_white_balance, exif); return myattribute; } private String gettagstring(string tag, ExifInterface exif) { return(tag + " : " + exif.getattribute(tag) + "\n"); } @Override protected Dialog oncreatedialog(int id) { jpgdialog = null;; switch(id){

case ID_JPGDIALOG: Context mcontext = this; jpgdialog = new Dialog(mContext); jpgdialog.setcontentview(r.layout.jpgdialog); exiftext = (TextView) jpgdialog.findviewbyid(r.id.text); bmimage = (ImageView)jpgDialog.findViewById(R.id.image); bmoptions = new BitmapFactory.Options(); bmoptions.insamplesize = 2; Button okdialogbutton = (Button)jpgDialog.findViewById(R.id.okdialogbutton); okdialogbutton.setonclicklistener(okdialogbuttononclicklistener); } break; default: break; } return jpgdialog; @Override protected void onpreparedialog(int id, Dialog dialog) { // TODO Auto-generated method stub switch(id){ case ID_JPGDIALOG: dialog.settitle("[" + filename + "]"); exiftext.settext(exifattribute); Bitmap bm = BitmapFactory.decodeFile(jpgFile.getPath(), bmoptions); bmimage.setimagebitmap(bm); } break; default: break; } private Button.OnClickListener okdialogbuttononclicklistener = new Button.OnClickListener(){ @Override public void onclick(view v) {

}; } } // TODO Auto-generated method stub jpgdialog.dismiss(); android ShapeDrawable 实 例 文 章 分 类 : 移 动 开 发 今 天 看 了 一 下 api 中 的 画 图, 遇 到 了 一 个 新 的 类,Shader 类 介 绍,android 中 提 供 了 Shader 类 专 门 来 渲 染 图 像 已 经 一 些 几 何 图 形,shader 下 面 包 括 几 个 直 接 子 类, 分 别 是 BitmapShaper,ComposeShader, LinerGradient,RadialGradient,SweepGradient.BitmapShader 主 要 用 来 渲 染 图 像,Shader 类 的 使 用, 先 构 造 Shdaer 对 象, 然 后 通 过 Paint 的 setshader 方 法 来 设 置 渲 染 对 象, 然 后 再 绘 制 使 用 这 个 Paint 对 象 既 可 Java 代 码 1. import android.app.activity; 2. import android.content.context; 3. import android.graphics.bitmap; 4. import android.graphics.bitmapshader; 5. import android.graphics.canvas; 6. import android.graphics.composepatheffect; 7. import android.graphics.cornerpatheffect; 8. import android.graphics.discretepatheffect; 9. import android.graphics.lineargradient; 10. import android.graphics.paint; 11. import android.graphics.path; 12. import android.graphics.patheffect; 13. import android.graphics.rectf; 14. import android.graphics.shader; 15. import android.graphics.sweepgradient; 16. import android.graphics.drawable.drawable; 17. import android.graphics.drawable.shapedrawable; 18. import android.graphics.drawable.shapes.arcshape; 19. import android.graphics.drawable.shapes.ovalshape; 20. import android.graphics.drawable.shapes.pathshape; 21. import android.graphics.drawable.shapes.rectshape; 22. import android.graphics.drawable.shapes.roundrectshape; 23. import android.graphics.drawable.shapes.shape; 24. import android.os.bundle; 25. import android.view.view;

26. 27. public class ShapeDrawble1 extends Activity { 28. /** Called when the activity is first created. */ 29. 30. 31. @Override 32. protected void oncreate(bundle savedinstancestate) { 33. super.oncreate(savedinstancestate); 34. setcontentview(new SampleView(this)); 35. } 36. 37. private static class SampleView extends View { 38. private ShapeDrawable[] mdrawables; 39. 40. private static Shader makesweep() { 41. /* SweepGradient 是 继 承 于 Shader 的, 它 是 以 中 心 点 (150,25) 42. * 按 照 下 列 四 种 颜 色 进 行 变 化 的 */ 43. return new SweepGradient(0, 0, 44. new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 }, 45. null);// null 表 示 均 衡 变 化 46. } 47. 48. private static Shader makelinear() { 49. // 颜 色 按 照 直 线 线 性 变 化 的 着 色 器 50. return new LinearGradient(100, 100, 0, 0, 51. new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF }, 52. null, Shader.TileMode.MIRROR); 53. } 54. 55. private static Shader maketiling() { 56. int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0}; 57. Bitmap bm = Bitmap.createBitmap(pixels, 1, 1, 58. Bitmap.Config.ARGB_8888); 59. /** 60. * BitmapShader 是 一 个 位 图 着 色 器, 这 个 着 色 器 是 通 过 61. * 在 x,y 方 向 重 复 位 图 bm 的 像 素 来 着 色 的 62. * 63. */ 64. return new BitmapShader(bm, Shader.TileMode.REPEAT, 65. Shader.TileMode.REPEAT); 66. } 67. /** 68. * ShapeDrawable 是 绘 制 各 种 几 何 体 的 类 它 注 入 想 要 绘 制 的 形 状 shap 69. * 类, 就 可 以 绘 制 出 我 们 想 要 的 集 合 体, 这 个 类 最 寒 心 的 就 是 draw(canvas)

70. * 和 ondraw(shape,canvas,paint) 这 个 方 法 调 用 71. * 72. */ 73. private static class MyShapeDrawable extends ShapeDrawable { 74. //Paint.ANTI_ALIAS_FLAG 代 表 这 个 画 笔 的 图 形 是 光 滑 的 75. private Paint mstrokepaint = new Paint(Paint.ANTI_ALIAS_FLAG); 76. 77. public MyShapeDrawable(Shape s) { 78. super(s); 79. mstrokepaint.setstyle(paint.style.stroke); 80. } 81. 82. public Paint getstrokepaint() { 83. return mstrokepaint; 84. } 85. 86. @Override protected void ondraw(shape s, Canvas c, Paint p) { 87. // 绘 制 填 充 效 果 的 图 形 88. s.draw(c, p); 89. // 绘 制 黑 边 90. s.draw(c, mstrokepaint); 91. } 92. } 93. 94. public SampleView(Context context) { 95. super(context); 96. setfocusable(true); 97. // 外 部 圆 角 矩 形 的 圆 角 圆 半 径, 上 面 俩 个 角 是 圆 98. float[] outerr = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 }; 99. // 内 部 矩 形 100. RectF inset = new RectF(6, 6, 6, 6); 101. // 内 部 圆 角 矩 形 的 圆 角 是 圆 半 径, 左 上 角 和 右 下 角 是 圆 角 矩 形 102. float[] innerr = new float[] { 12, 12, 0, 0, 12, 12, 0, 0 }; 103. // 绘 制 一 个 顶 点 为 下 列 四 个 点 的 棱 形 104. Path path = new Path(); 105. path.moveto(50, 0); 106. path.lineto(0, 50); 107. path.lineto(50, 100); 108. path.lineto(100, 50); 109. // 封 闭 前 面 点 所 绘 制 的 路 径 110. path.close(); 111. 112. mdrawables = new ShapeDrawable[7]; 113. // 绘 制 矩 形

114. mdrawables[0] = new ShapeDrawable(new RectShape()); 115. // 绘 制 椭 圆 116. mdrawables[1] = new ShapeDrawable(new OvalShape()); 117. // 绘 制 上 面 俩 个 角 是 圆 角 的 矩 形 118. mdrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null, 119. null)); 120. // 绘 制 上 面 俩 角 是 圆 角, 并 且 有 一 个 内 嵌 的 矩 形 121. mdrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset, 122. null)); 123. //// 绘 制 上 面 俩 角 是 圆 角, 并 且 有 一 个 内 嵌 的 矩 形 且 左 上 角 和 右 下 角 是 圆 形 矩 形 环 124. mdrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset, 125. innerr)); 126. // 绘 制 指 定 路 径 的 集 合 体 127. mdrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100)); 128. // 用 自 定 的 ShapDrawble 绘 制 开 始 弧 度 45 扫 过 弧 度 -270 的 椭 圆 129. mdrawables[6] = new MyShapeDrawable(new ArcShape(45, -270)); 130. 131. mdrawables[0].getpaint().setcolor(0xffff0000); 132. mdrawables[1].getpaint().setcolor(0xff00ff00); 133. mdrawables[2].getpaint().setcolor(0xff0000ff); 134. mdrawables[3].getpaint().setshader(makesweep()); 135. mdrawables[4].getpaint().setshader(makelinear()); 136. mdrawables[5].getpaint().setshader(maketiling()); 137. mdrawables[6].getpaint().setcolor(0x88ff8844); 138. //DiscretePathEffect 是 一 个 折 线 路 径 效 果, 分 割 长 度 是 10, 偏 差 时 4 139. PathEffect pe = new DiscretePathEffect(10, 4); 140. //CornerPathEffect 是 将 2 个 路 径 效 果 合 并 后 的 路 径 效 果 141. PathEffect pe2 = new CornerPathEffect(4); 142. mdrawables[3].getpaint().setpatheffect( 143. new ComposePathEffect(pe2, pe)); 144. 145. MyShapeDrawable msd = (MyShapeDrawable)mDrawables[6]; 146. // 设 置 笔 画 宽 度 等 于 4 147. msd.getstrokepaint().setstrokewidth(4); 148. } 149. 150. @Override protected void ondraw(canvas canvas) { 151. 152. int x = 10; 153. int y = 10; 154. int width = 300; 155. int height = 50; 156. // 循 环 绘 制

157. for (Drawable dr : mdrawables) { 158. dr.setbounds(x, y, x + width, y + height); 159. dr.draw(canvas); 160. y += height + 5; 161. } 162. } 163. } 164. } Eclipse 开 发 Android, TableLayout( 学 习 4) Hello, TableLayout A TableLayout is a ViewGroup that will lay child View elements into rows and columns. 1. Start a new project/activity called HelloTableLayout. 2. Open the layout file. Make it like so: 3. <?xml version="1.0" encoding="utf-8"?> 4. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 5. android:layout_width="fill_parent" 6. android:layout_height="fill_parent" 7. android:stretchcolumns="1"> 8. 9. <TableRow> 10. <TextView 11. android:layout_column="1" 12. android:text="open..." 13. android:padding="3dip" /> 14. <TextView 15. android:text="ctrl-o" 16. android:gravity="right" 17. android:padding="3dip" /> 18. </TableRow> 19. 20. <TableRow> 21. <TextView 22. android:layout_column="1"

23. android:text="save..." 24. android:padding="3dip" /> 25. <TextView 26. android:text="ctrl-s" 27. android:gravity="right" 28. android:padding="3dip" /> 29. </TableRow> 30. 31. <TableRow> 32. <TextView 33. android:layout_column="1" 34. android:text="save As..." 35. android:padding="3dip" /> 36. <TextView 37. android:text="ctrl-shift-s" 38. android:gravity="right" 39. android:padding="3dip" /> 40. </TableRow> 41. 42. <View 43. android:layout_height="2dip" 44. android:background="#ff909090" /> 45. 46. <TableRow> 47. <TextView 48. android:text="x" 49. android:padding="3dip" /> 50. <TextView 51. android:text="import..." 52. android:padding="3dip" /> 53. </TableRow> 54. 55. <TableRow> 56. <TextView 57. android:text="x" 58. android:padding="3dip" /> 59. <TextView 60. android:text="export..." 61. android:padding="3dip" /> 62. <TextView 63. android:text="ctrl-e" 64. android:gravity="right" 65. android:padding="3dip" /> 66. </TableRow>

67. 68. <View 69. android:layout_height="2dip" 70. android:background="#ff909090" /> 71. 72. <TableRow> 73. <TextView 74. android:layout_column="1" 75. android:text="quit" 76. android:padding="3dip" /> 77. </TableRow> 78.</TableLayout> Notice how this resembles the structure of an HTML table. TableLayout is like the table element; TableRow is like a tr element; but for our cells like the html td element, we can use any kind of View. Here, we use TextView for the cells. 79. Make sure your Activity loads this layout in the oncreate() method: 80.public void oncreate(bundle savedinstancestate) { 81. super.oncreate(savedinstancestate); 82. setcontentview(r.layout.main); 83.} R.layout.main refers to the main.xml layout file. 84. Run it. You should see the following: 备 注 :TableLayout 与 html 中 表 格 类 似 系 出 名 门 Android(8)

文 章 分 类 : 移 动 开 发 系 出 名 门 Android(8) - 控 件 (View) 之 TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList 介 绍 在 Android 中 使 用 各 种 控 件 (View) TextSwitcher - 文 字 转 换 器 控 件 ( 改 变 文 字 时 增 加 一 些 动 画 效 果 ) Gallery - 缩 略 图 浏 览 器 控 件 ImageSwitcher - 图 片 转 换 器 控 件 ( 改 变 图 片 时 增 加 一 些 动 画 效 果 ) GridView - 网 格 控 件 ListView - 列 表 控 件 ExpandableList - 支 持 展 开 / 收 缩 功 能 的 列 表 控 件 Java 代 码 1. 1 TextSwitcher 的 Demo 2. textswitcher.xml 3. 4. 代 码 5. <?xml version="1.0" encoding="utf-8"?> 6. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 7. android:orientation="vertical" android:layout_width="fill_parent" 8. android:layout_height="fill_parent"> 9. 10. <Button android:id="@+id/btnchange" android:layout_width="wrap_content" 11. android:layout_height="wrap_content" android:text=" 改 变 文 字 " /> 12. 13. <!-- 14. TextSwitcher - 文 字 转 换 器 控 件 ( 改 变 文 字 时 增 加 一 些 动 画 效 果 ) 15. --> 16. <TextSwitcher android:id="@+id/textswitcher" 17. android:layout_width="fill_parent" android:layout_height="wrap_content" /> 18. 19. </LinearLayout> 20. 21. 22. _TextSwitcher.java 23. 24. 代 码 25. package com.webabcd.view; 26. 27. import java.util.random; 28.

29. import android.app.activity; 30. import android.os.bundle; 31. import android.view.view; 32. import android.view.animation.animation; 33. import android.view.animation.animationutils; 34. import android.widget.button; 35. import android.widget.textswitcher; 36. import android.widget.textview; 37. import android.widget.viewswitcher; 38. 39. public class _TextSwitcher extends Activity implements ViewSwitcher.ViewFactory { 40. 41. @Override 42. protected void oncreate(bundle savedinstancestate) { 43. // TODO Auto-generated method stub 44. super.oncreate(savedinstancestate); 45. this.setcontentview(r.layout.textswithcer); 46. 47. settitle("textswithcer"); 48. 49. final TextSwitcher switcher = (TextSwitcher) findviewbyid(r.id.textswitcher); 50. // 指 定 转 换 器 的 ViewSwitcher.ViewFactory 51. switcher.setfactory(this); 52. 53. // 设 置 淡 入 和 淡 出 的 动 画 效 果 54. Animation in = AnimationUtils.loadAnimation(this, android.r.anim.fade_in); 55. Animation out = AnimationUtils.loadAnimation(this, android.r.anim.fade_out); 56. switcher.setinanimation(in); 57. switcher.setoutanimation(out); 58. 59. // 单 击 一 次 按 钮 改 变 一 次 文 字 60. Button btnchange = (Button) this.findviewbyid(r.id.btnchange); 61. btnchange.setonclicklistener(new View.OnClickListener() { 62. @Override 63. public void onclick(view v) { 64. switcher.settext(string.valueof(new Random().nextInt())); 65. } 66. }); 67. } 68. 69. // 重 写 ViewSwitcher.ViewFactory 的 makeview(), 返 回 一 个 View 70. @Override 71. public View makeview() { 72. TextView textview = new TextView(this);

73. textview.settextsize(36); 74. return textview; 75. } 76. } 77. 78. 79. 80. 2 Gallery 的 Demo 81. gallery.xml 82. 83. 代 码 84. <?xml version="1.0" encoding="utf-8"?> 85. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 86. android:orientation="vertical" android:layout_width="fill_parent" 87. android:layout_height="fill_parent"> 88. 89. <!-- 90. Gallery - 缩 略 图 浏 览 器 控 件 91. spacing - 缩 略 图 列 表 中 各 个 缩 略 图 之 间 的 间 距 92. --> 93. <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" 94. android:layout_height="wrap_content" android:spacing="20px" /> 95. 96. </LinearLayout> 97. 98. 99. _Gallery.java 100. 101. 代 码 102. package com.webabcd.view; 103. 104. import android.app.activity; 105. import android.content.context; 106. import android.os.bundle; 107. import android.view.view; 108. import android.view.viewgroup; 109. import android.widget.adapterview; 110. import android.widget.baseadapter; 111. import android.widget.gallery; 112. import android.widget.imageview; 113. import android.widget.toast; 114. import android.widget.gallery.layoutparams; 115. 116. public class _Gallery extends Activity {

117. 118. @Override 119. protected void oncreate(bundle savedinstancestate) { 120. // TODO Auto-generated method stub 121. super.oncreate(savedinstancestate); 122. this.setcontentview(r.layout.gallery); 123. 124. settitle("gallery"); 125. 126. Gallery gallery = (Gallery) findviewbyid(r.id.gallery); 127. // 为 缩 略 图 浏 览 器 指 定 一 个 适 配 器 128. gallery.setadapter(new ImageAdapter(this)); 129. // 响 应 在 缩 略 图 列 表 上 选 中 某 个 缩 略 图 后 的 事 件 130. gallery.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() { 131. @Override 132. public void onitemselected(adapterview<?> parent, View v, 133. int position, long id) { 134. Toast.makeText(_Gallery.this, String.valueOf(position), Toast.LENGTH_SHORT).show (); 135. } 136. 137. @Override 138. public void onnothingselected(adapterview<?> arg0) { 139. 140. } 141. }); 142. } 143. 144. // 继 承 BaseAdapter 用 以 实 现 自 定 义 的 图 片 适 配 器 145. public class ImageAdapter extends BaseAdapter { 146. 147. private Context mcontext; 148. 149. public ImageAdapter(Context context) { 150. mcontext = context; 151. } 152. 153. public int getcount() { 154. return mthumbids.length; 155. } 156. 157. public Object getitem(int position) { 158. return position; 159. }

160. 161. public long getitemid(int position) { 162. return position; 163. } 164. 165. public View getview(int position, View convertview, ViewGroup parent) { 166. ImageView image = new ImageView(mContext); 167. 168. image.setimageresource(mthumbids[position]); 169. image.setadjustviewbounds(true); 170. image.setlayoutparams(new Gallery.LayoutParams( 171. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 172. 173. return image; 174. } 175. } 176. 177. // 需 要 显 示 的 图 片 集 合 178. private Integer[] mthumbids = { R.drawable.icon01, R.drawable.icon02, 179. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; 180. } 181. 182. 183. 184. 3 ImageSwitcher 的 Demo 185. imageswitcher.xml 186. 187. 代 码 188. <?xml version="1.0" encoding="utf-8"?> 189. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 190. android:orientation="vertical" android:layout_width="fill_parent" 191. android:layout_height="fill_parent"> 192. 193. <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" 194. android:layout_height="wrap_content" android:spacing="20px" /> 195. 196. <!-- 197. ImageSwitcher - 图 片 转 换 器 控 件 ( 改 变 图 片 时 增 加 一 些 动 画 效 果 ) 198. --> 199. <ImageSwitcher android:id="@+id/imageswitcher" 200. android:layout_width="fill_parent" android:layout_height="wrap_content" /> 201. 202. </LinearLayout> 203.

204. 205. _ImageSwitcher.java 206. 207. 代 码 208. package com.webabcd.view; 209. 210. import android.app.activity; 211. import android.content.context; 212. import android.os.bundle; 213. import android.view.view; 214. import android.view.viewgroup; 215. import android.view.animation.animationutils; 216. import android.widget.adapterview; 217. import android.widget.baseadapter; 218. import android.widget.gallery; 219. import android.widget.imageswitcher; 220. import android.widget.imageview; 221. import android.widget.viewswitcher; 222. import android.widget.gallery.layoutparams; 223. 224. // 图 片 转 换 器 的 使 用 基 本 同 文 字 转 换 器 225. // 以 下 是 一 个 用 ImageSwitcher + Gallery 实 现 的 经 典 的 图 片 浏 览 器 的 Demo 226. public class _ImageSwitcher extends Activity implements 227. ViewSwitcher.ViewFactory { 228. 229. private ImageSwitcher mswitcher; 230. 231. @Override 232. protected void oncreate(bundle savedinstancestate) { 233. // TODO Auto-generated method stub 234. super.oncreate(savedinstancestate); 235. this.setcontentview(r.layout.imageswithcer); 236. 237. settitle("imageswithcer"); 238. 239. mswitcher = (ImageSwitcher) findviewbyid(r.id.imageswitcher); 240. mswitcher.setfactory(this); 241. mswitcher.setinanimation(animationutils.loadanimation(this, 242. android.r.anim.fade_in)); 243. mswitcher.setoutanimation(animationutils.loadanimation(this, 244. android.r.anim.fade_out)); 245. 246. Gallery gallery = (Gallery) findviewbyid(r.id.gallery); 247. gallery.setadapter(new ImageAdapter(this));

248. gallery.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() { 249. @Override 250. public void onitemselected(adapterview<?> parent, View v, 251. int position, long id) { 252. mswitcher.setimageresource(mimageids[position]); 253. } 254. 255. @Override 256. public void onnothingselected(adapterview<?> arg0) { 257. 258. } 259. }); 260. } 261. 262. public class ImageAdapter extends BaseAdapter { 263. 264. private Context mcontext; 265. 266. public ImageAdapter(Context context) { 267. mcontext = context; 268. } 269. 270. public int getcount() { 271. return mthumbids.length; 272. } 273. 274. public Object getitem(int position) { 275. return position; 276. } 277. 278. public long getitemid(int position) { 279. return position; 280. } 281. 282. public View getview(int position, View convertview, ViewGroup parent) { 283. ImageView image = new ImageView(mContext); 284. 285. image.setimageresource(mthumbids[position]); 286. image.setadjustviewbounds(true); 287. image.setlayoutparams(new Gallery.LayoutParams( 288. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 289. 290. return image; 291. }

292. } 293. 294. private Integer[] mthumbids = { R.drawable.icon01, R.drawable.icon02, 295. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; 296. 297. private Integer[] mimageids = { R.drawable.icon01, R.drawable.icon02, 298. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; 299. 300. @Override 301. public View makeview() { 302. ImageView image = new ImageView(this); 303. image.setminimumheight(200); 304. image.setminimumwidth(200); 305. image.setscaletype(imageview.scaletype.fit_center); 306. image.setlayoutparams(new ImageSwitcher.LayoutParams( 307. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 308. return image; 309. } 310. } 311. 312. 313. 314. 4 GridView 的 Demo 315. gridview.xml 316. 317. 代 码 318. <?xml version="1.0" encoding="utf-8"?> 319. 320. <!-- 321. GridView - 网 格 控 件 322. numcolumns="auto_fit" - 列 数 自 适 应 323. stretchmode - 缩 放 模 式 (stretchmode="columnwidth" - 缩 放 与 列 宽 大 小 同 步 ) 324. --> 325. <GridView xmlns:android="http://schemas.android.com/apk/res/android" 326. android:id="@+id/gridview" android:layout_width="fill_parent" 327. android:layout_height="fill_parent" android:padding="10px" 328. android:verticalspacing="10px" android:horizontalspacing="10px" 329. android:numcolumns="auto_fit" android:columnwidth="60px" 330. android:stretchmode="columnwidth" android:gravity="center"> 331. </GridView> 332. 333. 334. _GridView.java 335.

336. 代 码 337. package com.webabcd.view; 338. 339. import android.app.activity; 340. import android.content.context; 341. import android.os.bundle; 342. import android.view.view; 343. import android.view.viewgroup; 344. import android.widget.baseadapter; 345. import android.widget.gridview; 346. import android.widget.imageview; 347. 348. public class _GridView extends Activity { 349. 350. @Override 351. protected void oncreate(bundle savedinstancestate) { 352. // TODO Auto-generated method stub 353. super.oncreate(savedinstancestate); 354. this.setcontentview(r.layout.gridview); 355. 356. settitle("gridview"); 357. 358. GridView gridview = (GridView) findviewbyid(r.id.gridview); 359. // 指 定 网 格 控 件 的 适 配 器 为 自 定 义 的 图 片 适 配 器 360. gridview.setadapter(new ImageAdapter(this)); 361. } 362. 363. // 自 定 义 的 图 片 适 配 器 364. public class ImageAdapter extends BaseAdapter { 365. 366. private Context mcontext; 367. 368. public ImageAdapter(Context context) { 369. mcontext = context; 370. } 371. 372. public int getcount() { 373. return mthumbids.length; 374. } 375. 376. public Object getitem(int position) { 377. return position; 378. } 379.

380. public long getitemid(int position) { 381. return position; 382. } 383. 384. public View getview(int position, View convertview, ViewGroup parent) { 385. ImageView imageview; 386. if (convertview == null) { 387. imageview = new ImageView(mContext); 388. imageview.setlayoutparams(new GridView.LayoutParams(48, 48)); 389. imageview.setadjustviewbounds(false); 390. imageview.setscaletype(imageview.scaletype.center_crop); 391. imageview.setpadding(5, 5, 5, 5); 392. } else { 393. imageview = (ImageView) convertview; 394. } 395. 396. imageview.setimageresource(mthumbids[position]); 397. 398. return imageview; 399. } 400. 401. // 网 格 控 件 所 需 图 片 数 据 的 数 据 源 402. private Integer[] mthumbids = { R.drawable.icon01, R.drawable.icon02, 403. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 }; 404. } 405. } 406. 407. 408. 409. 5 ListView 的 Demo 410. main_list_adapter.xml 411. 412. 代 码 413. <?xml version="1.0" encoding="utf-8"?> 414. <!-- 415. 自 定 义 列 表 适 配 器 的 layout 416. --> 417. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 418. android:orientation="horizontal" android:layout_width="fill_parent" 419. android:layout_height="fill_parent"> 420. 421. <TextView android:id="@+id/text" android:layout_width="wrap_content" 422. android:layout_height="wrap_content" android:textsize="16sp"> 423. </TextView>

424. 425. </LinearLayout> 426. 427. 428. MainListAdapter.java 429. 430. 代 码 431. package com.webabcd.view; 432. 433. import java.util.list; 434. 435. import android.content.context; 436. import android.view.layoutinflater; 437. import android.view.view; 438. import android.view.viewgroup; 439. import android.widget.baseadapter; 440. import android.widget.textview; 441. 442. // 继 承 BaseAdapter 以 实 现 自 定 义 的 列 表 适 配 器 443. public class MainListAdapter extends BaseAdapter { 444. 445. private LayoutInflater minflater; 446. private List<String> mdata; 447. 448. public MainListAdapter(Context context, List<String> data) { 449. minflater = LayoutInflater.from(context); 450. mdata = data; 451. } 452. 453. @Override 454. public int getcount() { 455. return mdata.size(); 456. } 457. 458. @Override 459. public Object getitem(int position) { 460. return mdata.get(position); 461. } 462. 463. @Override 464. public long getitemid(int position) { 465. return position; 466. } 467.

468. @Override 469. public View getview(int position, View convertview, ViewGroup parent) { 470. 471. TextView text; 472. 473. if (convertview == null) { 474. // 指 定 一 个 layout 作 为 自 定 义 列 表 适 配 器 的 layout 475. convertview = minflater.inflate(r.layout.main_list_adapter, null); 476. text = (TextView) convertview.findviewbyid(r.id.text); 477. convertview.settag(text); 478. } else { 479. text = (TextView) convertview.gettag(); 480. } 481. 482. String mitem = mdata.get(position); 483. text.settext(mitem); 484. 485. return convertview; 486. } 487. } 488. 489. Main.java 490. 491. 代 码 492. package com.webabcd.view; 493. 494. import java.util.arraylist; 495. import java.util.list; 496. 497. import android.app.listactivity; 498. import android.content.intent; 499. import android.os.bundle; 500. import android.view.view; 501. import android.widget.listview; 502. 503. // 此 处 要 继 承 ListActivity, 用 以 实 现 ListView 的 功 能 504. public class Main extends ListActivity { 505. 506. private List<String> mdata; 507. 508. /** Called when the activity is first created. */ 509. @Override 510. public void oncreate(bundle savedinstancestate) { 511. super.oncreate(savedinstancestate);

512. 513. settheme(android.r.style.theme_light); 514. setcontentview(r.layout.main); 515. mdata = getdata(); 516. 517. // 使 用 自 定 义 的 列 表 适 配 器 来 展 现 数 据 518. MainListAdapter adapter = new MainListAdapter(this, mdata); 519. 520. // 如 需 使 用 系 统 内 置 的 列 表 适 配 器, 则 可 以 使 用 类 似 如 下 的 方 法 521. // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.r.layout.sim ple_expandable_list_item_1, mdata); 522. 523. this.setlistadapter(adapter); 524. } 525. 526. // ListView 的 数 据 源 527. private List<String> getdata() { 528. List<String> items = new ArrayList<String>(); 529. 530. items.add("textview"); 531. items.add("button"); 532. items.add("imagebutton"); 533. items.add("imageview"); 534. items.add("checkbox"); 535. items.add("radiobutton"); 536. items.add("analogclock"); 537. items.add("digitalclock"); 538. items.add("datepicker"); 539. items.add("timepicker"); 540. items.add("togglebutton"); 541. items.add("edittext"); 542. items.add("progressbar"); 543. items.add("seekbar"); 544. items.add("autocompletetextview"); 545. items.add("multiautocompletetextview"); 546. items.add("zoomcontrols"); 547. items.add("include"); 548. items.add("videoview"); 549. items.add("webview"); 550. items.add("ratingbar"); 551. items.add("tab"); 552. items.add("spinner"); 553. items.add("chronometer"); 554. items.add("scrollview");

555. items.add("textswitcher"); 556. items.add("listview"); 557. items.add("gallery"); 558. items.add("imageswitcher"); 559. items.add("gridview"); 560. items.add("expandablelist"); 561. 562. return items; 563. } 564. 565. // ListView 中 某 项 被 选 中 后 的 逻 辑 566. @Override 567. protected void onlistitemclick(listview l, View v, int position, long id) { 568. Intent intent = new Intent(); 569. intent.setclassname(this, "com.webabcd.view._" + mdata.get(position)); 570. 571. startactivityforresult(intent, 0); 572. } 573. } 574. 575. 576. 6 ExpandableList 的 Demo 577. _ExpandableList.java 578. 579. 代 码 580. package com.webabcd.view; 581. 582. import android.app.expandablelistactivity; 583. import android.os.bundle; 584. import android.view.contextmenu; 585. import android.view.gravity; 586. import android.view.menuitem; 587. import android.view.view; 588. import android.view.viewgroup; 589. import android.view.contextmenu.contextmenuinfo; 590. import android.widget.abslistview; 591. import android.widget.baseexpandablelistadapter; 592. import android.widget.expandablelistadapter; 593. import android.widget.expandablelistview; 594. import android.widget.textview; 595. import android.widget.toast; 596. import android.widget.expandablelistview.expandablelistcontextmenuinfo; 597. 598. // ExpandableList - 可 展 开 / 收 缩 列 表

599. // 继 承 ExpandableListActivity 以 实 现 列 表 的 可 展 开 / 收 缩 的 功 能 600. public class _ExpandableList extends ExpandableListActivity { 601. 602. private ExpandableListAdapter madapter; 603. 604. @Override 605. protected void oncreate(bundle savedinstancestate) { 606. // TODO Auto-generated method stub 607. super.oncreate(savedinstancestate); 608. 609. settitle("expandablelist"); 610. 611. madapter = new MyExpandableListAdapter(); 612. setlistadapter(madapter); 613. registerforcontextmenu(this.getexpandablelistview()); 614. } 615. 616. // 为 列 表 的 每 一 项 创 建 上 下 文 菜 单 ( 即 长 按 后 呼 出 的 菜 单 ) 617. @Override 618. public void oncreatecontextmenu(contextmenu menu, View v, 619. ContextMenuInfo menuinfo) { 620. menu.setheadertitle("contextmenu"); 621. menu.add(0, 0, 0, "ContextMenu"); 622. } 623. 624. // 单 击 上 下 文 菜 单 后 的 逻 辑 625. @Override 626. public boolean oncontextitemselected(menuitem item) { 627. ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getmen uinfo(); 628. String title = ((TextView) info.targetview).gettext().tostring(); 629. 630. int type = ExpandableListView.getPackedPositionType(info.packedPosition); 631. if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 632. int grouppos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 633. int childpos = ExpandableListView.getPackedPositionChild(info.packedPosition); 634. 635. Toast.makeText(this, title + " - Group Index: " + grouppos + " Child Index: " + childpos, Toast.LENGTH_SHORT).show(); 636. 637. return true; 638. } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { 639. int grouppos = ExpandableListView.getPackedPositionGroup(info.packedPosition);

640. Toast.makeText(this, title + " - Group Index: " + grouppos, Toast.LENGTH_SHORT).sho w(); 641. 642. return true; 643. } 644. 645. return false; 646. } 647. 648. public class MyExpandableListAdapter extends BaseExpandableListAdapter { 649. 650. // 父 列 表 数 据 651. private String[] groups = 652. { 653. "group1", 654. "group2", 655. "group3", 656. "group4" 657. }; 658. // 子 列 表 数 据 659. private String[][] children = 660. { 661. { "child1" }, 662. { "child1", "child2" }, 663. { "child1", "child2", "child3" }, 664. { "child1", "child2", "child3", "child4" } 665. }; 666. 667. @Override 668. public Object getchild(int groupposition, int childposition) { 669. return children[groupposition][childposition]; 670. } 671. 672. @Override 673. public long getchildid(int groupposition, int childposition) { 674. return childposition; 675. } 676. 677. @Override 678. public int getchildrencount(int groupposition) { 679. return children[groupposition].length; 680. } 681. 682. // 取 子 列 表 中 的 某 一 项 的 View

683. @Override 684. public View getchildview(int groupposition, int childposition, 685. boolean islastchild, View convertview, ViewGroup parent) { 686. TextView textview = getgenericview(); 687. textview.settext(getchild(groupposition, childposition).tostring()); 688. return textview; 689. } 690. 691. @Override 692. public Object getgroup(int groupposition) { 693. return groups[groupposition]; 694. } 695. 696. @Override 697. public int getgroupcount() { 698. return groups.length; 699. } 700. 701. @Override 702. public long getgroupid(int groupposition) { 703. return groupposition; 704. } 705. 706. // 取 父 列 表 中 的 某 一 项 的 View 707. @Override 708. public View getgroupview(int groupposition, boolean isexpanded, 709. View convertview, ViewGroup parent) { 710. TextView textview = getgenericview(); 711. textview.settext(getgroup(groupposition).tostring()); 712. return textview; 713. } 714. 715. @Override 716. public boolean hasstableids() { 717. return true; 718. } 719. 720. @Override 721. public boolean ischildselectable(int groupposition, int childposition) { 722. return true; 723. } 724. 725. // 获 取 某 一 项 的 View 的 逻 辑 726. private TextView getgenericview() {

727. AbsListView.LayoutParams lp = new AbsListView.LayoutParams( 728. ViewGroup.LayoutParams.FILL_PARENT, 48); 729. TextView textview = new TextView(_ExpandableList.this); 730. textview.setlayoutparams(lp); 731. textview.setgravity(gravity.center_vertical Gravity.LEFT); 732. textview.setpadding(32, 0, 0, 0); 733. return textview; 734. } 735. } 736. } Android SurfaceView 小 解 文 章 分 类 : 移 动 开 发 注 : 来 自 东 方 尚 智 沈 大 海 博 客 在 android 中 开 发 游 戏, 一 般 来 说, 或 想 写 一 个 复 杂 一 点 的 游 戏, 是 必 须 用 到 SurfaceView 来 开 发 的 经 过 这 一 阵 子 对 android 的 学 习, 我 找 到 了 自 已 在 android 中 游 戏 开 发 的 误 区, 不 要 老 想 着 用 Layout 和 view 去 实 现, 不 要 将 某 个 游 戏 中 的 对 象 做 成 一 个 组 件 来 处 理 应 该 尽 量 想 着 在 Canvas( 画 布 ) 中 画 出 游 戏 戏 中 的 背 景 人 物 动 画 等...SurfaceView 提 供 直 接 访 问 一 个 可 画 图 的 界 面, 可 以 控 制 在 界 面 顶 部 的 子 视 图 层 SurfaceView 是 提 供 给 需 要 直 接 画 像 素 而 不 是 使 用 窗 体 部 件 的 应 用 使 用 的 Android 图 形 系 统 中 一 个 重 要 的 概 念 和 线 索 是 surface View 及 其 子 类 ( 如 TextView, Button) 要 画 在 surface 上 每 个 surface 创 建 一 个 Canvas 对 象 ( 但 属 性 时 常 改 变 ), 用 来 管 理 view 在 surface 上 的 绘 图 操 作, 如 画 点 画 线 还 要 注 意 的 是, 使 用 它 的 时 候, 一 般 都 是 出 现 在 最 顶 层 的 :The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. 使 用 的 SurfaceView 的 时 候, 一 般 情 况 下 还 要 对 其 进 行 创 建, 销 毁, 改 变 时 的 情 况 进 行 监 视, 这 就 要 用 到 SurfaceHolder.Callback. 在 用 SurfaceView 进 行 游 戏 开 发 过 程 中, 用 到 SurfaceHolder 来 处 理 它 的 Canvas 上 画 的 效 果 和 动 画 是 必 不 可 少 的 用 于 控 制 表 面, 大 小, 像 素 等 Abstract interface to someone holding a display surface. Allows you to control the surface size and format, edit the pixels in the surface, and monitor changes to the surface. This interface is typically available through the SurfaceView class. 其 中 特 别 要 注 意 以 下 的 几 个 函 数 : abstract void addcallback(surfaceholder.callback callback); // 给 SurfaceView 当 前 的 持 有 者 一 个 回 调 对 象 abstract Canvas lockcanvas(); // 锁 定 画 布, 一 般 在 锁 定 后 就 可 以 通 过 其 返 回 的 画 布 对 象 Canvas, 在 其 上 面 画 图 等 操 作 了 abstract Canvas lockcanvas(rect dirty); // 锁 定 画 布 的 某 个 区 域 进 行 画 图 等.. 因 为 画 完 图 后, 会 调 用 下 面 的 unlockcanvasandpost 来

改 变 显 示 内 容 // 相 对 部 分 内 存 要 求 比 较 高 的 游 戏 来 说, 可 以 不 用 重 画 dirty 外 的 其 它 区 域 的 像 素, 可 以 提 高 速 度 abstract void unlockcanvasandpost(canvas canvas); // 结 束 锁 定 画 图, 并 提 交 改 变 实 例 : 用 线 程 画 一 个 蓝 色 的 长 方 形 Java 代 码 1. import android.app.activity; 2. import android.content.context; 3. import android.graphics.canvas; 4. import android.graphics.color; 5. import android.graphics.paint; 6. import android.graphics.rectf; 7. import android.os.bundle; 8. import android.view.surfaceholder; 9. import android.view.surfaceview; 10. 11. public class Test extends Activity { 12. 13. public void oncreate(bundle savedinstancestate) { 14. super.oncreate(savedinstancestate); 15. setcontentview(new MyView(this)); 16. } 17. 18. // 内 部 类 19. class MyView extends SurfaceView implements SurfaceHolder.Callback{ 20. 21. SurfaceHolder holder; 22. public MyView(Context context) { 23. super(context); 24. holder = this.getholder();// 获 取 holder 25. holder.addcallback(this); 26. //setfocusable(true); 27. } 28. 29. @Override 30. public void surfacechanged(surfaceholder holder, int format, int width, 31. int height) { 32. 33. } 34. 35. @Override

36. public void surfacecreated(surfaceholder holder) { 37. new Thread(new MyThread()).start(); 38. } 39. 40. @Override 41. public void surfacedestroyed(surfaceholder holder) {} 42. 43. // 内 部 类 的 内 部 类 44. class MyThread implements Runnable{ 45. 46. @Override 47. public void run() { 48. Canvas canvas = holder.lockcanvas(null);// 获 取 画 布 49. Paint mpaint = new Paint(); 50. mpaint.setcolor(color.blue); 51. 52. canvas.drawrect(new RectF(40,60,80,80), mpaint); 53. holder.unlockcanvasandpost(canvas);// 解 锁 画 布, 提 交 画 好 的 图 像 54. } 55. 56. } 57. 58. } 59. } 访 问 SurfaceView 的 底 层 图 形 是 通 过 SurfaceHolder 接 口 来 实 现 的, 通 过 getholder() 方 法 可 以 得 到 这 个 SurfaceHolder 对 象 你 应 该 实 现 surfacecreated(surfaceholder) 和 surfacedestroyed(surfaceholder) 方 法 来 知 道 在 这 个 Surface 在 窗 口 的 显 示 和 隐 藏 过 程 中 是 什 么 时 候 创 建 和 销 毁 的 SurfaceView 可 以 在 多 线 程 中 被 访 问 注 意 : 一 个 SurfaceView 只 在 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 调 用 之 间 是 可 用 的, 其 他 时 间 是 得 不 到 它 的 Canvas 对 象 的 (null) 我 的 访 问 过 程 : 创 建 一 个 SurfaceView 的 子 类, 实 现 SurfaceHolder.Callback 接 口 得 到 这 个 SurfaceView 的 SurfaceHolder 对 象 holder holder.addcallback(callback), 也 就 是 实 现 SurfaceHolder.Callback 接 口 的 类 对 象 在 SurfaceHolder.Callback.surfaceCreated() 调 用 过 后 holder.lockcanvas() 对 象 就 可 以 得 到 SurfaceView 对 象 对 应 的 Canvas 对 象 canvas 了 用 canvas 对 象 画 图 画 图 结 束 后 调 用 holder.unlockcanvasandpost() 就 把 图 画 在 窗 口 中 了 SurfaceView 可 以 多 线 程 访 问, 在 多 线 程 中 画 图 Java 代 码

1. import android.content.context; 2. import android.graphics.canvas; 3. import android.graphics.color; 4. import android.graphics.paint; 5. import android.util.log; 6. import android.view.surfaceholder; 7. import android.view.surfaceview; 8. 9. public class MySurfaceView extends SurfaceView implements 10. SurfaceHolder.Callback { 11. 12. 13. private Context mcontext; 14. private SurfaceHolder mholder; 15. 16. public TouchScreenAdjusterSurfaceView(Context context,) { 17. super(context); 18. 19. mcontext = context; 20. 21. mholder = TouchScreenAdjusterSurfaceView.this.getHolder(); 22. mholder.addcallback(touchscreenadjustersurfaceview.this); 23. 24. this.setfocusableintouchmode(true); // to make sure that we can get 25. // touch events and key events,and 26. // "setfocusable()" to make sure we 27. // can get key events 28. } 29. 30. @Override 31. public void surfacechanged(surfaceholder holder, int format, int width, 32. int height) { 33. // TODO Auto-generated method stub 34. 35. } 36. 37. @Override 38. public void surfacecreated(surfaceholder holder) { 39. //now you can get the Canvas and draw something here 40. } 41. 42. @Override 43. public void surfacedestroyed(surfaceholder holder) { 44. // TODO Auto-generated method stub

45. 46. } 47. 48. 49. public void drawmyshape(pointpostion ps) { 50. 51. mcanvas = mholder.lockcanvas(); 52. 53. // draw anything you like 54. 55. mholder.unlockcanvasandpost(mcanvas); 56. } 57. 58. } android 琐 碎 笔 记 六 文 章 分 类 : 移 动 开 发 1. 得 到 屏 幕 的 screen dimensions Display display = getwindowmanager().getdefaultdisplay(); int width = display.getwidth();int height = display.getheight(); 2. 播 放 gif 图 片 在 android @Override protected void ondraw(canvas canvas) { canvas.drawcolor(0xffcccccc); Paint p = new Paint(); p.setantialias(true); canvas.drawbitmap(mbitmap4, 210, 170, null); mdrawable.draw(canvas); long now = android.os.systemclock.uptimemillis(); if (mmoviestart == 0) { // first time mmoviestart = now; } if (mmovie!= null) { int dur = mmovie.duration(); if (dur == 0) { dur = 1000; } int reltime = (int)((now - mmoviestart) % dur); mmovie.settime(reltime); mmovie.draw(canvas, getwidth() - mmovie.width(), getheight() - mmovie.height()); invalidate(); } }

@Override protected void ondraw(canvas canvas) { if(movie!= null) { long now = android.os.systemclock.uptimemillis(); int dur = Math.max(movie.duration(), 1); // is it really animated? int pos = (int)(now % dur); movie.settime(pos); movie.draw(canvas, x, y); invalidate(); }} 4. 打 开 sd 卡 中 的 sqllite File dbfile = new File("/sdcard/mydb.sqlite" ); SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 5. 得 到 手 机 的 IMEI ((TelephonyManager) getsystemservice=(context.telephony_service)).getdeviceid(); 6. 不 让 程 序 生 成 一 个 appliation 去 掉 <category android:name="android.intent.category.launcher" /> 当 然 你 的 让 你 的 程 序 被 引 导 启 动 7. 使 用 appliation 的 id 可 以 获 得 不 同 appliation 的 数 据 : android:shareduserid="string" 在 主 xml 中 添 加 上 面 一 句 话, 然 后 签 名 也 要 一 样 两 个 app 的 id 也 要 设 置 成 一 样 如 都 是 string 那 么 这 两 个 程 序 就 可 以 相 互 访 问 彼 此 的 数 据, 也 可 以 在 同 一 个 process 中 了 8. 判 断 相 机 设 备 存 在 不 private android.hardware.camera mcameradevice; try { mcameradevice = android.hardware.camera.open();} catch (RuntimeException e) { Log.e(TAG, "fail to connect Camera", e); 9 使 listview 透 明 android:background="#00000000" android:cachecolorhint="#00000000" 或 者 android:background="@android:color/transparent" The background android screen image should be visible. 屏 幕 的 背 景 图 像 可 以 看 见 manifest file 添 加 attribute 到 activity. android:theme="@android:style/theme.dialog"

Android 通 过 selector 改 变 界 面 状 态 文 章 分 类 : 移 动 开 发 先 上 图, 看 看 效 果 : 初 始 效 果 按 下 后 效 果 在 res/drawable 文 件 夹 新 增 一 个 文 件, 此 文 件 设 置 了 图 片 的 触 发 状 态, 你 可 以 设 置 state_pressed,state_checked,state_pressed,state_selected, state_focused,state_enabled 等 几 个 状 态 : Java 代 码 1. <selector xmlns:android="http://schemas.android.com/apk/res/android"> 2. 3. <item android:state_pressed="true" android:drawable="@drawable/arrow_pressed" / > 4. <item android:drawable="@drawable/arrow_normal" /> 5. <item android:state_checked="true" android:drawable="@drawable/arrow_pressed" / > 6. </selector> 实 现 如 下, 注 意 其 中 的 android:src="@drawable/imageselector" Xml 代 码 1. <ImageView android:layout_width="wrap_content" 2. android:layout_height="@android:dimen/app_icon_size" 3. android:layout_alignparentright="true" android:scaletype="fitcenter" 4. android:layout_gravity="center" android:src="@drawable/imageselector" 5. android:clickable="true" android:focusable="true" android:id="@+id/blacklistimagevi ew" 6. android:layout_marginright="10dip" />

如 果 当 触 发 的 控 件 不 是 ImageView, 而 是 别 的 控 件, 可 在 代 码 中 用 Java 代 码 1. blacklistimageview.setpressed(true); Java 代 码 1. blacklistimageview.setchecked(true); Android 经 典 小 技 巧 总 结 一 这 是 一 篇 关 于 如 何 将 自 定 义 的 homescreen 设 定 为 Android 的 默 认 主 页, 而 不 需 要 用 户 选 择 的 讨 论 贴, 原 文 如 下 : Another additional info: If you want that your homescreen is always the default and that the system doesn't ask to choose between different home screens simply put it that way: XML: <intent-filter priority="1"> <action name="android.intent.action.main"></action> <category name="android.intent.category.home"></category> <category name="android.intent.category.default"></category> <category name="android.intent.category.monkey"></category> </intent-filter> The difference to the XML above is android:priority="1". It seems that the default home screen has priority 0 and therefore setting the priority

of your home screen to 1 is sufficient to force the usage of your home screen android shape 渐 近 线 效 果 文 章 分 类 : 综 合 技 术 http://wang-peng1.javaeye.com/blog/523869 android 画 图 -----shape 的 使 用 在 GradientDrawable1 试 图 中 终 于 把 shape 学 会 了, 以 前 总 是 似 懂 非 懂, 现 在 终 于 把 里 面 的 东 西 搞 清 楚 了, 同 时 也 挺 佩 服 谷 歌 的 用 心, 故 意 设 置 一 些 陷 阱 吧, 不 认 真 对 待 还 真 以 为 没 有 啥 效 果 呢 setcontentview(r.layout.shape_drawable_1) shape_drawable_1 代 码 如 下 : <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/shape_1" /> <ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/line" /> <ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/shape_2" /> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/line" />

<ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/shape_3" /> <ImageView android:layout_width="fill_parent" android:layout_height="20dip" android:src="@drawable/line" /> <ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/shape_4" /> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/line" /> <ImageView android:layout_width="fill_parent" android:layout_height="50dip" android:src="@drawable/shape_5" /> </LinearLayout> </ScrollView> shape_5 的 代 码 : <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startcolor="#ffff0000" android:endcolor="#80ff00ff" android:angle="270"/> <padding android:left="50dp" android:top="20dp" android:right="7dp" android:bottom="7dp" /> <corners android:radius="8dp" /> </shape> gradient 产 生 颜 色 渐 变 android:angle 从 哪 个 角 度 开 始 变 貌 似 只 有 90 的 整 数 倍 可 以 android:shape="rectangle" 默 认 的 也 是 长 方 形 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#ff4100ff"/>

<stroke android:width="2dp" android:color="#ee31ff5e" android:dashwidth="3dp" android:dashgap="2dp" /> <padding android:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp" /> <corners android:radius="6dp" /> </shape> #ff4100ff 蓝 色 #ff4100ff 绿 色 <solid android:color="#ff4100ff"/> 实 心 的 填 充 里 面 <stroke 描 边 采 用 那 样 的 方 式 将 外 形 轮 廓 线 画 出 来 android:dashwidth="3dp" android:dashgap="2dp" 默 认 值 为 0 android:width="2dp" android:color="#ff00ff00" 笔 的 粗 细, android:dashwidth="5dp" android:dashgap="5dp" 实 现 - - - 这 样 的 效 果,dashWidth 指 的 是 一 条 小 横 线 的 宽 度 dashgap 指 的 是 小 横 线 与 小 横 线 的 间 距 width="2dp" 不 能 太 宽 分 析 android 动 画 模 块 关 键 字 : android 动 画 主 要 思 路 Tween 动 画 通 过 对 View 的 内 容 完 成 一 系 列 的 图 形 变 换 ( 包 括 平 移 缩 放 旋 转 改 变 透 明 度 ) 来 实 现 动 画 效 果 具 体 来 讲, 预 先 定 义 一 组 指 令, 这 些 指 令 指 定 了 图 形 变 换 的 类 型 触 发 时 间 持 续 时 间 这 些 指 令 可 以 是 以 XML 文 件 方 式 定 义, 也 可 以 是 以 源 代 码 方 式 定 义 程 序 沿 着 时 间 线 执 行 这 些 指 令 就 可 以 实 现 动 画 效 果 动 画 的 进 度 使 用 Interpolator 控 制,android 提 供 了 几 个 Interpolator 子 类, 实 现 了 不 同 的 速 度 曲 线, 如 LinearInterpolator 实 现 了 匀 速 效 果 Accelerateinterpolator 实 现 了 加 速 效 果 DecelerateInterpolator 实 现 了 减 速 效 果 等 还 可 以 定 义 自 己 的 Interpolator 子 类, 实 现 抛 物 线 自 由 落 体 等 物 理 效 果 动 画 的 运 行 模 式 有 两 种 : 独 占 模 式, 即 程 序 主 线 程 进 入 一 个 循 环, 根 据 动 画 指 令 不 断 刷 新 屏 幕, 直 到 动 画 结 束 ; 中 断 模 式, 即 有 单 独 一 个 线 程 对 时 间 计 数, 每 隔 一 定 的 时 间 向 主 线 程 发 通 知, 主 线 程 接 到 通 知 后 更 新 屏 幕 ; 图 形 变 换 通 过 仿 射 矩 阵 实 现 图 形 变 换 是 图 形 学 中 的 基 本 知 识 简 单 来 说 就 是, 每 种 变 换 都 是 一 次 矩 阵 运 算 在 Android 中,Canvas 类 中 包 含 当 前 矩 阵, 当 调 用 Canvas.drawBitmap

(bmp, x, y, Paint) 绘 制 时,android 会 先 把 bmp 做 一 次 矩 阵 运 算, 然 后 将 运 算 的 结 果 显 示 在 Canvas 上 这 样, 编 程 人 员 只 需 不 断 修 改 Canvas 的 矩 阵 并 刷 新 屏 幕,View 里 的 对 象 就 会 不 停 的 做 图 形 变 换, 动 画 就 形 成 了 在 android 中 提 供 了 Animation Interpolator Transformation 等 类 具 体 实 现 Tween 动 画, 下 面 逐 一 分 析 Animation 类 及 其 子 类 Animation 类 及 其 子 类 是 动 画 的 核 心 模 块, 它 实 现 了 各 种 动 画 效 果, 如 平 移 缩 放 旋 转 改 变 透 明 度 等 Tween 动 画 的 每 一 桢 都 根 据 Interpolator 对 view 的 内 容 做 一 次 图 形 变 换, 因 此 Animation 的 核 心 工 作 是 做 变 换 (transformation) Aniamtion 是 基 类, 他 记 录 了 动 画 的 通 用 属 性 和 方 法 主 要 的 属 性 包 括 动 画 持 续 时 间 重 复 次 数 interpolator 等 动 画 里 最 重 要 的 方 法 是 gettransformation (currenttime, outtransformation), 该 方 法 根 据 当 前 间 (currenttime) 和 interpolator, 计 算 当 前 的 变 换, 在 outtransformation 中 返 回 TranslateAnimation RotateAnimation AlphaAnimation 等 是 Animation 的 子 类, 分 别 实 现 了 平 移 旋 转 改 变 Alpha 值 等 动 画 每 个 动 画 都 重 载 了 父 类 的 applytransformation 方 法, 这 个 方 法 会 被 父 类 的 gettransformation 方 法 调 用 另 外 每 个 动 画 还 有 个 initialize 方 法, 完 成 初 始 化 工 作 不 同 的 动 画 具 有 不 同 的 属 性, 如 RotateAnimation 的 属 性 是 起 始 角 度 终 止 角 度 和 旋 转 点 坐 标, TranslateAnimation 的 属 性 是 起 始 位 置 和 终 止 位 置 AlphaAnimation 的 属 性 是 起 始 alpha 值 和 终 止 alpha 值 Animation 类 及 其 子 类 的 类 图 如 下 所 示 :

Interpolator 类 及 其 子 类 Interpolator 定 义 了 动 画 的 变 化 速 度, 可 以 实 现 匀 速 正 加 速 负 加 速 无 规 则 变 加 速 等 ; Interpolator 是 基 类, 封 装 了 所 有 Interpolator 的 共 同 方 法, 它 只 有 一 个 方 法, 即 getinterpolation (float input), 该 方 法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation. LinearInerpolator AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator,CycleInterpolator 是 Interpolator 的 子 类, 分 别 实 现 了 匀 速 加 速 减 速 变 速 循 环 等 效 果 对 于 LinearInterpolator, 变 化 率 是 个 常 数, 即 f (x) = x. Java 代 码 1. public float getinterpolation(float input) { 2. return input; 3. }

对 于 AccelerateInterpolator, 开 始 变 化 很 慢, 然 后 逐 渐 变 快, 即 f(x) = x*x 或 者 f(x) = pow(x, 2*mFactor). Java 代 码 1. public float getinterpolation(float input) { 2. if (mfactor == 1.0f) { 3. return (float)(input * input); 4. } else { 5. return (float)math.pow(input, 2 * mfactor); 6. } 7. } 对 于 AccelerateDecelerateInterpolator, 变 化 率 开 始 和 结 束 都 很 慢, 但 中 间 很 快, 即 f(x) = (cos ((x+1)*pi) / 2.0f) + 0.5f. Java 代 码 1. public float getinterpolation(float input) { 2. return (float)(math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; 3. } Interpolator 类 及 其 子 类 的 类 图 如 下 所 示 :

Transformation 类 Transformation 记 录 了 仿 射 矩 阵 Matrix, 动 画 每 触 发 一 次, 会 对 原 来 的 矩 阵 做 一 次 运 算, View 的 Bitmap 与 这 个 矩 阵 相 乘 就 可 实 现 相 应 的 操 作 ( 旋 转 平 移 缩 放 等 ) Transformation 类 封 装 了 矩 阵 和 alpha 值, 它 有 两 个 重 要 的 成 员, 一 是 mmatrix, 二 是 malpha Transformation 类 图 如 下 所 示 : 如 何 在 View 中 实 现 动 画 从 逻 辑 上 讲, 实 现 动 画 需 要 如 下 几 步 :