首页 文章 精选 留言 我的

精选列表

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

【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)

剪切区域也称为可视区域,是由画布进行设置的;它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域外,绘制的任何内容都将看不到;可视区域可以是圆形、矩形等等。 画布提供了三种设置可视区域的方法。 1.通过坐标,设置矩形可视区域 clipRect(int left,int top,int right,int bottom) 作用:为画布设置矩形可视区域 第一、二个参数:为可视区域的左上角 第三、四个参数:为可视区域的右下角2.利用 Path 来设置可视区域的形状 clipPath(Path path) 作用:为画布设置可视区域 参数:Path实例3.利用 Region 来对画布设置可视区域 clipRegion(Region region) 作用:为画布设置可视区域 参数:Region 实例 Region 表示区域的集合,所以它可以设置多个区域块,而且可以通过这些区域块之间的关系来处理一些问题;比如 Region 设置它所有区域块相交的区域是否可见、设置相交区域只让交集显示等等。 Region 常用函数: op(Rect rect,Op op) 作用:设置区域块 第一个参数:Rect 实例 第二个参数:Region.Op 静态值,表示区域块的显示方式。其中区域块的显示方式如下: Region.Op.UNION: 区域全部显示 Region.Op.INTERSECT:区域的交集显示 Region.Op.XOR:不显示交集区域 下面是实例演示,效果图如下: 创建新项目,游戏框架为 SurfaceView 游戏框架。具体步骤参照“11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)”。 修改 MySurfaceView类中的绘图函数如下: private void myDraw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { //通过图片资源生成一张Bitmap 位图 Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic01); canvas.save(); canvas.drawText("原图:", 20, 20, paint); canvas.drawBitmap(bmp, 20, 30,paint); canvas.restore(); canvas.save(); canvas.drawText("通过坐标,设置矩形可视区域:", 20, 320, paint); /** * 为画布设置矩形可视区域 * 第一、二个参数为可视区域的左上角 * 第三、四个参数为可视区域的右下角 */ canvas.clipRect(20,330,bmp.getWidth()+20,bmp.getHeight()/2+330); canvas.drawBitmap(bmp, 20, 330,paint); canvas.restore(); canvas.save(); canvas.drawText("利用 Path 来设置可视区域的形状,这里为圆形可视区域:", 20, 620, paint); Path path = new Path(); path.addCircle(20+bmp.getWidth()/2, 630+bmp.getHeight()/2, bmp.getWidth()/2, Direction.CCW); /** * 为画布设置可视区域 * 参数:Path实例 * 利用Paht 可以为位图设置任何需要的可视区域,这里是设置一个圆形可视区域。 */ canvas.clipPath(path); canvas.drawBitmap(bmp, 20, 630, paint); canvas.restore(); canvas.save(); canvas.drawText("利用 Region 来对画布设置可视区域:", 20, 920, paint); Region region = new Region(); //区域块全部显示 region.op(new Rect(20,930,120,1030), Region.Op.UNION); //不显示交集区域 region.op(new Rect(50,930,100,1080), Region.Op.XOR); canvas.clipRegion(region); canvas.drawBitmap(bmp, 20, 930, paint); canvas.restore(); } } catch (Exception e) { } finally { if (canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4164979.html,如需转载请自行联系原作者

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

android 测试Activity,Content Provider,Service,测试些什么?(摘取自官网,个人翻译…欢迎校正)

Activity Input validation: Test that an activity responds correctly to input values in an EditText View. Set up a keystroke sequence, send it to the activity, and then usefindViewById(int)to examine the state of the View. You can verify that a valid keystroke sequence enables an OK button, while an invalid one leaves the button disabled. You can also verify that the Activity responds to invalid input by setting error messages in the View. 输入验证:测试一个activity对EditText View输入做出正确地反应.设置按键顺序,并且发送到activity中,还有使用findViewById()用来验证View的状态是否正常.你可以验证一个有效的按键序列在OK按钮上是有效的,当输入一个无效的按键会使按钮失效.你也可以验证当输入无效的设置在View中activity会做出何种反应. Lifecycle events: Test that each of your application's activities handles lifecycle events correctly. In general, lifecycle events are actions, either from the system or from the user, that trigger a callback method such asonCreate()oronClick(). For example, an activity should respond to pause or destroy events by saving its state. Remember that even a change in screen orientation causes the current activity to be destroyed, so you should test that accidental device movements don't accidentally lose the application state. 生命周期事件:测试你每一个应用程序activity 的 handles 在 生命周期里面都是正确的.通常来讲,生命周期事件都是action动作,任何来自于系统或者用户,将会触发回调方法,例如onCreate()或者onClick().举个例子,一个activity应该对pause或者destoryed做出反应来并且保存它的状态.记住,实际上屏幕方向的改变事件会导致当前activity被销毁,所以你应该测试程序在设备运行中发生意外事件时不会偶然间丢失程序的状态. Intents: Test that each activity correctly handles the intents listed in the intent filter specified in its manifest. You can useActivityInstrumentationTestCase2to send mock Intents to the activity under test. Intens:测试每一个activity对指定在manifest的intent-filter里的intents做出正确的处理.你可以使用ActivityInstrumentationTestCase2发送一个模拟Intents 到activity 在测试中 Runtime configuration changes: Test that each activity responds correctly to the possible changes in the device's configuration while your application is running. These include a change to the device's orientation, a change to the current language, and so forth. Handling these changes is described in detail in the topicHandling Runtime Changes. 改变运行时的设置:在程序运行时,测试每个activity都能对可能改变的设备配置做出正确的响应.这些改变包括改变设备的屏幕方向,改变当前语言,等等.Handing这些改变具体描述在Handling Runtime Changes. Screen sizes and resolutions: Before you publish your application, make sure to test it on all of the screen sizes and densities on which you want it to run. You can test the application on multiple sizes and densities using AVDs, or you can test your application directly on the devices that you are targeting. For more information, see the topicSupporting Multiple Screens. 屏幕的兼容性:在你发布你的程序之前,请确认测试好所有你想运行的屏幕大小.你可以使用AVDs测试你的应用程式在多种屏幕大小下,或者你可以直接测试你的程序在目标设备上.更多的信息,可以看这篇Supporting Multiple Screens. Content Provider Test with resolver methods: Even though you can instantiate a provider object inProviderTestCase2, you should always test with a resolver object using the appropriate URI. This ensures that you are testing the provider using the same interaction that a regular application would use. 测试解析方法:尽管你可以在providerTestCase2中实现一个provider,但是你应该始终用一个resolver对象测试合适的 URI.这可以确保你正在测试的provider 是在同一个应用程序中使用同样的操作. Test a public provider as a contract: If you intent your provider to be public and available to other applications, you should test it as a contract. This includes the following ideas: 测试一个公共的provider的协定:如果你想你的provider是一个公共的和可被其它程序访问的,你应该测试它的协定.这里包括了一些主意: Test with constants that your provider publicly exposes. For example, look for constants that refer to column names in one of the provider's data tables. These should always be constants publicly defined by the provider. 测试provider所有公开的常量.比如,在常量中有个列名是归类在provider’s data表中.这些常量应该始终定义在你的provider中 Test all the URIs offered by your provider. Your provider may offer several URIs, each one referring to a different aspect of the data. TheNote Padsample, for example, features a provider that offers one URI for retrieving a list of notes, another for retrieving an individual note by it's database ID, and a third for displaying notes in a live folder. 测试Provider提供的所有URIs.Provider可能提供一些URIs在data中每个都涉及到不同的方式.例如在NOTE PAD 例子中,比如,一个provider提供一个uri 用于回收一个列表的笔记记录,另外一个使用databas Id用于回收一条笔记记录,和 还有一个用于显示笔记在一个折叠面板上 Test invalid URIs: Your unit tests should deliberately call the provider with an invalid URI, and look for errors. Good provider design is to throw an IllegalArgumentException for invalid URIs. 测试无效的URIs:你的单元测试应该故意的调用provider使用一个无效的URI,并且,查看这些错误.在使用无效的URIs时,好的provider的设计是会抛出一个IllegalArgumentException异常. Test the standard provider interactions: Most providers offer six access methods: query, insert, delete, update, getType, and onCreate(). Your tests should verify that all of these methods work. These are described in more detail in the topicContent Providers. 测试标准的provider的操作.很多 providers 提供6个访问方法:查询,插入,删除,更新,获取类型,和onCreate().你的测试应该验证所有这些方法都是正常运行的.这些的详细描述可参阅Content Providers. Test business logic: Don't forget to test the business logic that your provider should enforce. Business logic includes handling of invalid values, financial or arithmetic calculations, elimination or combining of duplicates, and so forth. A content provider does not have to have business logic, because it may be implemented by activities that modify the data. If the provider does implement business logic, you should test it. 测试业务逻辑:不要忘记测试业务逻辑你的provider是可以实现的.业务逻辑包括处理无效的数据,财务或者算术的计算,消除或者联级复制,等等.一个content provider 不要有太多的业务逻辑,因为,这可能导致改变数据时部分业务逻辑被实现.如果你的provider实现了业务逻辑,你应该测试它. services Ensure that theonCreate()is called in response toContext.startService()orContext.bindService(). Similarly, you should ensure thatonDestroy()is called in response toContext.stopService(),Context.unbindService(),stopSelf(), orstopSelfResult(). 确定onCreate()方法是响应Context.startService() 或者Context.binServ()的调用.同样,你应该确定onDestoy()方法是响应Context.stopService(),Context.unbindService(),stopSelf(), orstopSelfResult(). 的调用 Test that your Service correctly handles multiple calls fromContext.startService(). Only the first call triggersService.onCreate(), but all calls trigger a call toService.onStartCommand(). In addition, remember thatstartService()calls don't nest, so a single call toContext.stopService()orService.stopSelf()(but notstopSelf(int)) will stop the Service. You should test that your Service stops at the correct point. 测试Service在Context.startService()的多次调用下正常运行.只有在第一次调用时触发Service.onCreate().但是,其它所有的调用都在Service.onStartCommand()触发.另外,记住startService()不支持嵌套调用!还有单独调用Context.stopService()或者Service.stopSelf()(但是不是stopSelf(int))将会停止Service.你应该测试你的Service在正确的点上停止. Test any business logic that your Service implements. Business logic includes checking for invalid values, financial and arithmetic calculations, and so forth. 测试Service实现的是所有业务逻辑.这些业务逻辑包括检查无效的值,财务和算术运算,等等 本文转自 liam2199 博客,原文链接:http://blog.51cto.com/youxilua/772686 如需转载请自行联系原作者

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

Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)

