首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

[Android学习笔记九] Android 开发中图片灰阶(黑白)显示

灰阶显示图片的典型应用就是用户头像,如用户在线头像显示彩色(原图),不在线显示灰色(黑白图)。总结一点就是更加一张原始图片来通过颜色的过滤处理计算得到不同显示效果的图片。这方法的API主要位于:android. 使用上文中提到的“三种算法转换彩色灰阶”一文中提到的灰阶计算方法产生的黑白图片显示效果如下图: 说明:通过Use Matrix是使用Android的ColorMatrix和ColorFilter实现,其中设置ColorMatrix的setSaturation(float sat)饱和度设置为0时颜色过滤之后显示灰阶,android.graphics.ColorMatrix的内部实现和具体RGB颜色权重值近似等于图中BT709中的权重。 代码示例(依赖此文中附加的灰阶计算方法封装类) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 @Override protected void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.activity_grayscale); ButterKnife.bind( this ); BitmapDrawablebd=(BitmapDrawable)Original_ImageView.getDrawable(); Bitmapbitmap=bd.getBitmap(); Log.d(TAG, "w=" +bitmap.getWidth()+ ",h=" +bitmap.getHeight()+ ",c=" +bitmap.getConfig().toString()); //0BT709 Bitmapmatrix=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888); Canvascanvas= new Canvas(matrix); Paintpaint= new Paint(); ColorMatrixcolorMatrix= new ColorMatrix(); //传入一个大于1的数字将增加饱和度,而传入一个0~1之间的数字会减少饱和度。0值将产生一幅灰度图像 //AndroidColorMatrix默认的灰阶计算采用下面的BT709标准 colorMatrix.setSaturation(0f); ColorMatrixColorFiltercolorMatrixColorFilter= new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorMatrixColorFilter); canvas.drawBitmap(bitmap,0f,0f,paint); Matrix_ImageView.setImageBitmap(matrix); //原始图片 Bitmapsunflower=XUtils.BitmapUtil.decodeMutableBitmapFromResourceId( this ,R.drawable.sunflower); //1 Bitmaplightness=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.Lightness); Lightness_ImageView.setImageBitmap(lightness); //2 Bitmapaverage=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.Average); Average_ImageView.setImageBitmap(average); //3 Bitmapluminosity=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.Luminosity); Luminosity_ImageView.setImageBitmap(luminosity); //4 Bitmapbt709=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.BT709); BT709_ImageView.setImageBitmap(bt709); //5 Bitmaprmy=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.RMY); RMY_ImageView.setImageBitmap(rmy); //6 Bitmapy=grayScale(sunflower,XUtils.GrayScaleUtil.GrayScale.Y); Y_ImageView.setImageBitmap(y); } public BitmapgrayScale( final Bitmapbitmap,XUtils.GrayScaleUtil.GrayScalegrayScale){ if ( null ==bitmap|| null ==grayScale){ return null ; } Bitmaprs=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888); Canvascanvas= new Canvas(rs); Paintpaint= new Paint(); for ( int x= 0 ,w=bitmap.getWidth();x<w;x++){ for ( int y= 0 ,h=bitmap.getHeight();y<h;y++){ int c=bitmap.getPixel(x,y); int a=Color.alpha(c); int r=Color.red(c); int g=Color.red(c); int b=Color.blue(c); int gc=grayScale.grayScale(r,g,b); paint.setColor(Color.argb(a,gc,gc,gc)); canvas.drawPoint(x,y,paint); } } return rs; } 关于ColorMatrix的介绍参见Android document : 本地:${SDK}/docs/reference/android/graphics/ColorMatrix.html 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1719008,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS访问通讯录开发-读取联系人信息

读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性。通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据。 本案例是从iOS设备上读取通讯录中的联系人,并将其显示在一个表视图中,可以进行查询,点击联系人进入详细信息画面。访问通讯录的应用必须要做的两件事情: 1、添加AddressBook和AddressBookUI框架 为工程添加AddressBook.framework和AddressBookUI.framework 2、引入头文件 在需要访问通讯录类的头文件中引入下面头文件: #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 查询联系人记录 在从通信录数据库查询联系人数据是无法使用SQL语句,只能通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数获得,它们的定义如下: 1 2 3 4 5 6 7 CFArrayRef ABAddressBookCopyArrayOfAllPeople ( ABAddressBookRef addressBook ); CFArrayRef ABAddressBookCopyPeopleWithName ( ABAddressBookRef addressBook, CFStringRef name ); ABAddressBookCopyArrayOfAllPeople函数是查询所有的联系人数据。ABAddressBookCopyPeopleWithName函数是通过人名查询通讯录中的联系人,其中的name参数就是查询的前缀关键字。两个函数中都有addressBook参数,它是我们要查询的通讯录对象,其创建使用ABAddressBookCreateWithOptions函数(在iOS6之前是ABAddressBookCreate函数),它的定义: 1 2 3 4 ABAddressBookRef ABAddressBookCreateWithOptions ( CFDictionaryRef options, CFErrorRef* error ); options参数是保留参数,目前没有采用,使用时候可以传递NULL值。error是错误对象,包含错误信息。 下面是我们代码中有关系查询的部分,先看一下ViewController.h: 1 2 3 4 5 6 7 8 # import <UIKit/UIKit.h> # import <AddressBook/AddressBook.h> # import ”DetailViewController.h” @ interface ViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate> @property (nonatomic, strong) NSArray *listContacts; - ( void )filterContentForSearchText:(NSString*)searchText; @end 属性listContacts是装载联系人记录数组集合,filterContentForSearchText:方法是用来过滤联系人信息的方法,也就是查询方法。 ViewController.m中的viewDidLoad方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 - ( void )viewDidLoad { [super viewDidLoad]; CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ① ABAddressBookRequestAccessWithCompletion(addressBook, ^( bool granted, CFErrorRef error) { ② if (granted) { //查询所有 [self filterContentForSearchText:@ "" ]; ③ } }); CFRelease(addressBook); ④ } 在viewDidLoad方法中首先在第①行代码处使用ABAddressBookCreateWithOptions函数创建addressBook对象,然后在第②行又调用了函数ABAddressBookRequestAccessWithCompletion,这个函数用于向用户请求访问通讯录数据库,如果是第一次访问,则会弹出一个用户授权对话框,如果用户授权可以访问则会调用下面的代码块。 1 2 3 4 ^(bool granted, CFErrorRef error) { if (granted) { } }); 由于请求和代码块的回调都是异步的,你会发现表视图画面先出现,然后过一会儿才有查询出来的结果。在iOS6之后这个请求过程必须有的,否则无法访问通讯录数据库。 ViewController.m中的filterContentForSearchText:查询方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 - ( void )filterContentForSearchText:(NSString*)searchText { //如果没有授权则退出 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { return ; } CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); if ([searchText length]== 0 ) { //查询所有 self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); } else { //条件查询 CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); CFRelease(cfSearchText); } [self.tableView reloadData]; CFRelease(addressBook); } 在该方法中实现查询,ABAddressBookGetAuthorizationStatus()函数返回应用的授权状态,其中kABAuthorizationStatusAuthorized常量代表用户已经授权,在没有授权情况下该方法不进行任何处理。ABAddressBookCopyArrayOfAllPeople函数是查询所有数据,ABAddressBookCopyPeopleWithName函数是根据条件查询,返回值是CFArrayRef类型,不能直接赋值给listContacts(NSArray*类型)属性,处理方式一般如下两种: self.listContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook) ; 或 self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); (__bridge NSArray *)方式不会转让对象所有权,只是简单强制转化。CFBridgingRelease函数实现的是Core Foundation类型到Foundation类型转化并把对象所有权转让ARC(自动管理引用计数),因此不需要释放属性listContacts对应的成员变量。类似还有CFBridgingRetain函数,实现的是Foundation类型到Core Foundation类型转化, 并把对象所有权转让调用者,因此需要释放这个对象,代码如下: CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); CFRelease(cfSearchText); 1 2 3 CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); CFRelease(cfSearchText); 最后在第④行调用CFRelease(addressBook)函数释放addressBook对象,Core Foundation框架中的数据类型内存管理是不受ARC管理的,但是与Foundation框架的MRC管理类似,需要手动释放,CFRelease函数就是相当于Foundation框架中的release(或autorelease)方法。 ViewController.m中的SearchBar查询相关方法: #pragma mark –UISearchBarDelegate 协议方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - ( void )searchBarCancelButtonClicked:(UISearchBar *)searchBar { //查询所有 [self filterContentForSearchText:@ "" ]; } #pragma mark - UISearchDisplayController Delegate Methods //当文本内容发生改变时候,向表视图数据源发出重新加载消息 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString]; //YES情况下表视图可以重新加载 return YES; } 读取单值属性 在一条联系人记录中,有很多属性,这些属性有单值属性和多值属性,单值属性是只有一个值的属性,如:姓氏、名字等,它们是由下面常量定义的: kABPersonFirstNameProperty,名字 kABPersonLastNameProperty,姓氏 kABPersonMiddleNameProperty,中间名 kABPersonPrefixProperty,前缀 kABPersonSuffixProperty,后缀 kABPersonNicknameProperty,昵称 kABPersonFirstNamePhoneticProperty,名字汉语拼音或音标 kABPersonLastNamePhoneticProperty,姓氏汉语拼音或音标 q kABPersonMiddleNamePhoneticProperty,中间名汉语拼音或音标 kABPersonOrganizationProperty,组织名 kABPersonJobTitleProperty,头衔 kABPersonDepartmentProperty,部门 kABPersonNoteProperty,备注 读取记录属性函数是ABRecordCopyValue,ABRecordCopyValue函数的定义如下: CFTypeRef ABRecordCopyValue ( ABRecordRef record, ABPropertyID property ); ABRecordRef参数是记录对象,ABPropertyID是属性ID,就是上面的常量kABPersonFirstNameProperty等。返回值类型是CFTypeRef,它是Core Foundation类型的“泛型”,可以代表任何的Core Foundation类型。 ViewController.m中的tableView:cellForRowAtIndexPath:方法,主要实现了访问单值属性: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @”Cell”; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]); ① NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty)); ② firstName = firstName != nil?firstName:@”"; NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty)); ③ lastName = lastName != nil?lastName:@”"; cell.textLabel.text = [NSString stringWithFormat:@ "%@ %@" ,firstName,lastName]; CFRelease(thisPerson); return cell; } 第①行ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]])语句是从NSArray*集合中取出一个元素,并且转化为Core Foundation类型的ABRecordRef类型。CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty))语句是将名字属性取出来,转化为NSString*类型。最后CFRelease(thisPerson)是释放ABRecordRef对象。 此外,为了把选中的联系人传递给详细画面,我们需要获得选中记录的ID,然后把ID传递到详细画面,这个过程处理是在ViewController.m中的 prepareForSegue:方法完成的: 1 2 3 4 5 6 7 8 9 10 11 12 - ( void )prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@”showDetail”]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]); DetailViewController *detailViewController = [segue destinationViewController]; ABRecordID personID = ABRecordGetRecordID(thisPerson); ① NSNumber *personIDAsNumber = [NSNumber numberWithInt:personID]; ② detailViewController.personIDAsNumber = personIDAsNumber; ③ CFRelease(thisPerson); ④ } } 其中第①行代码调用函数ABRecordGetRecordID是获取选中记录的ID,其中ID为ABRecordID类型。为了传递这个ID给DetailViewController视图控制器,DetailViewController视图控制器定义了personIDAsNumber属性,在第③行将ID给personIDAsNumber属性。DetailViewController.h代码如下: #import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> @interface DetailViewController : UITableViewController @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (weak, nonatomic) IBOutlet UILabel *lblName; @property (weak, nonatomic) IBOutlet UILabel *lblMobile; @property (weak, nonatomic) IBOutlet UILabel *lblIPhone; @property (weak, nonatomic) IBOutlet UILabel *lblWorkEmail; @property (weak, nonatomic) IBOutlet UILabel *lblHomeEmail; @property (strong, nonatomic) NSNumber* personIDAsNumber; @end personIDAsNumber属性为NSNumber*类型。 读取多值属性 多值属性是包含多个值的集合类型,如:电话号码、Email、URL等,它们主要是由下面常量定义的: kABPersonPhoneProperty,电话号码属性,kABMultiStringPropertyType类型多值属性; kABPersonEmailProperty,Email属性,kABMultiStringPropertyType类型多值属性; kABPersonURLProperty,URL属性,kABMultiStringPropertyType类型多值属性; kABPersonRelatedNamesProperty,亲属关系人属性,kABMultiStringPropertyType类型多值属性; kABPersonAddressProperty,地址属性,kABMultiDictionaryPropertyType类型多值属性; kABPersonInstantMessageProperty,即时聊天属性,kABMultiDictionaryPropertyType类型多值属性; kABPersonSocialProfileProperty,社交账号属性,kABMultiDictionaryPropertyType类型多值属性; 在多值属性中包含了label(标签)、value(值)和ID等部分,其中标签和值都是可以重复的,而ID是不能重复的 多值属性访问方式与单值属性访问类似都使用ABRecordCopyValue函数。不同的是多值属性访问返回值是ABMultiValueRef,然后要使用ABMultiValueCopyArrayOfAllValues函数从ABMultiValueRef对象中获取数组CFArrayRef集合。ABMultiValueCopyArrayOfAllValues函数的定义如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CFArrayRef ABMultiValueCopyArrayOfAllValues ( ABMultiValueRef multiValue ); ABMultiValueCopyLabelAtIndex函数可以从ABMultiValueRef对象中返回标签,其定义如下: CFStringRef ABMultiValueCopyLabelAtIndex ( ABMultiValueRef multiValue, CFIndex index ); 参数multiValue是ABMultiValueRef对象,index是查找标签的索引。 ABMultiValueGetIdentifierAtIndex函数可以从ABMultiValueRef对象中返回ID,其定义如下: ABMultiValueIdentifier ABMultiValueGetIdentifierAtIndex ( ABMultiValueRef multiValue, CFIndex index ); 在DetailViewController.m文件viewDidLoad方法中取得Email多值属性,其代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ABMultiValueRef emailsProperty = ABRecordCopyValue(person, kABPersonEmailProperty); NSArray* emailsArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailsProperty)); for ( int index = 0 ; index< [emailsArray count]; index++){ NSString *email = [emailsArray objectAtIndex:index]; NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailsProperty, index)); if ([emailLabel isEqualToString:(NSString*)kABWorkLabel]) { [self.lblWorkEmail setText:email]; } else if ([emailLabel isEqualToString:(NSString*)kABHomeLabel]) { [self.lblHomeEmail setText:email]; } else { NSLog(@”%@: %@”, @”其它Email”, email); } } CFRelease(emailsProperty); 其中ABMultiValueCopyArrayOfAllValues(emailsProperty))语句是从emailsProperty属性中取出数组集合。kABWorkLabel和kABHomeLabel都是Email多值属性的标签。kABWorkLabel是工作Email标签和kABHomeLabel是家庭Email标签,另外还有kABOtherLabel,它是Email标签。最后emailsProperty需要释放。 DetailViewController.m中的viewDidLoad方法中取得电话号码多值属性代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray* phoneNumberArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phoneNumberProperty)); for ( int index = 0 ; index< [phoneNumberArray count]; index++){ NSString *phoneNumber = [phoneNumberArray objectAtIndex:index]; NSString *phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phoneNumberProperty, index)); if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { [self.lblMobile setText:phoneNumber]; } else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { [self.lblIPhone setText:phoneNumber]; } else { NSLog(@”%@: %@”, @”其它电话”, phoneNumber); } } CFRelease(phoneNumberProperty); kABPersonPhoneMobileLabel和kABPersonPhoneIPhoneLabel都是电话号码属性的标签。kABPersonPhoneMobileLabel是移动电话号码标签,kABPersonPhoneIPhoneLabel是iPhone电话号码标签。此外还有: kABPersonPhoneMainLabel,主要电话号码标签; kABPersonPhoneHomeFAXLabel,家庭传真电话号码标签; kABPersonPhoneWorkFAXLabel,工作传真电话号码标签; kABPersonPhonePagerLabel,寻呼机号码标签。 11.2.4 读取图片属性 通讯录中的联系人可以有一个图片,读取联系人图片的相关函数有ABPersonCopyImageData和ABPersonHasImageData等。ABPersonCopyImageData可以读取联系人图片函数,它的定义如下: CFDataRef ABPersonCopyImageData ( ABRecordRef person ); 它的返回类型是CFDataRef,与之对应的Foundation框架类型是NSData*。ABPersonHasImageData函数用于判断联系人是否有图片,它的定义如下: 1 2 3 bool ABPersonHasImageData ( ABRecordRef person ); DetailViewController.m中的viewDidLoad方法中取得联系人图片代码如下: if (ABPersonHasImageData(person)) { 1 2 3 4 5 NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(person)); if (photoData){ [self.imageView setImage:[UIImage imageWithData:photoData]]; } } ABPersonCopyImageData取出的是CFDataRef类型,将其转化为NSData*,再使用UIImage的构造方法imageWithData:构建UIImage对象,然后再把UIImage对象赋值给imageView图片控件。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1238527,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android GIS开发系列-- 入门季(12) 显示载天地图

在项目中可以经常需要动态加载一些图层,像投影地图服务、投影地图服务器。其实网上有大量这样的服务,比如天地图官网, 。 随便点开一个服务,里面有相关的信息。那如何加载这样图层服务呢。 一、首先感谢这篇博文ArcGIS读取天地图出现错位的情况,这篇文章的下载链接也有许多有用的资料。加载天地图用到一个关键的自定义类TianDiTuLayer View Code 另外还有三个类,TianDiTuLayerInfo、LayerInfoFactory、TianDiTuLayerTypes这里就不贴代码了。资料下载。 二、我们修改一下代码 1.常量类TDTConstant: View Code 2.TianDiTuLayer,代码如下 : View Code 3.TianDiTuInfo实体类: View Code 4.Activity代码: View Code 调用的地图服务相关信息 效果图: 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751990.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android GIS开发系列-- 入门季(9) 定位当前的位置

利用MapView定位当前的位置 这里要用到Arcgis中的LocationDisplayManager这个类,由于比较简单。直接上代码: LocationDisplayManager locationDisplayManager = mMapView.getLocationDisplayManager();//获取定位类 locationDisplayManager.setShowLocation(true); locationDisplayManager.setAutoPanMode(LocationDisplayManager.AutoPanMode.LOCATION);//设置模式 locationDisplayManager.setShowPings(true); locationDisplayManager.start();//开始定位 由于是定位,在AndroidManifest文件中,要添加以下权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 另外如果我们想获取定位点的位置,调用代码:Point point = locationDisplayManager.getPoint();即可获取。 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751967.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Centos7下安装eclipse进行C/C++开发

