对于iPhone界面控件的操作应该算是开发中必备的能力。键盘出现的时候上移相关的控件算是常见的需求,但是从这么多人问这个问题就可以看出,还是有很多人对这些需求的实现方式有疑问。
对于这个问题,主要是通过增加对键盘出现和消失的相应的Notification,然后在键盘出现和消息的时候,通过设置相关控件的frame来实现。相关代码如下,来源自stackoverflow。
-(void)textFieldDidBeginEditing:(UITextField *)sender { if ([sender isEqual:_textField]) { //move the main view, so that the keyboard does not hide it. if (self.view.frame.origin.y >= 0) { [self setViewMovedUp:YES]; } } } //method to move the view up/down whenever the keyboard is shown/dismissed -(void)setViewMovedUp:(BOOL)movedUp { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; // if you want to slide up the view CGRect rect = self.view.frame; if (movedUp) { // 1. move the view's origin up so that the text field that will be hidden come above the keyboard // 2. increase the size of the view so that the area behind the keyboard is covered up. rect.origin.y -= kOFFSET_FOR_KEYBOARD; rect.size.height += kOFFSET_FOR_KEYBOARD; } else { // revert back to the normal state. rect.origin.y += kOFFSET_FOR_KEYBOARD; rect.size.height -= kOFFSET_FOR_KEYBOARD; } self.view.frame = rect; [UIView commitAnimations]; } - (void)keyboardWillShow:(NSNotification *)notif { //keyboard will be shown now. depending for which textfield is active, move up or move down the view appropriately if ([_textField isFirstResponder] && self.view.frame.origin.y >= 0) { [self setViewMovedUp:YES]; } else if (![_textField isFirstResponder] && self.view.frame.origin.y < 0) { [self setViewMovedUp:NO]; } } - (void)viewWillAppear:(BOOL)animated { // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:self.view.window]; } - (void)viewWillDisappear:(BOOL)animated { // unregister for keyboard notifications while not visible. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; }
最近做到一个项目,是和视频通话相关的。要求视频通话的过程中是不允许退出到后台的。
所以我们的做法是全屏+屏蔽Home,当然返回键肯定是挂断电话了。
但目前屏蔽Home键的方法无非就是钻了Android的一些漏子,把window type 设置成TYPE_KEYGUARD,TPYE_KEYGUARD_DIALOG或者是TYPE_SYSTEM_ALERT。这样确实framewok层在判断如过window type时如果是这几种确实是不会响应Home的操作的。
但是 2.2以前或许能行,2.2以后就难说了,而且得看不同的机型,厂家有没有修改源码,随便厂家怎么一改,你想在上层屏蔽Home简直是“不可能事件”
即便是这样,你不要以为2.2以前就可以高枕无忧了。
我们测试部门测出问题来了。
当你的Activity正创建的时候调完getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);这句话后,立马点Home,
很可惜,这个时候还可以点Home。为什么呢???
setType设到底层需要点时间撒,可能你这个值刚设进去,底下已经判断过去了。直接响应了Home的事件。
这下就悲剧了,你再把Activity调出来就已经无法去掉状态栏了(全屏有问题拉)。原因是这几种type的根本无法全屏显示的,这个是系统规定的。
当你锁屏时你看看状态栏有没有,有吧!因为它要给你看必要的信息,如来了短信之类的。
所以总结一下,应用层根本无法屏蔽Home键!!!
还是尽量解决退到后台导致的问题吧!
1楼luowenlong860502昨天 16:43仅仅是我个人的想法,欢迎大家拍砖,踊跃发言,共同提高!代码分析到好处是可以直接使用, 但是问题是不够直观为了能够直观了解相机应用的架构和前面分析的对焦过程,我制作了一些关系图,方便大家更加直观的了解相机应用.
拍照对焦过程:
轻触Preview对焦:
camera.java的接口:
camera.java的内部类: