Android用记忆软件 Ankicard

这篇文章将介绍和说明我自己开发的软件Ankicard。

由于时间仓促在当前的版本中没有加入详细说明,因而暂时通过这里来说明一下程序相关的问题。内容将会逐步完善。

程序截图:

词库选择界面
词库选择界面
库浏览界面
库浏览界面

Q&A:

Q:Ankicard自制词库的格式是什么?

A:普通的文本文件以以下格式录入即可:

词库标题
第一张正面内容
第一张反面内容第一行|反面内容第二行
第二张正面内容
第二张反面内容|第二行|第三行

第一行输入词库标题,之后每两行一组表示单张卡片的正反面。以换行符分隔每一面。在同一行内以竖线“|”作为人工换行符。单面最多支持300个汉字。词库只需使用标准文本文件格式,通过Windows记事本等程序即可创建。需要注意在保存时应通过“另存为”设置成“Unicode”字符编码才能避免出现乱码。同时Unicode编码也将提供更好的全球语言支持。

索尼爱立信(Sony Ericsson)Xperia X10升级Android 2.1系统使用感想

这是一篇实效性较弱的文章,会逐渐添加罗列条目:

北京时间2010年11月1日,索尼爱立信终于首先在北欧发布了旗下目前旗舰Android智能手机Xperia X10的2.1系统版本升级套件,自己的全球版X10也于第二天获得了升级。对这次迟来的、颇受争议的升级,我认为是值得的,尽管目前的版本还不完美,但从不少细节处可以看出索尼爱立信的用心。虽然因为策略上的失误,过分深入定制,导致了这次升级的“难产”,但不得不说最终算是交出了一份较为令人满意的答卷。在预定之后几个月内将要发布的升级包中相信现有的一些问题也会得到改进。

当前系统版本号:2.0.A.0.504

变更点/改进点:

  • 通知栏变宽,更容易下拉
  • 通知栏的时间、电量等图标更大,容易看清
  • 支持动态背景
  • 桌面单屏可显示的图标数由16个提升至20个,可显示桌面预览
  • 移动桌面图标时会有高亮显示放置位置
  • 设定菜单重新编排
  • 增加初次使用的安装向导
  • 横屏竖屏的取消模糊切换效果,反应速度大幅变快
  • Mediascape、Timescape细节加强,界面美化,反应速度大幅提高
  • 蓝牙支持性提升
  • 增加了大量新的内置铃声
  • 新的更好用,反应更快的屏幕锁,在充电时会显示精确电量
  • 新的短信界面,功能更强,界面更美观
  • 新的和Twitter、Facebook整合的通讯录
  • 将联系人添加为收藏时增加提示语
  • 显示联系人的Gtalks在线状态
  • 联系人添加功能增强
  • 增加本机保存联系人功能
  • 通话界面的界面改进,易用性提高
  • 新的连接性桌面控件,增加了飞行模式开关和电量显示。还可以在飞行模式下开启WIFI
  • 支持多帐号登录的电子邮件客户端
  • 增加了安装向导
  • 功能更强的备份与恢复工具
  • 充电时LED灯的显示调整为充电时橙色,充满时绿色的经典索尼设计
  • 更强的待机性能,初步感觉上提升了20%以上
  • 可以关机充电
  • 追踪对焦的720p高清视频录制
  • 拍摄视频时可以记录GPS信息
  • 获取照片地理位置信息的速度加快
  • 照片EV设定的界面优化
  • 视频拍摄中支持LED补光灯,自拍时减弱LED灯亮度
  • 网页浏览器支持双击缩放,支持HTML5
  • 书签支持缩略图模式
  • 增加至5个桌面屏幕
  • 内置计算器的界面改进
  • 备份工具的功能改进
  • 系统提升至2.1,内置软件的升级、可用软件的增加

存在的问题/不足:

  • 浏览器取消了退出选项,感觉不适应
  • 蓝牙接收步骤增加一步,略显繁琐
  • Mediascape显示专辑曲目号错误
  • 虚拟专用网VPN图标没有经过优化,比较粗糙
  • 拨号时显示的人物头像模糊
  • 系统时常会反映缓慢,我不清楚是Android本身的问题还是X10的问题,不过猜想后者的可能性比较大。可能是在运行某些后台服务。在其他时候各种操作反应倒是很流畅

今后如果还有什么发现会再补充,如果有错误也请指出帮助我更正。

SONY 数码录音棒 ICD-PX820 简单测评

ICD-PX820
ICD-PX820

因为学习的需要要买一支录音笔,经过考虑后选择了索尼的ICD-PX820

从定位上来说,PX系列在索尼录音笔产品线中属于低端,只提供基本的录音及相关功能,不过这样也正好符合我的需求。

经过一段时间的使用,简单谈谈这支录音笔的使用感受。

首先是外观和做工方面。继承了索尼一贯高质量的工业设计,PX820的外观简洁大方,丝毫没有国内某些厂商录音笔的山寨感。最主要的两个按键,即录音和播放键使用了大尺寸设计,不易误操作。同时播放键和音量+键都有突起方便手指定位,相当人性化。至于做工,尽管外壳采用的是塑料,但精细的做工避免了玩具感。

接下来是录音方面。首先不得不提到是录音效果。PX820的麦克风灵敏度相当高,可以完整记录下周围的各种声音细节。在室内也可以录下窗台外的轻微的滴水声以及远处道路上车辆驶过的呼啸声。至于室内的各种声音细节更是可以清晰的录制。从某种意义上来说,把PX820比作是助听器也不为过。

另外PX820支持VOR功能,可以自动识别环境声音并开始录音,在环境无声时自动中断录音直到下次出现声音时新建录音。在某些情况下是很实用的功能。PX820支持环境降噪功能,开启后可以初步消除部分环境低音(比如室内空调的噪音)以增强语音清晰度。PX820的录音格式是MP3,这样就使共享和在其他设备上播放变得十分方便。

PX820机体内置了一个单声道麦克风,同时还随机附赠了一个外接式立体声麦克风。外接式麦克风附有一个衬衣夹,可以像手机的耳机线那样夹在衣服上。我认为后者会是更加经常使用的录音方式,不但可以得到更好的录音效果,还可以把录音笔本身放在口袋或是包中,方便携带。

放音方面。PX820内置了单声道扬声器,实际效果一般,没有特别的感觉。音量也没有一些山寨手机那么夸张。只能说中规中距。不过通常也是使用耳机收听回放的了,因此并没有什么影响。PX820也可以作为音频播放器,支持播放MP3格式的音频,不过实际试听了一下音质惨不忍睹,完全无法演绎出高音和低音,无法替代音乐播放器使用。不过虽说是惨不忍睹,那也是和专业的MP3相比的。用于回放录制的录音效果还是可以接受的。另外由于PX820支持A-B循环和0.5-2.0倍速播放,这些对于语言学习是一个必要的便利功能。

存储和功能方面。PX820搭载了2G的存储空间,实际可用空间约1.9G。根据录音品质的不同,录音可存储时间总长可以从22小时到500小时以上。不过我自己来说应该会始终使用最高音质录音。通过随机附送的软件Digital Voice Editor 3可以轻松传输管理和编辑录音文件,因此20多个小时的录音时间足够了。PX820本身提供了简单的覆盖重录、音频分割和删除等功能。同时提供了5个文件夹(每个文件夹最多可存放99段音频片段)供分别保存不同类别的录音内容。

PX820使用两节7号电池供电。标称使用时间为30小时以上。同时PX820也支持AC外接电源供电以满足长时间录音的需要。不过外接电源需要另购,可能真的会去买的人也就很少了。不过由于PX820使用了MiniUSB接口,因此也许手机充电器+MiniUSB线的组合就可以实现AC供电也说不定?不过因为自己用不到,也就没有做这方面的测试。

总结来说,PX820虽然功能比较单一,价格相比国产录音笔也要昂贵不少,但出色的性能和索尼的品质保证使其有着与其他录音笔相竞争的资本。要说不足的话,容量偏小和需要较为经常地更换电池算是一些美中不足。

最后稍微介绍一下更加高端的录音笔和PX820相比有哪些改进供参考:点阵式的显示屏(PX820非点阵式,因而对文字的显示效果很差,尽管这并不影响使用)、智能降噪、优质的音乐播放效果、无压缩的音频格式、内置立体声麦克风、指向性麦克风、FM收音等等。这些都是PX820所不具备的。

Android中调用资源中的字符串

代码:getResources().getString(R.string.资源名)

范例:

说明:调用app_name字符串并绘图。这样就可以使用定义在string.xml文件中的字符串了。

Android中截取当前屏幕画面

代码及范例:

说明:将屏幕画面截取并保存至Bitmap的getpage中。
范例首先声明了getpage并设置分辨率,这个范例中创建了一个800×380像素的Bitmap。之后声明一个新的Canvas。接下来在该Canvas中(范例中为canvas)进行绘图,这里仅仅填充了浅灰色。最后的两条语句则是将画面截取保存在了getpage中。

避免活动切换动画