1)下载eclipse Eclipse下载网址:https://www.eclipse.org/downloads/ 注意选择的时候选择Eclipse IDE for C/C++ Developers 2)下载cdt cdt下载网址:www.eclipse.org/cdt/ 3)安装 进入要“安装软件”的目录然后,解压eclipse-jee-kepler-RC3-Linux-gtk.tar.gz压缩包命令是 tar –zxvf eclipse-jee-kepler-RC3-linux-gtk.tar.gz得到:eclipse文件夹 4)安装cdt 在终端输入:unzip cdt-master-8.1.2.zip –d cdt,可以把cdt-master-8.1.2.zip解压并且它的内容存放在cdt文件夹下。再输入:cp –r cdt/plugins/ eclipse/,则将cdt下plugins的内容拷贝到eclipse下plugins文件夹。最后,输入cp –r cdt/features/ eclipse/,则将cdt下features的内容拷贝到eclipse下features文件夹。 到现在,安装已经完成。 5)测试Eclipse是否可以工作 直接打开eclipse文件下的eclipse文件,运行弹出窗口,测试成功,否则,不成功,请验证是否安装JDK。按照本章节操作,cetos系统必须提前安装好JDK之类的,否则会出错。 6)eclipse cdt运行c程序报错“launch failed,binary not found” 在CDT中每一次新项目建成后,系统一般默认会进行第一次的构建,也就是自动生成可执行文件。可是事实我们在刚新建的项目甚至还没有源码文 件,所以当然不 会生成可执行的文件了。当我们新建了一个源码文件时,点击执行按钮,就会弹出所说的”launch failed.Binary not found “提示说明(找不到可运行的二进制文件)。 解决办法:窗口左面的项目文件夹上右键鼠标,在弹出的菜单中选择Build Configurations —>Build selected,选择其中的debug或者release进行构建。 7)在应用菜单中添加菜单项—–把eclipse添加到应用菜单中 gnome桌面的所有菜单项都存储如下位置: /usr/share/applications/ 新建一个菜单项,直接在该目录下新建一个后缀名为.desktop的文件即可。 vim /usr/share/applications/c-eclipse.desktop 文件内容如下: [Desktop Entry] Version=1.0 Name=C-Eclipse Icon=/opt/eclipse/icon.xpm Exec=/opt/eclipse/eclipse Terminal=false Type=Application StartupNotify=true Categories=Application;Development;IDE 三、参考文章 1.http://www.centoscn.com/image-text/install/2016/0529/7296.html 2.http://www.360kb.com/kb/2_140.html 3.http://blog.csdn.net/u011345885/article/details/51871435 4.http://www.centoscn.com/CentOS/config/2015/1106/6391.html

