这几天学习android应用开发,发现安装完android sdk和eclipse用插件以后,虽然可以用vm来模拟nexus7运行开发的应用,但是在windows7下,eclipse无论如何也识别不了nexue7的实机。
谷歌了一下,发现需要安装Nexus7的USB驱动。
1. 用文本编辑器打开以下文件
%android sdk的安装文件夹%\extras\google\usb_driver\android_winusb.inf
2. 如果你的os是32位的,在文件中找到[Google.NTx86],
如果你的os是64位的,在文件中找到[Google.NTamd64]
3. 在里面插入以下内容, 并保存关闭
;Google Nexus 7
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4E40
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4E41
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E42
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E42&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E44&MI_01
4. 打开Nexus7, 用usb连接上电脑。并且在[设置]-[开发者选项]里,把[usb调试]打上勾。
5. 在电脑上, 打开设备管理器,里面会出现带感叹号的Nexus设备
6. 在感叹号上点击鼠标右键,选择“更新软件驱动”
7. 按照以下的流程选择先前编辑好的android_winusb.inf
(由于自己使用的是日文版的操作系统,截图都是日文的, 请在操作过程中和实际使用的操作系统对比着进行)
8. 安装完毕打开设备管理器,就会发现感叹号已经消失,恭喜,系统已经设别你的Nexus7了。
要达到的效果
很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感。比如即时显示输入框已经被输入的字节数,或者即时读取输入的值来进行搜索引导,也就是google的关联搜索效果等。
只要我们能捕获即时事件就能做到很多事情。
需要了解的知识
首先,我们需要了解onchange和onpropertychange的不同:
IE下,当一个HTML元素的属性改变的时候,都能通过 onpropertychange来即时捕获。
onchange在属性值改变时还必须使得当前元素失去焦点(onblur)才可以激活该事件。
了解这一点后我们发现onpropertychange的效果就是我们想要的,可是很遗憾,它只在IE下有效果。我们能不能找到另外一个时间来代替onpropertychange呢?
经过翻阅资料得知,在其他浏览器下可以使用oninput事件来达到同样的效果,真是太好了,我们只需要把IE浏览器区分出来就可以。
oninput的使用
下面我们先了解一下oninput如何使用。
如果您是将注册时间直接写在页面里面,那么如下写法就可以实现:
但是,将oninput写在JS代码中分离出来时与普通事件注册的方法有些不同,必须使用addEventListener来注册。
attachEvent和addEventListener 的不同
说到这里我们再来了解一下 attachEvent和addEventListener 的使用方法:
attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)
addEventListener方法 用于 Mozilla系列
举例:
如果这样写,那么将会只有medhot3被执行
写成这样:
执行顺序为method3->method2->method1
如果是Mozilla系列,并不支持该方法,需要用到addEventListener
了解了如何使用addEventListener来注册oninput事件后我们再回到要解决的问题[划分浏览器]。
判断IE浏览器
如何将IE区分出来呢?
这似乎是一个老生常谈的问题,网络中有很多找那个方法,归类为两类:
其一,是判断浏览器的功能属性。
其二,就是判断传统的 user-agent 字符串,这可能是最古老也是最流行的检测方式。
在这里就不做深入了解了,我们这里用一种比较简单的方法来判断
到目前为止我们遇到的问题就已经解决了,开始写代码来测试我们的思路是否能够实现。
完成代码:
运行代码 复制代码 另存代码 提示:您可以先修改部分代码再运行
太漂亮了,一次完成,预览以上代码,页面中共实现两两种方式:第一、页面中直接引用;第二、JS中引用。
经过测试,兼容:IE6、IE7、IE8、Firefox、Opera、Chrome、Safari
如有更好的解决办法或者其他什么问题可在评论中提出,欢迎批评。
问题:当屏幕下方有textfield时会被弹出的键盘挡住,用户体验不太好。
坚决方法:使用scroll view 当textfield成为first responder时 将textfield滑动到键盘上面
网上这方面的解决方法有很多,但是都不够完美,比如无法真确处理手持方向改变时keybord高度不一样的情况,无法兼容iPad下键盘和iPhone高度不一样,
动画不和谐,实现过于复杂等等问题。 现在我分享的一个简单易懂又比较完美的方法。
AutoScrollView类自动的实现了这一特性,要集成这个功能,只要在xib中将ScrolView的Customer class设置成AutoScrollView就可以了,非常简单容易。
下面是AutoScrollView源代码
// // AutoScrollView.h // AutoScrollView // // Created by KindAzrael on 13-2-18. // Copyright (c) 2013年 KindAzrael. All rights reserved. // #import <UIKit/UIKit.h> @interface AutoScrollView : UIScrollView @property(assign, nonatomic) CGPoint previousOffset; @end
// // AutoScrollView.m // AutoScrollView // // Created by KindAzrael on 13-2-18. // Copyright (c) 2013年 KindAzrael. All rights reserved. // #import "AutoScrollView.h" @interface AutoScrollView () // add the keybord notification - (void)setup; // remove the keybord notification - (void)tearDown; - (void)keyboardWillShow:(NSNotification *)notification; - (void)keyboardWillHide:(NSNotification *)notification; @end @implementation AutoScrollView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (void)awakeFromNib { [self setup]; self.contentSize = CGSizeMake(320, 700); } - (void)dealloc { [self tearDown]; } // hide keybord when touch croll view - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self endEditing:YES]; } - (void)setup { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)tearDown { [[NSNotificationCenter defaultCenter] removeObserver:self]; } // scroll contentOffset when keybord will show - (void)keyboardWillShow:(NSNotification *)notification { self.previousOffset = self.contentOffset; NSDictionary *userInfo = [notification userInfo]; // get keyboard rect in windwo coordinate CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; // convert keyboard rect from window coordinate to scroll view coordinate keyboardRect = [self convertRect:keyboardRect fromView:nil]; // get keybord anmation duration NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // get first responder textfield UIView *currentResponder = [self findFirstResponderBeneathView:self]; if (currentResponder != nil) { // convert textfield left bottom point to scroll view coordinate CGPoint point = [currentResponder convertPoint:CGPointMake(0, currentResponder.frame.size.height) toView:self]; // 计算textfield左下角和键盘上面20像素 之间是不是差值 float scrollY = point.y - (keyboardRect.origin.y - 20); if (scrollY > 0) { [UIView animateWithDuration:animationDuration animations:^{ //移动textfield到键盘上面20个像素 self.contentOffset = CGPointMake(self.contentOffset.x, self.contentOffset.y + scrollY); }]; } } self.scrollEnabled = NO; } // roll back content offset -(void)keyboardWillHide:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; [UIView animateWithDuration:animationDuration animations:^{ self.contentOffset = self.previousOffset; }]; self.scrollEnabled = YES; } - (UIView*)findFirstResponderBeneathView:(UIView*)view { // Search recursively for first responder for ( UIView *childView in view.subviews ) { if ( [childView respondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] ) return childView; UIView *result = [self findFirstResponderBeneathView:childView]; if ( result ) return result; } return nil; } @end
效果