Android中切换活动时默认会有简单的动画效果,然而有的时候,特别是比如游戏中,可能这种切换效果是希望被避免的。因此在这里提供我个人认为的一种简单可行的办法。

概括地说,就是整个程序只有一个大的类,这个类负责控制模块,比如,对触摸的识别。在这个类中,再包含多个继承于View类的子类,以供在接收到相应的屏幕或键盘指令后执行。这样就可以避免活动之间的动画切换效果。

这个方法的局限性是对于比较复杂的程序会造成一定的麻烦,同时也失去了多个活动的优点。优点是可以省略传递Intent的步骤。适用于较为简单的程序。

关于翻译的几点说明

从博客建立至今也有半个月了,因为自己也有各种各样的事情要忙,所以仅能维持缓慢的翻译进度了。在这里对翻译作几点说明。

首先是翻译的准确性问题。虽然尽可能地做了检查工作,但是仍然可能还会有一些错误。我会定期回顾检查已发布的文章,但是如果发现有问题还请告诉我。直接在文章下留言即可。

第二,是翻译的通顺性问题。一直对不少引进教材的翻译水平很不满意,真的自己要翻译英文文档时才发现这是一个很难处理好的问题。英文的语言习惯和汉语相差很大,一字一句的翻译会导致行文流畅性的丧失。我决定从现在起尽可能地使用意译。这样可能会增加错误的概率,但我会尽力避免的。之前的文章也会找时间修正。

第三,关于同时翻译的篇目数量。打算从现在起同时翻译两到三篇文章。作为一种尝试。

不过最近比较忙碌是无可避免的了,博客的Favicon也没有时间设计。等到11月中旬一些事情告一段落之后应该会有更多的空闲了吧。

P.S. 补充说明一下关于类名翻译中所遵守的规则。原则上,如果原文中是首字母小写单词,例如,activity,将被翻译为“活动”,如果是首字母大写的Activity,将被认为是类名而直接使用。类似的还有View和view(视图)等。

用户界面

Android程序通过View和ViewGroup对象来构建用户界面。有许多种类的View和ViewGroup,他们都继承于View类。

View对象是Android平台的基本用户界面表现单元。View类是其子类“widgets”(提供诸如文本区域和按钮等全功能UI部件)的基础。ViewGroup类是其子类“layouts”(提供诸如线性、列表和相对等不同类型的布局结构)的基础。

View对象是一种数据结构,塔储存了布局参数和一块特定屏幕矩形区中的内容。View对象处理其自身所属屏幕矩形区域的测量、布局、绘图、焦点改变、滚动、及按键/手势交互。作为用户界面中的一个对象,一个View也是交互事件中用户和接收者的一个交互点。

视图层级(View Hierarchy)

在Android平台上,可以通过View和ViewGroup结点的层级结构来定义Android的UI,就像下图那样。这棵层级树可以随你所需或简单或复杂,你可以使用Android预定义的widget和layout来搭建,或是使用自己创建的自定义View。

为了让视图层级树可以在屏幕上被渲染,一个活动必须调用setContentView()方法并把根节点对象传递给它。Android收到这个引用后用它来擦除、测量、绘制这棵树。树的根节点要求其子节点绘制出自身——这点对于子结点也相同,子节点会要求其子结点自绘。这些子节点会向父结点请求尺寸和位置,不过父结点对子结点的大小位置有最终决定权。Android依次处理布局元素(从层级树的顶部开始),初始化View并将其加入其父结点。正因如此,当有元素重叠时,较后绘制的会覆盖先前绘制的内容。

更多关于视图是如何层级化并被测量绘制的,请阅读“Android如何绘制视图”。

布局(Layout)

使用XML布局文件是最常用的定义布局并表达视图层级的方法。XML为布局提供了一种可读性很高的结构,和HTML相似。XML中的每一个元素都是一个View或者ViewGroup对象(或其子嗣)。View对象是树的叶结点,ViewGroup对象是树的枝结点(如上图所示)。

一个XML元素的名称与其在所显示的Java类相对应。因此一个<TextView>元素会在UI中创建一个TextView,一个<LinearLayout>元素会在视图组中创建一个线性布局。当载入布局资源时,Android系统会根据布局中的元素来初始化这些运行对象。

举例来说,一个有着一个文本视图和一个按钮的垂直视图(vertical layout)是这样的:

注意LinearLayout元素中同时包含有文本视图和按钮。你可以在这里嵌套另一个LinearLayout(或是其他类型的视图组(view group))来加长视图层级,创建一个更为复杂的布局。