优秀的个人博客,低调大师

某android平板项目开发笔记---计划任务备份

前言: 很久,都没更新过这个系列了…因为,除了图表以外,然后就是数据库了,调试了一个多星期的Ormlite数据库,在最新版本中(orm 4.3.3)发现了几个比较严重的bug(例如,查找id的时候无法使用Long类型),不过,还好,ormlite社区还算活跃,bug,已经在预览中修复了.关于Ormlite数据库的话,园子里面已经有了写得很不错的教程了,我就不重复他们的劳动了.然后,数据库搞定了,就是写业务了,有这么一个业务,就是,要求,在某个时间点,对插入的数据进行后台更新,然后,就涉及到了使用计划任务这么一块知识,觉得有必要做下笔记,这块,以后应该也能用到 业务说明: 在某时某刻进行数据库的备份. 相关知识: 1,时间操作 (1) 熟悉使用Calendar 1,作为定时任务,我们需要一个具体的定时时间,以前,我是用Date 类取毫秒数,然后进行计数的操作 1.1例如 //以下为以前的某项目算相隔天数的演示代码 String startDate = mDateStart.getText().toString(); String endDate = year + "-" + (month + 1) + "-" + day; Log.d("soap", startDate + "---" + endDate); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // long day=(startC.getTime()-endC.getTime())/(24*60*60*1000); try { Date start = df.parse(startDate); Date end = df.parse(endDate); Long d = (end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000); Log.d("soap", "相隔天数" + d); if (d &gt; 60) { return false; } else { return true; } } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } 以前这样写,感觉挺傻的,希望大家不要学习了,这次的业务需求,如果,是以前的话,我会一个创建具体时间字符串,然后用SimpleDateFormat,获取毫秒数,这样个人感觉,很不直观,也麻烦,也不方便国际化,我们用Calendar做就非常简单了. 1.2 定时23:00 执行备份操作 竟然是定时任务,我们就要熟悉一个android的一个用于做定时任务的类 AlarmManager 各位,先去看一下官方文档,在接着看下去吧… 这个类是的初始化是必须要用Context.getSystemService(Context.ALARM_SERVICE). 以下为定时代码块 //初始化定时类 AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); //设置定时时间,1分钟后执行 Calendar c = Calendar.getInstance(); c.add(Calendar.MINUTE, 1); //设置时间到了执行的services Intent intent = new Intent(); //创建一个servcies intent.setClass(this, UpdateStatics.class); PendingIntent pi = PendingIntent.getService(this, 0, intent, 0); //设置定时 //需要android.permission.SET_TIME 权限 //第一个参数为定时类型(一共有四种,具体参见官方文档),第二个参数为设置的定时时间为long类型,第三个为执行的目标 am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); 以上代码就会在,1分钟后,系统执行UpdateStatics 类. 如果,我们要设置具体的时间,只要具体设置Calendar的对象即可,例如23:00分执行 c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); 总结: 使用Calendar类操作时间,和进行时间计算,设置,是十分方便的事情, 2,备份操作 1, 建一个接口类用于,监听操作. public interface CompletionListener { void onBackupComplete(); void onRestoreComplete(); void onError(int errorCode); } 2,创建一个异步备份的类 public class BackupTask extends AsyncTask<String, Void, Integer> implements CompletionListener{ //定义常量 public static final int BACKUP_SUCCESS =1; public static final int RESTORE_SUCCESS = 2; public static final int BACKUP_ERROR = 3; public static final int RESTORE_NOFLEERROR = 4; public static final String COMMAND_BACKUP = "backupDatabase"; public static final String COMMAND_RESTORE = "restroeDatabase"; private Context mContext; public BackupTask(Context context){ this.mContext = context; } @Override protected Integer doInBackground(String... params) { //1,获得数据库路径 File dbFile = mContext.getDatabasePath("xxx.db"); //2,创建保存的数据库的路径 File exportDir = new File(Environment.getExternalStorageDirectory(),"shopBackup"); if(!exportDir.exists()){ exportDir.mkdirs(); } File backup = new File(exportDir, dbFile.getName()); //3,检查操作 String command = params[0]; if(command.equals(COMMAND_BACKUP)){ //复制文件 try { backup.createNewFile(); fileCopy(dbFile, backup); return BACKUP_SUCCESS; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return BACKUP_ERROR; } }else{ return BACKUP_ERROR; } } private void fileCopy(File source, File dest) throws IOException { FileChannel inChannel = new FileInputStream(source).getChannel(); FileChannel outChannel = new FileOutputStream(dest).getChannel(); // FileInputStream fis = new FileInputStream(dbFile); // FileOutputStream fos = new FileOutputStream(backup); // byte buffer[] = new byte[4 * 1024]; // while(fis.read(buffer) != -1){ // fos.write(buffer); // } // fos.flush(); // long size = inChannel.size(); try { inChannel.transferTo(0, inChannel.size(), outChannel); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(inChannel != null){ inChannel.close(); } if(outChannel != null){ outChannel.close(); } } } @Override protected void onPostExecute(Integer result) { // TODO Auto-generated method stub super.onPostExecute(result); switch (result) { case BACKUP_SUCCESS: onBackupComplete(); break; default: break; } } @Override public void onBackupComplete() { Log.d("backup", "ok"); } @Override public void onRestoreComplete() { // TODO Auto-generated method stub } @Override public void onError(int errorCode) { // TODO Auto-generated method stub } } 记得,设置好权限: android.permission.WRITE_EXTERNAL_STORAGE AsyncTask<Params,Progress,Result> 这个类的用法,官方文档已经解释的很详细了,这里也不做重复解释. 关于:fileCopy(File source, File dest) 这个方法,我这里改用了Nio 的方式进行操作.用注释注释的代码是一般的方式,这个两者有什么区别呢? 文档 java.nio.channels 类 FileChannel transferTo 里面有这么一句话 与从此通道读取并将内容写入目标通道的简单循环语句相比,此方法可能高效得多。很多操作系统可将字节直接从文件系统缓存传输到目标通道,而无需实际复制各字节。 看到这句话我就使用了这个方法了,然后,为了搞清楚实现的方式,我查看了一下transferTo 的源码只是一个抽象方法,然后,在的FileInputSteam里面找的了channel 的实现方法,不过可惜的,具体的实现代码,我的源码包没有. 然后我顺便比较了java 和 android java 对于获取,channel的区别 java jdk_1.6_u30 默认的fileChannel是用sun包进行实现,然后,关于实现的部分,应该要下个sun包的源码了吧,因为,没找的,就贴不出来了. public FileChannel getChannel() { synchronized (this) { if (channel == null) { channel = FileChannelImpl.open(fd, true, false, this); /* * Increment fd's use count. Invoking the channel's close() * method will result in decrementing the use count set for * the channel. */ fd.incrementAndGetUseCount(); } return channel; } android java getChannel的代码部分 public FileChannel getChannel() { // BEGIN android-changed synchronized(this) { if (channel == null) { channel = FileChannelFactory.getFileChannel(this, fd.descriptor, IFileSystem.O_RDONLY); } return channel; } // END android-changed } android java同样,我的源码包到实现filechannel 部分的代码就没了,对于获取filechannel ,google 是重写了sun那部分的代码了.至于两者的区别,我就不清楚了.有知道的朋友,望告知

