很多网友对会说话的TOM猫的原理比较感兴趣,这里Android123就实现做一个简单的分析:

  1. 音频采集

   这点主要是通过Android设备的麦克风实时采集音频,由于Android平台的MediaRecorder类录制音频到文件,虽然可以通过空设备回调获得实时的音频流,不过为了降低开发者的难度,Android开发网推荐使用正统的AudioRecord和AudioTrack,首先我们仍然需要加入android.permission.RECORD_AUDIO这个权限。

  android.media.AudioRecord类的read方法主要有3种重载形式:

int  read(short[] audioData, int offsetInShorts, int sizeInShorts)   //short在java中占用两个字节
int  read(byte[] audioData, int offsetInBytes, int sizeInBytes)  //byte在java中占用一个字节
int  read(ByteBuffer audioBuffer, int sizeInBytes)  //基于NIO的ByteBuffer类型

  我们可以看到从麦克风中获取的音频无需经过文件系统直接通过AudioRecord类的read方法读入到我们预定的缓冲区中,这里需要注意的是采样率的大小必须有足够的缓冲区空间处理、

  2. 变声处理

  这点需要一些基本的音频处理方式,比如移调、变速,Android开发网推荐大家参考Adobe Audition的早期Cool Editi泄露的代码,当然音频处理算法比较多,大家可以自己实现。

  3. 播放原始音频流

  同样,处理完后考虑到效率我们仍然直接从内存流中播放,最简单的就是AudioTrack类,通过android.media.AudioTrack类的write方法,让Android声卡播放原始音频流。两种重载方法如下

int  write(short[] audioData, int offsetInShorts, int sizeInShorts) 
int  write(byte[] audioData, int offsetInBytes, int sizeInBytes) 

posted @ 2012-01-18 13:40 jsot 阅读(42) 评论(1) 编辑
GC_FOR_MALLOC means that the GC was triggered because there wasn't enough memory left on the heap to perform an allocation. Might be triggered when new objects are being created. 

GC_EXPLICIT means that the garbage collector has been explicitly asked to collect, instead of being triggered by high water marks in the heap. Happens all over the place, but most likely when a thread is being killed or when a binder communication is taken down. 

There are a few others as well: 

GC_CONCURRENT Triggered when the heap has reached a certain amount of objects to collect. 

GC_EXTERNAL_ALLOC means that the the VM is trying to reduce the amount of memory used for collectable objects, to make room for more non-collectable. 





typedefenum{ 
    /* Not enough space for an "ordinary" Object to be allocated. */ 
    GC_FOR_MALLOC, 
    /* Automatic GC triggered by exceeding a heap occupancy threshold. */ 
    GC_CONCURRENT, 
    /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */ 
    GC_EXPLICIT, 
    /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */ 
    GC_EXTERNAL_ALLOC, 
    /* GC to dump heap contents to a file, only used under WITH_HPROF */ 
    GC_HPROF_DUMP_HEAP 
}GcReason; 





GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83ms 

前面Free的内存是VM中java使用的内存,external是指VM中通过JNI中Native的类中的malloc分配出的内存,例如Bitmap和一些Cursor都是这么分配的。 
在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。 
例如上边的例子 
free 3411K/6663K和external 24870K/26260K 
如果这时需要创建一个2M的Bitmap,Native现有内存26260-24870=1390K<2048k,因此他就会向Vm申请内存,虽然java空闲的内存是 
6663-3411=3252>2048,但这部分内存Native是不能使用。 
但是你现在去申请2M的Native内存,VM会告诉你无法分配的,因为现在已使用的内存已经接近峰值了32M(26260+6663=32923 ),所以现在就会成force close 报OOM。 
所以现在我们要检查我们的native内存的使用情况来避免OOM。 

别的资料:http://stackoverflow.com/questions/4525743/what-are-the-paused-values-in-gc-concurrent-log-messages 
posted @ 2012-01-10 12:09 jsot 阅读(42) 评论(0) 编辑
摘要: 结构继承关系public classView.OnClickListner extendsViewjava.lang.Objectandroid.view.Viewandroid.widget.ImageView直接子类ImageButton, QuickContactBadge间接子类ZoomButton类概述显示任意图像,例如图标。ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项。嵌套类enum ImageView.ScaleType将图片边界缩放,以适应视图边界时的可选项XML属性属性.阅读全文
posted @ 2012-01-04 13:09 jsot 阅读(299) 评论(0) 编辑

1.下面的Xfermode子类可以改变这种行为:

AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。

PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

要应用转换模式,可以使用setXferMode方法,如下所示:

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);


2.Porter-Duff 效果图:



3.16条Porter-Duff规则

1.PorterDuff.Mode.CLEAR

   所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC

   显示上层绘制图片
3.PorterDuff.Mode.DST

  显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER

  正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER

  上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN

   取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN

  取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT

 取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT

 取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP

 取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP

  取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR

  
13.PorterDuff.Mode.DARKEN