关于构建用户界面布局的更多情报请阅读“声明布局”。

Tip:还可以通过Java代码绘制View和ViewGroup对象。使用addView(View)方法来动态地插入新的View和ViewGroup对象。

可以通过多种途径来设计视图的布局。通过使用更多不同类型的视图组可以构造出无数的子视图和视图组。Android提供了一些预定义的视图组(被称为布局)。包括LinearLayout,RelativeLayout,TableLayout,GridLayout等。它们都提供了一些特定的参数用以定义其子视图的位置和布局的结构。

想要获知关于用于布局的不同视图组的更多情报,请阅读“常用Layout对象”。

部件(Widget)

部件是一种View对象,是用户交互的一种接口。Android提供了一套完整可用的部件,比如按钮、勾选框、文本输入框,因此能够快速地构建UI。Android还提供一些更为复杂的部件,比如日期采集器(date picker)、闹钟、缩放控制。不过能使用的部件并不受限于Android平台所提供的这些。通过声明自有的View对象或是继承整合已有的部件,可以创建出更为定制化的部件来实现自定义的功能。

更多内容请阅读“构建自定义组件”。

关于Android所提供的部件列表,参阅android.widget包。

UI事件

在向UI添加了视图/部件之后,需要了解它们如何进行用户交互以实现功能。为了让UI收到事件通知,需要完成以下两件事中的一件:

  • 定义一个事件侦听器并将其在View中注册。通常会通过它来侦听事件。View类包含一系列的嵌套接口,以On<XXXX>Listener命名,并分别拥有一个On<XXXX>()的回调方法。比如,View.OnClickListener(处理View的“点击”),View.OnTouchListener(处理View中的触屏事件),以及View.OnKeyListener(处理View中的设备按键)。如果希望View在“点击”时(比如选中一个按钮)收到通知,就使用OnClickListener并定义其onClick()回调方法(当点击时要执行的动作),之后通过setOnClickListener()将其注册给View。
  • 为View覆写一个已有的回调方法。当使用自建的View类并希望其侦听特殊的事件时需要这样做。可以处理的事件有比如屏幕触摸(onTouchEvent()),轨迹球移动(onTrackballEvent()),或设备键盘操作(onKeyDown())。允许在自定义View中定义每一个事件的默认行为以及事件是否应被传递给其他子视图。再次说明,这些是View类的回调方法,因此只有在构建自定义组件时才能定义它们。

可以在“处理UI事件”一文中继续阅读处理用户界面交互的更多内容。

菜单(Menu)

程序菜单是程序用户界面的另一重要组成部分。菜单提供了一种可靠的接口来显示程序的功能与设置。通常按下设备的菜单键可以调出程序菜单。然而,也可以添加当用户长按某一项目时调出的上下文菜单(Context Menu)。

菜单也是通过视图层级构建的,但是不需要亲自定义其结构。只要为程序定义onCreateOptionsMenu()或onCreateContextMenu()回调方法,之后声明想要包含于菜单内的项目即可。在合适的时刻,Android会自动为菜单创建必要的View等级,并在其中绘制每一个菜单项目。

菜单也会处理其自身的事件,因此不必为菜单中的项目注册事件侦听器。当菜单中的项目被选择时,onOptionItemSelected()或是onContextItemSelected()方法会被框架调用。

如同程序布局,可以在XML文件中声明菜单项目。

阅读“创建菜单”以了解更多。

高级主题

在掌握了创建用户界面的基本内容之后,可以试着用一些高级特性来创建更为复杂的程序接口。

适配器(Adapter)

有时需要把一些无法硬解码的信息装入一个视图组,这时要将视图与外部数据源绑定。为此,需要将AdapterView作为视图组,并将其子视图通过适配器的数据初始化后装入。

AdapterView对象是ViewGroup的一种实现,它说明其子视图是基于Adapter对象的。Adapter充当数据源(比如一列外部字符串)与AdapterView之间的信使角色来显示数据。Adapter类对于专门的任务有这多种不同的实现,比如从Cursor读取数据库数据的CursorAdapter,或是任意读取数组的ArrayAdapter。

欲了解更多关于使用Adapter装入视图的信息,参阅“使用AdapterView绑定数据”。

风格(Style)和主题(Theme)

如果不满意标准部件的外观,可以自己建立风格和主题来修改它们。

  • 风格是一组若干个格式属性,可以将其作为一个单位使用于布局的单个元素中。比如,可以定义一个具有特定文本尺寸和颜色的风格,然后将其应用到特定的View元素中。
  • 主题是一组若干个格式属性,可以将其作为一个单位使用于一个程序的所有活动,或是单个活动中。比如,可以定义一个具有特定窗口框架颜色、面板背景颜色、文本尺寸和菜单颜色的主题。该主题可以被应用于特定活动或是整个程序。