优秀的个人博客,低调大师

【Android开发坑系列】如何让Service尽可能存活

流行的思路如下【2015-11-20更新】: 1.让Service杀不死。Service的onStartCommand返回START_STICKY,同时onDestroy里面调用startService启动自身。 2.让Service从后台变成前置。在Android 2.0以前有效,借助setForeground(true)。 3.让某个进程不被系统的low memory killer杀死(如数据缓存进程,或状态监控进程,或远程服务进程)。addandroid:persistent="true"into the <application> section in your AndroidManifest.xml。切记,这个不可滥用,系统中用这个的service,app一多,整个系统就完蛋了。通过实验发现即使设置了这个属性,应用程序被force kill之后还是不能重新启动起来的,应该是只对low memory killer免疫。 4.提升Service优先级。在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,避免Service被系统回收。 5.定时唤醒,通过AlarmManager。(在Android 4.0之前有效,4.0之后被强杀的APP无法唤醒 参考http://www.android100.org/html/201305/06/2430.html)。 6.当应用升级之后,即使用户不点开APP,也要重启服务。因为升级APP时会发送ACTION_PACKAGE_RESTARTED,AlarmManager作为系统服务,会接受这个事件,然后startService。 7.让Service开机启动。不过现在很多手机会禁止开机启动。 8.守护进程。 参考1:http://www.bubuko.com/infodetail-474019.html 参考2:http://blog.csdn.net/hellogv/article/details/46765387 本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/p/4786814.html,如需转载请自行联系原作者。

优秀的个人博客,低调大师

Android GIS开发系列-- 入门季(2) MapView与图层介绍

一、MapView MapView是Arcgis中的最基本的类,与高德地图SDK的MapView的重要性一样。MapView的创建有两种方法,一种是在Layout文件中直接写控件。一种是实例化,MapView mapView = new MapView(Context context); <com.esri.android.map.MapView android:id="@+id/map" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 1.addLayer(Layerlayer),添加图层。可以添加网络图层与本地图层,tpk文件,shp文件,json数据等。 图层的添加是有顺序的,一层一层叠加,后面的图层会覆盖前面的图层。removeLayer(int index),移除图层。getLayer获取图层,通过顺序id,url地址等获取。 2.setExtent,设置MapView的所显示的范围。 3.zoomin地图缩小,zoomout地图放大。 4.setOnSingleTapListener(OnSingleTapListeneronSingleTapListener),MapView的单击事件,返回的是float screenx, float screeny,屏幕的x与y值,通过toMapPoint(float screenx, float screeny),将屏幕坐标转化为地图坐标。 5.toScreenPoint(Pointsrc),将地图坐标转化屏幕坐标。 6.setOnLongPressListener(OnLongPressListeneronLongPressListener),地图的长按事件,也是返回屏幕的x与y值。 7.getSpatialReference(),获取地图的坐标系,比如84坐标或者是墨卡托等。 8.getLocationDisplayManager(),返回LocationDisplayManager,用于地图定位的显示。 9.getCallout(),返回Callout对象,用于显示气泡弹出 二、图层 Arcgis中的图层有许多,下面是图层的关系表。主要的图层有DynamicLayer,FeatureLayer,GraphicsLayer,GroupLayer,KmlLayer,RasterLayer,TiledLayer。 ,下面的主要来介绍一下Arcgis的主要图层。 1.GraphicLayer,图形图层,只有一个子类ArcGISFeatureLayer。用户通过这个图层可以在MapView中自形绘制要素,通过样式与色彩绘制点、线、面。 2.TiledLayer,切片图层,子类有ArcGISLocalTiledLayer,TiledServiceLayer。ArcGISLocalTiledLayer可以加载本地的tpk文件与切片图层,通过其子类ArcGISTiledMapServiceLayer加载网络的切片图层。 下面的主要来介绍一下Arcgis的主要图层。 1.GraphicLayer,图形图层,只有一个子类ArcGISFeatureLayer。用户通过这个图层可以在MapView中自形绘制要素,通过样式与色彩绘制点、线、面。 2.TiledLayer,切片图层,子类有ArcGISLocalTiledLayer,TiledServiceLayer。ArcGISLocalTiledLayer可以加载本地的tpk文件与切片图层,通过其子类ArcGISTiledMapServiceLayer加载网络的切片图层。 ArcGISLocalTiledLayerlocal=newArcGISLocalTiledLayer("/sdcard/<CacheName>/Layers"); ArcGISLocalTiledLayerlocal=newArcGISLocalTiledLayer("/sdcard/<CacheName>.tpk"); 3.FeatureLayer,要素图层,没有子类,可加载本地shp文件。通过要素的特性,快速查询具体的要素信息。加载快速。 4.DynamicLayer,动态图层。主要有子类ArcGISDynamicMapServiceLayer,ArcGISImageServiceLayer, WMSLayer。前面两个用来加载网络动态图层与网络图像图层。 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751847.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发学习笔记:如何移除EditText上的输入焦点

移除EditText上的输入焦点的方法有很多种,下面介绍一种简单实用的方法。 1.先看下面代码的在模拟器上运行的效果 EditTextDemoActivity.java packagecom.android.EditTextDemo.activity; importandroid.app.Activity; importandroid.os.Bundle; publicclassEditTextDemoActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns: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" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> strings.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="hello">HelloEditText!</string> <stringname="app_name">EditTextDemo</string> </resources> 效果图: 这时的光标是在第一个EditText闪烁的,第二个EditText却没有 2.将上面的main.xml改成如下所示,即是将第一个EditText的高度,宽度改为0dp,这样就能覆盖有光标闪烁的第一个EditText,从而达到了移除EditText上的输入焦点的效果 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns: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" /> <EditText android:layout_width="0dp" android:layout_height="0dp" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/627850

优秀的个人博客,低调大师

开发Android平板电脑程序不能全屏显示问题的解决

调整了Android模拟器得大小为800*480但是,程序跑起来之后发现程序只在中间显示,分辨率任然为手机分辨率,其他地方都是黑屏。 解决方法很简单。在Manifest.xml 中的单独加入这么一句话就好了。 ?[Copy to clipboard] Downloadzuiniuwang.xml <supports-screensandroid:anydensity="true" android:largescreens="true" android:normalscreens="true" android:smallscreens="true"/> 本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718268,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发应用实例:简单计算器+多点触控

这个例子是在一个简单的整型计算器应用了多点触控:一点触控是进行加法运算,两点触控是减法运算,三点触控是乘法运算,四点触控是除法运算。还添加了选项菜单,菜单上的内容有:退出,帮助,清空。 效果图: 具体的代码: MainActivity.java packagecom.lingdududu.test; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.os.Bundle; importandroid.view.Menu; importandroid.view.MenuItem; importandroid.view.MotionEvent; importandroid.widget.EditText; importandroid.widget.Toast; /** * *@authorlingdududu *这个程序主要是解决简单的整形的四则运算,用户在前两个EditText分别输入被除数,除数, *使用多点触控,一点触控是进行加法运算,两点触控是减法运算, *三点触控是乘法运算,四点触控是除法运算 *触控之后在第三个EditText显示结果 */ publicclassMainActivityextendsActivity{ //定义日志标签 privatestaticfinalStringTag="System.out"; //菜单项ID常量 privatestaticfinalintITEM1=Menu.FIRST; privatestaticfinalintITEM2=Menu.FIRST+1; privatestaticfinalintITEM3=Menu.FIRST+2; privatestaticEditTextfirstEtx,secondEtx,resultEtx; //定义用户输入的两个数 intvalue1,value2; Stringstr; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //通过findViewById方法获得EditText实例 firstEtx=(EditText)findViewById(R.id.text1); secondEtx=(EditText)findViewById(R.id.text2); resultEtx=(EditText)findViewById(R.id.text3); //计算结果输出的EditText不可编辑 resultEtx.setFocusable(false); } //选项菜单OptionMenu publicbooleanonCreateOptionsMenu(Menumenu){ /*添加菜单项 *android.R使用的是系统自带的图标 */ menu.add(0,ITEM1,0,"退出").setIcon(android.R.drawable.ic_lock_power_off); menu.add(0,ITEM2,0,"帮助").setIcon(android.R.drawable.ic_menu_help); menu.add(0,ITEM3,0,"清空").setIcon(android.R.drawable.ic_menu_close_clear_cancel); returntrue; } //覆盖onOptionsItemSelected(MenuItemitem)来响应菜单选项被单击事件 publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ //菜单项1被选择 caseITEM1: //返回主界面 finish(); break; //菜单项2被选择 caseITEM2: //在对话框AlertDialog显示帮助信息 AlertDialog.Builderdialog=newAlertDialog.Builder(this); dialog.setTitle("操作说明信息") .setMessage( "用户在前两个EditText分别输入被除数,除数。一点触控是进行加法运算,两点触控是减法运算,三点触控是乘法运算,四点触控是除法运算。" +"触摸屏幕后,在第三个EditText显示计算的结果,当离开屏幕的时候,显示结果的EditText被清空。" +"点击Menu出现选项菜单,选择清空能清空EditText里面的数据,选择退出能退出程序,回到主界面") .show(); break; //菜单项3被选择 caseITEM3: //清空EditText的数据 firstEtx.setText(""); secondEtx.setText(""); resultEtx.setText(""); break; } returntrue; } publicbooleanonTouchEvent(MotionEventevent){ //TODOAuto-generatedmethodstub //强制类型转换,将String类型转化成int类型 value1=Integer.parseInt(firstEtx.getText().toString()); value2=Integer.parseInt(secondEtx.getText().toString()); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕 intnum=event.getPointerCount(); try{ if(event.getAction()==MotionEvent.ACTION_UP){ resultEtx.setText(""); } //处理多点触控 else{ //一个手指按住屏幕,进行加法运算 if(num==1){ str=String.valueOf(value1+value2); //将计算到的结果添加到第三个EditText resultEtx.setText(str); } elseif(num==2){ str=String.valueOf(value1-value2); //将计算到的结果添加到第三个EditText resultEtx.setText(str); } elseif(num==3){ str=String.valueOf(value1*value2); //将计算到的结果添加到第三个EditText resultEtx.setText(str); } elseif(num==4){ str=String.valueOf(value1/value2); //将计算到的结果添加到第三个EditText resultEtx.setText(str); } else{ } } }catch(Exceptione){ //调用Toast显示出现异常的信息 Toast.makeText(MainActivity.this,"请检查你输入的除数是否正确",Toast.LENGTH_LONG).show(); } returnsuper.onTouchEvent(event); } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns: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="请输入被除数" /> <EditText android:id="@+id/text1" android:inputType="number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请输入除数" /> <EditText android:id="@+id/text2" android:inputType="number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="计算的结果为" /> <EditText android:id="@+id/text3" android:inputType="number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <!--<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:text="进行除法运算" />--> </LinearLayout> 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/687745

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册