很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏。 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中。 这样就不需要,在安装APK之后,去下载资源。(这样APK的大小就会大一些) 于是在网上就开始找对应的直接访问随apk一起安装到手机中的资源。比如在assets目录下放置了一个“test.zip”的资源。当apk安装之后,可能我就需要访问这个"test.zip"资源文件。(可能我会去解压到某处) 在网上找了很长时间,说什么在assets下的资源怎么怎么不能超过1M、或者要分成多个不超过1M的小文件,然后用的时候在拼成一个大文件、说什么要用到什么数据库。总之说的,感觉没有一个有用的。 于是自己就实现了一个从assets下拷贝资源到sd卡中的一个功能。这里不限制非得拷贝到sd卡中。 之所以要拷贝出来,是因为在assets内的资源随apk安装之后,不好访问。所以想拷贝到一个容易访问的地方。比如是一个assets下的是一个zip文件,为需要在安装之后进行解压。而解压的时候我又想使用 ant.jar (支持编码) 。于是我先将zip资源拷贝到一个地方,然后在进行解压。 private void copyBigDataToSD(String strOutFileName) throws IOException { InputStream myInput; OutputStream myOutput = new FileOutputStream(strOutFileName); myInput = this.getAssets().open("yphone.zip"); byte[] buffer = new byte[1024]; int length = myInput.read(buffer); while(length > 0) { myOutput.write(buffer, 0, length); length = myInput.read(buffer); } myOutput.flush(); myInput.close(); myOutput.close(); } 备注:参数为要拷贝的目的地例如“/mnt/sdcard/test/Out.zip”; 此处“myInput = cGameActivity.getAssets().open("yphone.zip"); ”open 的是你放在assets下的资源的名称。本例放的是一个叫"yphone.zip"的文件; 在进行测试的时候发现在资源文件很大时,例如200M左右,可能会报错。 但可以保证的是100M一下的没问题。 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3744873.html,如需转载请自行联系原作者

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