风格和主题是资源。Android提供了一些默认的风格和主题供使用。也可以声明自定义的风格与主题资源。

在“应用风格与主题”一文中可以了解更多关于使用风格和主题的信息。

本页部分内容根据Android Open Source Project创作并共享的内容修改,并在知识共享 署名2.5许可协议中所述条款的限制下使用。

Android开发入门

Android无疑是当前最为热门的移动设备操作系统之一,越来越多的开发者开始为Android开发应用。进行Android开发的目的大致可以分为商业盈利目的和业余爱好。对于后者,不少开发者在刚接触Android开发时总会有各种各样的问题,我想在这篇文章里谈谈如何入门Android。

进行Android开发所必需的素质:

做任何一件事,最重要的恐怕就是兴趣了。甚至可以说,只要有兴趣,做很多事都会顺利很多。因为有兴趣的话,就能够坚持下去,就会进行自主学习。其实这个主题不需要多说,因为要做好任何一件事,所必需的素质都是大同小异的,不是么。

进行Android开发所必需的理论知识:

Android的语法是基于Java的。因此如果对于Java有一定的掌握,开始Android的学习将是一件轻松的事。但是Java并不是学习Android前所必需的,甚至对于Java的了解有时反而会成为学习Android的障碍。毕竟,Android有许多独有的特性,以Java的思路去思考Android有时反而会产生限制。不过基础的OOP编程思想是必要的,如果仅仅学习过C语言这样的面向过程语言,恐怕需要先补充一些知识才能对Android比较顺利地上手。

此外一些基本的计算机相关知识自然也是需要的。对eclipse以及命令行的熟悉将是一种帮助。在开发某些类型的应用程序时OpenGL ES以及SQLite等的相关知识也是必需的。

进行Android开发所必需的软硬件准备:

  • 软件方面
    1. 操作系统:操作系统方面并没有太多的限制,Windows、Max OS和Linux都有对应的SDK。
    2. Java运行环境:开发Android之前需要在计算机上配置好JRE(Java运行环境,Java Runtime Environment),安装好JDK(Java开发套件,Java Development Kit )。具体的方法在开发指南中会有介绍。
    3. IDE(集成开发环境,Integrated development environment):Android的话推荐使用eclipse,这也是Android官方所推荐的。目前的最新版是3.7的Indigo。
  • 硬件方面
    1. 分辨率较高的显示器很重要。笔记本电脑的话或许没有办法,如果是台式机的话,推荐使用分辨率至少为1920×1080的显示器。
    2. 硬盘性能也对开发有着比较大的影响。有条件的话还是使用比较高速的硬盘比较好,能节省不少时间。
    3. 处理器的性能主要影响模拟器的速度。如果有实机进行开发的话,这一点就并不那么重要了。

初学Android开发的一点建议:

要开始学习Android的话,可以选择买一本好书,然后边读边实践。也可以从网络上找资料,自己摸索尝试。前者的优点是翻书比较方便,而且内容经过了作者的整理,缺点则是书的内容毕竟有限。后者的优点是免费,内容多,缺点是比较杂乱,花费时间可能会比较多。

另外自己深有体会的是,网络上的中文内容并不是很齐全,相较英语甚至是日语而言,整体水平低了不少。因此在遇到问题时,尝试通过英语搜索会是一个好主意。自己也有多次“通过中文很久无法找到答案,而通过英语/日语很快解决了问题”的经历。另外在例如Stack Overflow或是Quora这样的问答网站里几乎总是能找到高质量的答案(如果没有,就自己提问吧,得到满意回答的可能性是很高的),特别是Stack Overflow,在编程中遇到问题时应该想到它。总而言之,一定的英语能力可以大大提高自己的学习效率。

有了这些准备之后,就开始正式的Android开发之旅吧。首先可以跟着别人的代码摸索一下Android开发的大致流程,之后了解一下Android提供的各种控件。有了一定的熟悉之后,就可以开始考虑试着编写自己的程序了。

推荐书籍:

可以参见我的一些简单的笔记

下一次将具体介绍一下Android开发环境的搭建。

创建程序启动屏幕

代码及范例:

说明:通过新建一个线程来创建一个splash screen,效果就如同电脑上Office、Photoshop、Media Go等软件启动时有一个画面显示进度那样。在此期间程序可以进行初始化工作,减少用户的等待感。