14.PorterDuff.Mode.LIGHTEN


15.PorterDuff.Mode.MULTIPLY


16.PorterDuff.Mode.SCREEN

posted @ 2012-01-02 19:38 jsot 阅读(143) 评论(0) 编辑

现在来看协议中定义的这些需要实现的方法分别是什么作用:

1、- (void)applicationWillResignActive:(UIApplication *)application

说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

2、- (void)applicationDidBecomeActive:(UIApplication *)application

说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反

3、- (void)applicationDidEnterBackground:(UIApplication *)application

说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

4、- (void)applicationWillEnterForeground:(UIApplication *)application

说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

5、- (void)applicationWillTerminate:(UIApplication *)application

说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止

7、- (void)applicationSignificantTimeChange:(UIApplication*)application

说明:当系统时间发生改变时执行

8、- (void)applicationDidFinishLaunching:(UIApplication*)application

说明:当程序载入后执行

9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame

说明:当StatusBar框将要变化时执行

10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:

(UIInterfaceOrientation)newStatusBarOrientation

duration:(NSTimeInterval)duration

说明:当StatusBar框方向将要变化时执行

11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url

说明:当通过url执行

12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

说明:当StatusBar框方向变化完成后执行

13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

说明:当StatusBar框变化完成后执行

下图是我总结的一个大概流程图,不是很准确但是基本上也说明了整个过程,仅供参考。

posted @ 2011-12-04 14:30 jsot 阅读(57) 评论(0) 编辑
摘要: iPhone绘图关于QuartZ中绘制Line案例是本文要介绍的内容,主要介绍了如何在QuartZ中绘制Line的内容,来看详细内容。下面的代码和例子都是从官方的QuartzDemo中截取的,在此在写下以便以后用到。 1.基本的划线代码。CGContextRefcontext=UIGraphicsGetCurrentContext(); //Drawinglineswithawhitestrokecolor CGContextSetRGBStrokeColor(context,1.0,1.0,1.0,1.0); //Drawthemwitha2.0strokewidthsotheyareab.阅读全文
posted @ 2011-12-02 15:56 jsot 阅读(88) 评论(0) 编辑
摘要: 目录目录发起一个同步请求创建一个异步请求队列请求请求队列上下文ASINetworkQueues, 它的delegate提供更为丰富的功能取消异步请求安全的内存回收建议向服务器端上传数据下载文件获取响应信息获取请求进度cookie的支持大文件断点续传ASIDownloadCache 设置下载缓存多种的缓存并存缓存策略缓存存储方式缓存其它特性实现自定义的缓存使用代理请求ASIHTTPRequest, 请求的其它特性ASIHTTPRequest是一款极其强劲的HTTP访问开源项目。让简单的API完成复杂的功能,如:异步请求,队列请求,GZIP压缩,缓存,断点续传,进度跟踪,上传文件,HTTP认证在新阅读全文
posted @ 2011-12-02 09:10 jsot 阅读(258) 评论(0) 编辑
摘要: 背景: ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度(包括米聊也是这么做的)。 可是在ios5中,键盘布局变了,尤其是中文输入时,中文汉字选择框就固定在键盘上方,这样就使得原本与键盘紧密贴合的界面视图被中文汉字选择框给覆盖住了。一方面影响了界面的美观,另一方面,如果被覆盖的部分就是文本输入框的话,用户就无法看到输入的内容了。因此这个问题就必须得解决了。解决方法: 其实在一开始使用216.0px这个固定值来标注键盘的高度就是错误的。因为在ios3.2以后的系统中,苹果就提供了键盘使用的api以及demo...阅读全文
posted @ 2011-11-26 21:51 jsot 阅读(116) 评论(0) 编辑
摘要: 一.默认状态单行,不可获取用户点击事件,UIViewContentModeRedraw模式,改变就重绘.二.相关属性与函数1.文本属性text // label 显示的文字font // text 的字体,值不可以是nil,否则异常textColor // text 的颜色textAlignment // text 的对其方式lineBreakMode// 当文字超出label显示区域时的截取方式typedefenum{ UILineBreakModeWordWrap =0, // 以空格为界,保留整个单词 UILineBreakModeCh...阅读全文
posted @ 2011-11-17 09:38 jsot 阅读(128) 评论(0) 编辑
摘要: 原文:http://blog.csdn.net/xianpengliu/article/details/6591624iPhone中的UIAlertView用于显示一个模态对话框显示时设置代理delegate,当用户点击对话框中按钮时,系统将会调用delegate的函数从而使得程序可以根据用户的选择进行相应的处理这里使用了代理模式,虽然代理模式在ios的设计中有很多优雅的地方但是这里,用在返回模态对话框的结果,未免有点儿不合时宜每次用到这个,我就非常怀念MFC中的模态对话框:view plainReturnValueret=dlg.doModal();if(ret==x){...}else{.阅读全文
posted @ 2011-11-13 14:45 jsot 阅读(127) 评论(0) 编辑