在Android设备上提高工作效率和安全性的10招

或许阁下刚刚买入第一款安卓设备,或许阁下使用安卓设备已经有一段时间了但却觉得可能没有最有效地利用它。无论是那种情况,阁下今天行好运了:利用各种调整、应用程序、选项和配置等方法可以使得安卓设备更加强大和有效。下面列出10个笔者最喜欢的技巧,以期帮助阁下在安卓平台上获得最大的好处。 1.使用谷歌 关于安卓的第一件要知道的事是,安卓是与谷歌紧密地整合在一起的。如果不利用二者之间这种整合的优势,就白白错过好东西。笔者说的不仅仅是谷歌网盘、日历、邮件、照片等等,还有搜索。“谷歌Now”时下是安卓里与之最紧密整合的工具之一。如果对其没有最佳地加以利用,阁下就可能真是在对安卓行瞎子摸象之道了。设好谷歌Now的热词(可以吼一声“Okay Google”?),接着就可以体会强大的安卓数字助理所拥有的各种细节了。 2.设置自动备份 安卓设备一般都是和谷歌帐户关联在一起的。用安卓设备可以收电邮、处理谷歌文档。而设备上的所有信息待在那……等的是丢了设备的那一天,或者不小心设备掉马路上了,正好一辆车飙过,设备被碾成碎片,随之而来的是钻心的痛苦。没错,没有买保险的话,阁下大不了花大钱再买一款。但是,那上面的数据可是打水漂了。如果想避免这样的悲剧,就一定要进入设备的备份和重置功能里设置备份。安卓可以备份应用程序数据、Wi-Fi密码、其他谷歌服务器的设置、照片、联系人等。 3.安装Tasker程序 如果一定要选一款彻底改变安卓体验的程序,那这款程序就是Tasker。Tasker程序可以将设备最大限度地设成自动模式。Tasker可以基于时间、地点、事件设置自动执行对应的任务。笔者不是那种常常说“在安卓平台里再也找不到比这更强大的好工具”的人,然而,这样的工具还真的就在眼下。Tasker不是免费的,但相对于2.99美元的入门价格,该应用程序为阁下的设备提供的东西是大大地物有所值。不信可以看看26000多个用户的5星级评价。Tasker确实是款5星的软件。 4.安装第三方主屏启动程序 别误会:原始(Stock)安卓自带的主屏启动程序也不错。问题是,很少几款设备用的是真正意义上的原始安卓自带的主屏启动。如果阁下不喜欢现在的主屏互动,那就安装笔者最喜欢的Nova Launcher吧。Nova提供的外观、感觉和功能组合堪称完美。Nova提供手势支持和清净的界面,各方面都好用。但如果Nova不是您的菜,坊间还有很多其他的主屏幕启动程序,总有一款会合阁下的口味的。 5.升级 如果您运行的是过时的安卓版本,请务必定期检查升级。目前,安卓的最新版本是5.1。该版本和老版本比起来简直是天壤之别。随着一次又一次的更新,安卓也越来越好。但唯一的缺陷是,有些设备是不能升级到最新版本的。如果您的安卓智能手机或平板电脑用的是过时版本,而且合同也快结束了,那就到了升级手机的时候了。如果您想最大限度地利用安卓,就要持续最新。 6.安装文件管理器 有时候您需要找一个本地文件(例如下载的文件)。这时候最好的办法就是利用文件管理器。有些设备(如老一点的三星设备)里含一个名为“我的文件”(My Files)的应用程序。“我的文件”尽管凑合能用,但功能远不如诸如Astro File Manager的文件管理器。现代移动文件管理器还涵括大量花里胡哨的东西(如SMB或蓝牙插件),但大多数情况下,用户只需在安卓目录结构里找一个文件而已。这时,如果设备安装了一个文件管理器就会省不少心。 7.设置锁屏密码保护 设置锁屏密码保护虽然不会增加功能或使得设备更强大,但这样做可以保护您的数据。设好了密码、PIN或图案锁定屏幕,可以增加有心人窥看您的数据的难度。没说的。无可争辩。没错,这样做会造成不方便。没错,现在又多了一步才能上Facebook或自拍。但是,阁下的数据最终会诚心感谢阁下。再说一遍:无可争辩。如果在家里或是在工作场所老是要输入密码太烦了,可以设置可信任地点(前提是设备是运行Lollipop的)。如此,当您处于可信任地点500英尺的范围内就无需输入密码/PIN/图案。 8.设置二次验证 接上一个话题……还是安全。皆因移动数据有不少弱点。但我们也无需在设备遗失时交出密钥俯首称臣。有密码保护的主屏有助于防止别人访问您的设备。再多走一步就可以防止别人访问令设备更强大的平台账号:谷歌。如果设置了二次验证,要进入您的谷歌帐户的唯一方法是,使用您的帐号密码和一个由谷歌身份验证器应用程序随机生成的四位数代码 。即刻设置二次验证。现在就设。 9.利用新的Gmail 如果您已经升级成Lollipop了,那就最好习惯一下Gmail应用程序,因为谷歌已经搁置原始Gmail电子邮件工具。不过没关系。Gmail的发展历史已经够长够成熟的了,给它什么东西(甚至Exchange)都能够处理。最妙的是,Gmail并没有想成为接管所有电邮的通用电子邮箱。用户现在反而只需(从屏幕左面开始)右扫屏幕就可以轻松地调出侧边栏在账户之间切换。点选在侧边栏顶部的帐户图像就可以在帐户之间进行切换。 10.切换到谷歌Hangouts 现代人花很多时间来来回回发信息。在安卓上,信息可以是手机短信、谷歌Hangouts或别的形式。要想轻松一点,就安装Hangouts应用吧,Hangouts可以将各种短信和谷歌Hangouts整合到一个优秀的工具里。Hangouts不单是一种可以在一个地方接受不同聊天形式的方法,它实际上比默认短信应用程序更优秀一些。至于谷歌为什么还没有踢走标准消息应用程序,我大概永远也搞不清楚。 原文发布时间为:2015-7-14 本文作者:孙博 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册