328程以25的过程是什么意思 c程

已有 4438 人访问
活跃用户推荐
上海隐志网络科技有限公司您的位置:
软件工程__系统流程图.doc-软件编程-文档赚钱网 15页 免费
本文一共被下载 密次,您可免费阅读和下载本文档收藏
软件工程__系统流程图.doc-软件编程-文档赚钱网
需要金币:免费
文件大小:0.43 MB
下载过该文档的会员:密
18.2? 系统流程图
系统流程图又称事务流程图,是计算机事务处理应用进行系统分析时常用的一种描述方法,借助图形符号来表示系统中各元素。它描述计算机事务处理中从数据输入开始到获得输出为止,各个处理工序的逻辑过程。
18.2.1? 系统流程图基本处理
系统流程图一般含有变换、合并、划分、分类、更新5种基本的处理。
把输入单据变换成磁盘文件,或把磁盘文件变换成输出单据,或把某一磁盘文件的内容由一个介质文件传送到另一个介质文件。
一般在进行输入变换的同时,还可对输入的数据进行形式性的逻辑检查,如数据输入错误、含有非法字符、数据类型错误等。另外一个方面,是对输入的数据结合外部文件进行合法性检查,如数据值不存在、数据值的越界等。
把多个文件合并为一个文件。
划分是合并的逆操作,将合并工序的输入文件与输出文件对调即可。
4.分类(排序)
分类(排序)是按指定的键(关键字)以升序或降序改变原文件的记录排列顺序。分类也可和输入或输出操作一起进行。
更新是将多个文件作为输入,根据关键项目进行对照,对文件内容进行修正、删除、增加等改写工作。一般更新的内容先要写入一个临时文件,在一定的工作时间后(一般在系统中都会进行说明,如一个月),为了提高系统的处理效率,一般要将该文件进行全部的清理或者部分清理。
18.2.2? 系统流程图解题要点
系统处理流程是事务之间相互关 ……由于篇幅太长,此处省略掉若干字,本内容为原始文档截取
如果要看原始文档,请。如果要原样阅读全文,请
1.文档为什么要免费下载?
有些上传了较久的文档,我们会择机挑选一部分出来供网友免费下载,以获得网友的赞誉,给网站好的评分也不失为回馈网友的一次机会。
2.网站有大概多少文档是免费的?
大概有100-300万文档是免费的。仅占整个网站的2%左右。
3.如何免费下载本文档?
你可以“点击下载”按钮即可直接下载,也可以使用鼠标右键目标另存为,也可以使用。
下载《 软件工程__系统流程图.doc-软件编程-文档赚钱网 》附件地址
你可能关注的文档
本类热门免费文档&img src=&/50/v2-b53e37bd5df2abd72406_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-b53e37bd5df2abd72406_r.jpg&&&b&“如今能玩到这类游戏,就已经是一种幸运了。”&/b&&blockquote&作者丨&a href=&/people/5cee2d90c2edc& data-hash=&5cee2d90c2edc& class=&member_mention& data-editable=&true& data-title=&@李云汉
& data-hovercard=&p$b$5cee2d90c2edc&&@李云汉&br&&/a&&/blockquote&&br&&blockquote&前不久,我们曾&a href=&/?target=http%3A///article/281647.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&撰文介绍了一款名为《影子战术:将军之刃》的游戏&i class=&icon-external&&&/i&&/a&,它由一群德国人制作,以日本幕府为背景,玩法上却继承了《盟军敢死队》的衣钵——类似《盟军》这样的潜入类即时战术游戏,在市场上已经消失了十年。那么,和前辈相比,《将军之刃》到底做了哪些继承与创新?&/blockquote&&br&&h3&&strong&丨 先从即时战术游戏说起吧&/strong&&/h3&&p&区别于即时战略游戏(RTS),即时战术游戏(RTT)最大的特点就是没有类似发展建设资源采集这样的战略要素。好的,抄百度百科的说明就到此为止,接下来我尝试举一个例子,来向没玩过《盟军敢死队》系列的玩家解释一下即时战术游戏的特色。&/p&&p&《红色警戒2》盟军战役里有一关叫做“暗夜”,在这个关卡中,玩家需要操控一个叫“谭雅”的角色(还有些间谍,但他们除了偷偷电以外不重要),在冰天雪地的东欧摧毁苏联的3座核弹发射基地。由于谭雅是个超级兵,小兵一枪一个(还不用换弹夹)、建筑一炸一栋,遇到大路上敌人多可以游泳过河,遇到磁暴线圈有间谍去偷电,遇到围墙还有贴心的苏联人在附近放一堆油桶。这个任务虽然理论上你只能操控谭雅一个人(以及一些不太重要的兵种),但过关还是相对很轻松的。&/p&&p&&img src=&/50/v2-3d023f79ca0b77aa97c4a36ce5d617b8_b.jpg& data-rawwidth=&640& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-3d023f79ca0b77aa97c4a36ce5d617b8_r.jpg&&&i&《红色警戒2》的“暗夜”任务&/i&&/p&&p&通过上面这段描述,其实即时战略与即时战术最主要的差异也就显而易见了——即时战略注重的是“建设与毁灭”,而即时战术的理念则是“定量过关”——用人话来说,前者给你基地和资源,你爱造多少兵就造多少兵,把对方打没了就胜利,而后者则是一开场就给你这么多兵,不能补充,对方把你打没了就输。&/p&&p&即时战术理清了,我们再来看潜入类的即时战术游戏。还是用上面这个《红色警戒2》的例子,不过我们要把开无双的谭雅妹子大卸八块——现在你要操控的是五个人,谭甲、谭乙、谭丙、谭丁和谭戊。谭甲别的不会,就是枪法好,一颗子弹消灭一个敌人;谭乙枪都没碰过,但是身上带着十来吨C4炸弹,遇到建筑一炸一个准;谭丙是个战五渣知识分子,只会干一些悄悄跑到敌人电站里偷电的活;其他人都是旱鸭子,但谭丁是个飞行军,可以抱着一个人游泳过河,哪怕山高水又深;谭戊眼神特别好,八百里外能一眼看穿敌人磁暴线圈上电子的运动规律。现在,你的思维必须从控制一个超人谭雅直接无双杀过去,转变为控制五个各有特长的弱鸡,思考如何合理利用他们的能力,规划战术布局,好完成相同的任务。&/p&&p&&img src=&/50/v2-c8efbca14aed2df42a7a16_b.jpg& data-rawwidth=&640& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-c8efbca14aed2df42a7a16_r.jpg&&&i&潜入类即时战术开山作《盟军敢死队》&/i&&/p&&p&因此,潜入类的即时战术相比普通的来说,有两个最重要的前提:第一是人要少,《突袭》那种直接给你一个军团几十上百号人开打的,明显就是刚正面类的即时战术;第二是把每个人的特长和弱点尽可能突出,强行要求你打配合战术,观察敌人的兵力分配,寻找合理路线潜入,各司其职进行破坏,而不是吼一句“敌羞我去脱她衣”就冲进战场开无双。&/p&&p&很多著名的即时战略、即时战术游戏都有设计这种潜入关卡让玩家转换心情,例如《英雄连》某一关就给你一支狙击手小队,要求你穿越一大片敌占区,又例如《永远的突袭》的诺曼底登陆战那一关,前期是操控一个班和大部队一起清扫海滩,后期是控制几个走散的士兵去“拯救大兵瑞恩”。但是正统地把潜入类即时战术贯彻始终、作为主线来设计的游戏,大概也只有《盟军敢死队》这个系列了吧——而随着这个系列的销声匿迹,这个流派也逐渐式微,直到十余年后的今天。&/p&&p&今天,本文的主角是《盟军敢死队》的精神续作,《影子战术:将军之刃》。&/p&&br&&br&&h3&&strong&丨 盟军??啊不,幕府敢死队&/strong&&/h3&&p&&img src=&/50/v2-848ad887dd330_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-848ad887dd330_r.jpg&&&i&用鼠标“飞檐走壁”的《刺客信条》&/i&&/p&&p&说实话,接触到这款游戏的时候,我的第一印象不是《盟军敢死队》,而是《刺客信条》,而且是只用鼠标就能玩的《刺客信条》——作为一个刺客粉,教程关里就有很多让人倍感亲切的设定:钩爪啊、跳落刺杀啊、跑酷啊以及无限吞噬尸体的黑洞型草堆——而这一切,则是以一种“点击解谜类游戏”的风格投射在屏幕上的:鼠标左键点击陆地就是走;鼠标移到可以攀爬的地方就会高亮,点击就会爬;鼠标移动到两块分割的陆地边缘就会高亮一条辅助线,点击就会跳;鼠标移到可以暗杀的敌人身上就会高亮,选好方式,点击就会杀;鼠标移到草堆上它也会高亮,点击??好吧这下要用键盘辅助一下了,按一个ctrl键,就把尸体丢进黑洞。不清楚敌人是不是看到你了?敌人会有绿色光锥的视野范围,右键点击就能看到。&/p&&p&&img src=&/50/v2-18d47dccc5bcf62b882e891_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-18d47dccc5bcf62b882e891_r.jpg&&&i&敌人绿色光锥的视野范围&/i&&br&&/p&&p&唔,虽然我之前说的是“以一种‘点击解谜类游戏’的风格”,但如果你是一位玩过《盟军敢死队》的老玩家,那你一定会发现,这一切完全就是《盟军敢死队》的忠实投影。对老玩家来说,这游戏会毫不客气地唤起你当年的记忆,当你抛出万能的D键投掷物,你会在第一时间想起以前《盟军敢死队》里万能的“香烟”,当你遇见对投掷物不敏感的“草帽敌人”的时候,相信你也一定在心中暗骂,“MD又是不抽烟的怪”??而对于初次接触潜入类即时战术游戏的玩家来说,这类游戏很明白该把玩家的精力集中在什么地方:它们绝对不会为了一些简单的跑酷动作让玩家劳神费力地操作,而是让玩家全力思考该如何绕过敌人的天罗地网,于百万军中取上将首级。即使你是笔者这样的手残,这款游戏也能让你痛快游玩。&/p&&p&&img src=&/50/v2-5effe10beaf368a124db646c452d932e_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-5effe10beaf368a124db646c452d932e_r.jpg&&&i&与时俱进的游戏引擎和还算精良的画面&/i&&/p&&p&如何评论这样一款精神续作?大抵不过四个字,“继往开来”。上面这一小段,就是《将军之刃》作为《盟军敢死队》精神续作 “继往”最直观的部分。接下来,我们来说说“开来”的部分。&/p&&p&还是先从系统上来说吧,十余年的时间,进步最大的当然是游戏的引擎。而对于潜入类游戏来说,引擎的进步不光是让游戏画面变得更有张力,而且也让游戏的玩法更??脑洞大开。&/p&&p&有这样一句话:“对玩家来说,往往有那么一个终极遗憾:相较脑洞中设想的种种创意,游戏所能提供的解决手段永远贫瘠得可怜”,近年来,不少好评游戏都在“达成路径多样化”下了足够多的功夫,《将军之刃》也不例外。&/p&&p&最简单的例子就是大量可互动物件的加入。让主角队一个个去抹敌人的脖子是个不错但却比较保守的想法,而多留意周围的环境或许会给你带来意外之喜——当你看到几位军官头上悬挂着起重机吊起的货物、在高地遇到一块松动的山石、看见屋顶的冰锥正对着敌人的头颅、甚至当你抱着沉重却又至关重要的任务物品火药桶,借由队友之间关于这些环境的对话,你会本能地知道制作组的用意何在。 &/p&&p&&img src=&/50/v2-b651299eafff1df465645_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-b651299eafff1df465645_r.jpg&&&i&直观的画面表现&/i&&/p&&p&这便是受限于落后引擎的《盟军敢死队》永远达不到的设计——让玩家的常识具象化,从而丰富游戏的通关方式和通关路线。常识告诉我们,雪地里留下的脚印会引人警觉,黑夜里点亮火把无异于大喊“我在这儿快来杀我”??这些,都让特定关卡别有一番挑战性。&/p&&p&其次我们来谈谈作为本作噱头之一的“影子战术”系统。这个系统是这样的:开启之后你可以给角色下达命令,但他们不会立刻去执行,而是等到你把所有命令都设置完毕之后,由AI操控那些角色去完成它。&/p&&p&&img src=&/50/v2-e7f59aee778eff4b8456_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-e7f59aee778eff4b8456_r.jpg&&&i&谋定而后动&/i&&/p&&p&听起来挺晕的是吧?其实说穿了,这就是个??即时战略里常见的“路径点”系统呀!玩家不能多线程同时操控几个角色,那就先让玩家在停滞的时空中完成布局,然后再让角色们跟着这个布局行动。&/p&&p&虽然在即时战略里,一般玩家不怎么会去用路径点系统,但是在潜入类即时战术游戏里,这个系统的演出效果以及其所带来的成就感可以说是满分。手残如我,一瓶清酒引来三个人的巡逻队,然后草丛里的武士和忍者瞬间暴起同时干掉打头的和垫底的敌人,塔楼上狙击手老爷子再给中间的人补上一枪,就这么简单的布局都让我感觉仿佛在看谍战剧。&/p&&p&接下来,照例把没有详解的加减分点列举一下:&/p&&br&&blockquote&++ 十三个风格各异的关卡,美工和建模真是下了一番苦功。&br&+ 剧情上有一些小转折,但也就那样吧??&br&+ 一键高亮所有可互动物品,妈妈再也不用担心我找不到路啦。&br&+ 背景音乐十分出色,仿佛你就置身于幕府时代。&br&+ 画面说不上精致,但却有一种一眼望去就让人惊呼“上帝视角就该是这种画面”的感觉;&br&&br&- 中文渣翻,我不太理解本地化公司是出于什么心态把“职员表”翻译成“排行榜”的。&br&- 画面旋转用键鼠得多熟悉一下,用手柄倒是十分流畅——喂喂你可是首发PC端的呀!&br&- 只要不在视锥里敌人就是瞎子,哪怕我和他肩并肩。《盟军敢死队》时期的老问题了。&br&- 幕府时代人手一杆冲锋枪,原来你是科技胜利流!&br&- 强迫重玩:你说徽章(可以理解为成就)怎么还有相互矛盾的达成条件呢!(类似“先与隼人一起逃跑 / 先与有希一起逃跑”,你说这不打两次怎么完成??)&/blockquote&&img src=&/50/v2-a96ac5d3a8afcb3d14e27b080fdf44a2_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/v2-a96ac5d3a8afcb3d14e27b080fdf44a2_r.jpg&&&i&游戏官方海报&/i&&br&&p&说实话,在如今这个各种老式的硬派游戏都被翻出来出续作的年代,真的有制作组盯上了潜入类即时战术游戏,我也不会觉得太惊讶。但是“盯上了”与“知道风险但还是投入了并且做出来了”之间是有天壤之别的——在某种意义上, Mimimi Productions这个德国制作组,也有一丝当年CDPR把钱全部烧光、破釜沉舟制作《猎魔人》的那种逐梦觉悟和气魄。&/p&&p&而对于玩家来说,这又何尝不是幸事呢?正如网上的评测所说:“如今能玩到这类游戏,就已经是一种幸运了。”&/p&&p&——————————&/p&&p&关注&a href=&/chuapp& class=&internal&&触乐专栏&/a&,阅读更多优质游戏文章与深度报道。&br&&/p&&p&在微信关注“触乐(chuappgame)”,发送以下关键词,阅读触乐精选优质、有趣的文章合集&/p&&p&评测 | 记录 | 盲人 | 街机 | 神游 | 纪实 | 小学生 | 人物 | 幕后 | 怀旧 | 独立游戏 | 黄油 | 非洲人 | 或者随便一个碰碰运气。&/p&
“如今能玩到这类游戏,就已经是一种幸运了。”作者丨 前不久,我们曾,它由一群德国人制作,以日本幕府为背景,玩法上却继承了《盟军敢死队》的衣钵——类似《盟军》这样的潜入类即时战术游戏,在…
&img src=&/50/v2-a2e89face31b3f0cc80533_b.jpeg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/50/v2-a2e89face31b3f0cc80533_r.jpeg&&&p&&a href=&/?target=http%3A//liukun.engineer//Android-Studio-advanced-configuration/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&原文链接&i class=&icon-external&&&/i&&/a&
作者:liukun&/p&&blockquote&&p&本文主要内容来自 Dmytro Danylyk 在 Medium 的文章Configuring Android Studio。在此感谢!虽然使用Android Studio 有一定的时间了,但文中的某几个设置之前还真不知道,且原文在长城外,因此在翻译原文的基础上作了一些补充,若有新的发现会即时更新。当然,原文中个别技巧也谈不上高级,出于对作者的尊重,仍然全部翻译了过来,希望对大家尤其是刚接触 Android Studio 的朋友有一点帮助。&/p&&/blockquote&&br&&h1&&strong&前面的话&/strong&&/h1&&br&&p&Android Studio 提供了一个非常方便的功能帮助我们导入或者导出设置。因此我们在安装一个新的 Android Studio 的时候通常会导入一个之前的设置。但是,最近发生了一件悲剧的事情-我丢失了我的设置文件(幸灾乐祸点个赞~)。&/p&&blockquote&&p&我的建议:即时的备份你的设置文件到云盘等地方。&/p&&/blockquote&&p&当我在配置我的 Android Studio 的时候,下面的一些配置技巧或许对你有一定的帮助。&/p&&br&&h1&&strong&显示行号&/strong&&/h1&&br&&p&当我首次启动我的 Android Studio 的时候,我想做的第一件事就是希望能看到文件中的行号,我一直很奇怪这个基本的配置为毛不是默认开启的?!&br&&/p&&img src=&/v2-506ff94de_b.png& data-rawwidth=&700& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-506ff94de_r.png&&&p&未显示行号&br&&/p&&img src=&/v2-31da937fde_b.png& data-rawwidth=&700& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-31da937fde_r.png&&&p&显示行号&br&&/p&&p&&strong&配置方法&/strong&&/p&&br&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | General | Appearance&br&&/p&&/li&&li&&p&勾选 Show line numbers&br&&/p&&/li&&/ul&&img src=&/v2-fd688f81a71ed310f7c5_b.png& data-rawwidth=&645& data-rawheight=&666& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&/v2-fd688f81a71ed310f7c5_r.png&&&p&设置&br&&/p&&p&ps:在编辑区域最左侧右键选中Show line numbers也可以让当前打开的文件显示行号,不过这是一个临时设置,当前文件关闭后便失效。&br&&/p&&br&&h1&&strong&驼峰选择&/strong&&/h1&&br&&p&Android 开发中,我们通常会使用驼峰命名法对变量进行命名,但是当我们通过Ctrl + Left/ Right键改变字符选择区域的时候 Android Studio 默认不支持‘驼峰’单词的选择。&br&&/p&&img src=&/v2-7ef2a15e4afa926b1142_b.jpg& data-rawwidth=&426& data-rawheight=&131& class=&origin_image zh-lightbox-thumb& width=&426& data-original=&/v2-7ef2a15e4afa926b1142_r.jpg&&&p&不支持驼峰选择&br&&/p&&p&&img src=&/v2-749ae2fd9c3e9d1d488a6ed20028ce49_b.jpg& data-rawwidth=&426& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&426& data-original=&/v2-749ae2fd9c3e9d1d488a6ed20028ce49_r.jpg&&支持驼峰选择&br&&/p&&p&&strong&配置方法&/strong&&br&&/p&&br&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | General | Smart Keys&br&&/p&&/li&&li&&p&选中 Use “CamelHumps” words&br&&/p&&/li&&/ul&&img src=&/v2-99df5a933ba7ea2a78f44dd787cbf927_b.png& data-rawwidth=&700& data-rawheight=&348& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-99df5a933ba7ea2a78f44dd787cbf927_r.png&&&p&设置&br&&/p&&p&注意:如果你仍然希望当鼠标在单词上双击之后选中整个单词,需要作如下设置:&/p&&br&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | General&br&&/p&&/li&&li&&p&取消选中 ‘Honor Camel Humps words settings when selecting on double click’&br&&/p&&/li&&/ul&&br&&br&&h1&&strong&命名前缀&/strong&&/h1&&br&&p&我们通常会遵循 Android 官方关于编码风格的指导来进行字段命名。在 Android 源码中我们可以看到通常成员变量都是以‘m’开始。其实 Android Studio 可以自动在帮我们生成字段名称的时候加上自定义的前缀,如:&br&&/p&&br&&ul&&li&&p&非共有,非静态的成员变量以’m’开始&br&&/p&&/li&&li&&p&静态成员变量以’s’开始&br&&/p&&/li&&/ul&&img src=&/v2-3bca14e25d3ffd5f9a8c2d2_b.jpg& data-rawwidth=&700& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-3bca14e25d3ffd5f9a8c2d2_r.jpg&&&p&命名前缀&br&&/p&&p&&strong&配置方法&/strong&&br&&/p&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择Editor | Code Style | Java&br&&/p&&/li&&li&&p&选择Code Generation标签&br&&/p&&/li&&li&&p&给普通Field添加一个m前缀,给Static filed添加一个s前缀&br&&/p&&/li&&/ul&&img src=&/v2-bcbb18c1b75dac923b85baf8b04b5c73_b.png& data-rawwidth=&670& data-rawheight=&328& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/v2-bcbb18c1b75dac923b85baf8b04b5c73_r.png&&&p&设置&br&&/p&&br&&h1&&strong&快速导包&/strong&&/h1&&br&&p&在 Android Studio 中,我们可以通过Alt + Enter和Control + Alt + O进行导包和清除无用导包,但我们都生活在2016年了,这些事情应当快速自动完成。&br&&/p&&img src=&/v2-b4e4491caf7ed0d34a724902ccfa7748_b.jpg& data-rawwidth=&700& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-b4e4491caf7ed0d34a724902ccfa7748_r.jpg&&&p&未开启imports on the fly&br&&/p&&img src=&/v2-84b39b31_b.jpg& data-rawwidth=&700& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-84b39b31_r.jpg&&&p&开启imports on the fly&br&&/p&&p&&strong&配置方法&/strong&&/p&&br&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | General | Auto Import&br&&/p&&/li&&li&&p&勾选 Optimize imports on the fly&br&&/p&&/li&&li&&p&勾选 Add unambiguous imports on the fly&br&&/p&&/li&&/ul&&img src=&/v2-3eb72bce5d3c578cad3ef27_b.png& data-rawwidth=&700& data-rawheight=&292& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-3eb72bce5d3c578cad3ef27_r.png&&&p&设置&br&&/p&&br&&h1&&strong&Log 颜色&/strong&&/h1&&br&&p&Darcula 主题中 Logcat 的默认配色只有红白两种颜色,不太便于我们区分 Log 的类型。&/p&&img src=&/v2-d09c3c523c30e6b8ddd0_b.png& data-rawwidth=&700& data-rawheight=&157& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-d09c3c523c30e6b8ddd0_r.png&&&p&Darcula 主题配色&br&&/p&&p&我建议大家采用之前 Android Holo 主题那种鲜明的配色。&br&&/p&&img src=&/v2-2ef3b5cafa9d3d12cc11d5acff647b34_b.png& data-rawwidth=&700& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-2ef3b5cafa9d3d12cc11d5acff647b34_r.png&&&p&Holo 主题配色&br&&/p&&p&&strong&配置方法&/strong&&/p&&br&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | Color & Fonts | Android Logcat&br&&/p&&/li&&li&&p&点击 Click on Save As…按钮创建一个新的配色 Scheme&br&&/p&&/li&&li&&p&按照下面的表格修改对应的颜色( 修改之前需要取消勾选Use inherited attributes)&br&&/p&&/li&&/ul&&img src=&/v2-4a815f4caee98ea827fe2c5_b.jpeg& data-rawwidth=&702& data-rawheight=&319& class=&origin_image zh-lightbox-thumb& width=&702& data-original=&/v2-4a815f4caee98ea827fe2c5_r.jpeg&&&br&&p&下面是个人的一些补充:&br&&/p&&br&&h1&&strong&代码配色&/strong&&/h1&&br&&p&Android Studio 中默认的代码配色个人感觉已经很和谐,但这个东西仁者见仁。比如有的朋友会觉得 java 代码中局部变量的默认的白色不太便于快速与其它代码进行区分,这时候就需要自定义 java 代码颜色,这里以局部变量为例。&/p&&img src=&/v2-811dccffbc06_b.png& data-rawwidth=&1102& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&1102& data-original=&/v2-811dccffbc06_r.png&&&br&&p&默认配色&br&&/p&&img src=&/v2-34bf5a954cde6_b.png& data-rawwidth=&1090& data-rawheight=&292& class=&origin_image zh-lightbox-thumb& width=&1090& data-original=&/v2-34bf5a954cde6_r.png&&&p&自定义配色&br&&/p&&p&&strong&配置方法&/strong&&br&&/p&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | Color & Fonts | Java&br&&/p&&/li&&li&&p&点击 Click on Save As…按钮创建一个新的配色 Scheme&br&&/p&&/li&&li&&p&展开下方的 Variables 选择 Local variable&br&&/p&&/li&&li&&p&设置右侧的 Foreground 颜色&br&&/p&&/li&&/ul&&img src=&/v2-3cb44c57c2_b.jpeg& data-rawwidth=&1240& data-rawheight=&694& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&/v2-3cb44c57c2_r.jpeg&&&p&设置&br&&/p&&br&&h1&&strong&工程模板&/strong&&/h1&&br&&p&Android Studio 创建Module时并没有将 Android 开发中常用的文件目录全部生成,比如默认只生成了一个drawable文件夹,常用的drawable-hdpi等文件夹需要我们自己创建。正如前文的作者所言,这都2016年了,这些事情应该自动完成,毕竟我们都很‘懒’!&br&&/p&&img src=&/v2-d59ec7bb7b21eb7fba6ad7e_b.png& data-rawwidth=&610& data-rawheight=&676& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&/v2-d59ec7bb7b21eb7fba6ad7e_r.png&&&p&默认结构&br&&/p&&img src=&/v2-05407dba7d97b76566beaea_b.png& data-rawwidth=&602& data-rawheight=&842& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&/v2-05407dba7d97b76566beaea_r.png&&&p&自定义结构&br&&/p&&p&&strong&配置方法1&/strong&&br&&/p&&ul&&li&&p&进入 Android Studio 安装目录&br&&/p&&/li&&li&&p&依次进入plugins | android | lib | templates | gradle-projects | NewAndroidModule | root | res&br&&/p&&/li&&li&&p&在res文件夹下创建drawable-hdpi等文件夹(可选:从对应的mipmap文件夹中拷贝iclauncher.png到创建的drawable文件夹中)&br&&/p&&/li&&li&&p&回到NewAndroidModule目录,用编辑器打开recipe.xml.ftl文件&br&&/p&&/li&&li&&p&加入以下配置&br&&/p&&/li&&/ul&&img src=&/v2-c1edfed098a1a0c8beb5d71de7634291_b.png& data-rawwidth=&1240& data-rawheight=&1196& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&/v2-c1edfed098a1a0c8beb5d71de7634291_r.png&&&p&&strong&配置方法2&/strong&&/p&&br&&ul&&li&&p&进入 Android Studio 安装目录&br&&/p&&/li&&li&&p&依次进入plugins | android | lib | templates | gradle-projects | NewAndroidModule&br&&/p&&/li&&li&&p&用编辑器打开recipe.xml.ftl文件,并加入以下配置&br&&/p&&/li&&/ul&&img src=&/v2-6af61ebb20df98ea3ea59_b.png& data-rawwidth=&1240& data-rawheight=&1196& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&/v2-6af61ebb20df98ea3ea59_r.png&&&p&这两种方法的区别是,第一种方式可以在文件夹中加入相应的图片,但是配置稍显繁琐,第二种方式配置简单,但是只能创建目录,不能包含默认图片。&/p&&p&当然,通过类似的方式我们还可以在创建Module的时候做很多事情,比如:&/p&&br&&ul&&li&&p&在 colors.xml 文件中生成常用颜色&br&&/p&&/li&&li&&p&在 build.gradle 文件中生成自定义配置&br&&/p&&/li&&li&&p&在 .gitignore 文件中生成自定义忽略配置&br&&/p&&/li&&li&&p&等等…&br&&/p&&/li&&/ul&&br&&br&&h1&&strong&活动模板&/strong&&/h1&&br&&p&Android Studio 中默认提供了很多非常方便的活动模板(Live Templates),例如,我们输入sout后按enter键,Android Studio 会自动帮我们写入System.out.println();&/p&&img src=&/v2-2327740cdab46f37f1fe50_b.jpg& data-rawwidth=&465& data-rawheight=&163& class=&origin_image zh-lightbox-thumb& width=&465& data-original=&/v2-2327740cdab46f37f1fe50_r.jpg&&&br&&p&其实 sout 就是 AS 自带的一个活动模板。&br&&/p&&img src=&/v2-aa1ac1a5f74e749dfaf8cea3e90f463f_b.jpeg& data-rawwidth=&1240& data-rawheight=&698& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&/v2-aa1ac1a5f74e749dfaf8cea3e90f463f_r.jpeg&&&p&由此可以看出,活动模板就是我们常用代码的一个缩写。开发中有很多代码都会重复出现,因此自定义合适的活动模板能很大程度上避免我们很多重复的体力劳动。那么问题来了,如何自定义?这里我们以Handler为例。下面是在Activity中一个合格的Handler该有的样子:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&private static class MyHandler extends Handler {
private WeakReference&MainActivity& activityWeakR
public MyHandler(MainActivity activity) {
activityWeakReference = new WeakReference&MainActivity&(activity);
public void handleMessage(Message msg) {
MainActivity activity = activityWeakReference.get();
if (activity != null) {
&/code&&/pre&&/div&&br&&p&至于原因我就不再重复了,网上有太多的文章有讲过。现在如果我只希望输入一个‘psh’就自动出现上面这段代码的话,我应该这么做:&br&&/p&&br&&p&&strong&配置方法&/strong&&/p&&ul&&li&&p&File | Settings 打开设置&br&&/p&&/li&&li&&p&选择 Editor | Code Style | Live Templates&br&&/p&&/li&&li&&p&点击最右侧的加号并选择 Template Group&br&&/p&&/li&&li&&p&在弹出的对话框中输入一个活动模板分组的名称,如 custom&br&&/p&&/li&&li&&p&在左侧选中上一步中创建的 custom 分组,点击右边的加号&br&&/p&&/li&&li&&p&选择Live Template,在Abbreviation中对输入psh&br&&/p&&/li&&li&&p&在Description中输入这个活动模板的描述&br&&/p&&/li&&li&&p&在Template text中输入以下代码&br&&/p&&/li&&/ul&&img src=&/v2-f8adac1beb882ba53132f2bca3034a70_b.jpeg& data-rawwidth=&1188& data-rawheight=&520& class=&origin_image zh-lightbox-thumb& width=&1188& data-original=&/v2-f8adac1beb882ba53132f2bca3034a70_r.jpeg&&&br&&ul&&li&&p&点击下方的Define按钮,选中java表示这个模板用于java代码&br&&/p&&/li&&li&&p&点击右侧的Edit variables&br&&/p&&/li&&li&&p&选择Expression下拉框中的className并勾选Skip if…&/p&&/li&&/ul&&blockquote&&p&这个操作的作用是,AS会自动将我们在上一步中用’$’符包裹的 className自动替换为当前类不含包名的类名&/p&&/blockquote&&ul&&li&&p&点击 Apply 和 Ok 让设置生效。&/p&&/li&&/ul&&p&至此,一个我们自定义的custom模板组中的psh活动模板就定义完成了。下面我们来验证一下,见证奇迹的时候到了:&/p&&p&&img src=&/v2-c180f74fa43aa418f8b485105add195c_b.jpg& data-rawwidth=&650& data-rawheight=&373& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&/v2-c180f74fa43aa418f8b485105add195c_r.jpg&&&a href=&/?target=http%3A//liukun.engineer//Android-Studio-advanced-configuration/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阅读原文&i class=&icon-external&&&/i&&/a&&img src=&/v2-7a67d9a26c61e830c7aa48c6b12c317b_b.jpeg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/v2-7a67d9a26c61e830c7aa48c6b12c317b_r.jpeg&&&/p&
作者:liukun本文主要内容来自 Dmytro Danylyk 在 Medium 的文章Configuring Android Studio。在此感谢!虽然使用Android Studio 有一定的时间了,但文中的某几个设置之前还真不知道,且原文在长城外,因此在翻译原文的基础上作了一些补充,若有新…
&img src=&/50/v2-70d0e7518a2aabfb4bc6ccaad5401c1c_b.jpg& data-rawwidth=&1613& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1613& data-original=&/50/v2-70d0e7518a2aabfb4bc6ccaad5401c1c_r.jpg&&&blockquote&&ul&&li&原文地址:&a href=&/?target=https%3A///google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2%23.k0s1s1kgl& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Making the most of the APK analyzer&i class=&icon-external&&&/i&&/a&&/li&&li&原文作者:&a href=&/?target=https%3A///%40wkalicinski& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wojtek Kaliciński&i class=&icon-external&&&/i&&/a&&/li&&li&译文出自:&a href=&/?target=https%3A///xitu/gold-miner& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&掘金翻译计划&i class=&icon-external&&&/i&&/a&&/li&&li&译者:&a href=&/?target=https%3A///XHShirley& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&XHShirley&i class=&icon-external&&&/i&&/a&&/li&&li&校对者:&a href=&/?target=https%3A///phxnirvana& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&phxnirvana&i class=&icon-external&&&/i&&/a&, &a href=&/?target=https%3A///ZiXYu& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZiXYu&i class=&icon-external&&&/i&&/a&&/li&&/ul&&/blockquote&&p&最近的 Android Studio 插件中我最喜欢的是 APK Analyzer。你可以从顶端菜单栏中的 &strong&Build&/strong& 找到 &strong&Analyze APK&/strong&。&br&&/p&&p&&img src=&/v2-37cceccf91cb7efb3a62f_b.png& data-rawwidth=&712& data-rawheight=&401& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&/v2-37cceccf91cb7efb3a62f_r.png&&专业提示:你也可以拖拽 APK 文件到编辑栏中打开。&/p&&p&APK Analyzer 让你可以打开并审查存于你电脑中的 APK 文件的内容,不管它是通过本地 Android Studio 工程构建,还是需要从服务器上或者其他构件仓库中构建后得到的。它不需要必须要在任何你所打开的 Android Studio 项目中被构建,甚至也不需要它的源代码。&/p&&blockquote&&p&&strong&注意:&/strong&APK Analyzer 最好用于发布版本的构建。如果你需要分析你 app 的调试版本,确认你的 APK 不是通过 Instant Run 构建出来的。如果想要确认这一点,你可以在顶部菜单栏点击 &strong&Build&/strong& → &strong&Build APK&/strong&,通过查看 instant-run.zip 文件是否存在,来确认你是否打开了通过 Instant Run 构建 APK。&/p&&/blockquote&&p&使用 APK analyzer 是一个非常好的途径来查找 APK 文件并了解它们的&a href=&/?target=https%3A///topic/performance/reduce-apk-size.html%23apk-structure& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&结构&i class=&icon-external&&&/i&&/a&,并同时在发布前或调试时验证一些常见问题,例如 APK 大小和 DEX 问题。&/p&&h3&利用 APK Analyzer 为应用“瘦身”&/h3&&p&APK analyzer 在应用大小方面可以给你很多有用并且可操作的信息。在屏幕的顶部,你可以从 &strong&Raw File Size&/strong& 看到应用占磁盘大小。&strong&Download size&/strong& 是一个估计值,表示考虑到在经过 Play Store 的压缩后,你还需要多少流量来下载应用。&/p&&p&文件和文件夹根据文件大小降序排列。这让我们很容易看出对 APK 大小优化最容易从哪里入手。每当你深入到某个文件夹的时候,你能看到占用了 APK 大部分空间的资源和其他实体。&/p&&p&&img src=&/v2-9ee7c14fe697ea59a49920_b.png& data-rawwidth=&800& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-9ee7c14fe697ea59a49920_r.png&&资源根据文件大小以降序的方式排列。&/p&&p&在此例中,在检查一个 APK 是否可能减小大小时,我马上注意到在我们的 drawable 资源中最大的东西是一个 1.5 MB 的 3 帧 PNG 动画,并且这只是一个 &strong&xxhdpi&/strong& 的分辨率啊!&/p&&p&显然这些图片都非常适合用向量来储存,所以我们使用 Android Studio 2.2里 &a href=&/?target=https%3A///studio/write/vector-asset-studio.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&向量资源导入工具新的 PSD 支持功能&i class=&icon-external&&&/i&&/a&,找到对应图片的资源文件并把它们作为 VectorDrawable 引用&/p&&p&对其他剩余的动画 (&strong&instruction_touch*&/strong&.png)&em& 重复这个步骤直到把所有分辨率文件夹里的 PNG 文件都移除,那么我们就能节省 5MB 的空间。我们使用支持库中的 [_VectorDrawableCompat&/em&](&a href=&/?target=https%3A///%40chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/@chrisbanes/&/span&&span class=&invisible&&appcompat-v23-2-age-of-the-vectors-91cbafa87c88&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&) 来保持向前兼容。&/p&&p&我们同样也容易发现,在其他的资源文件中,一些没有被压缩的 &strong&WAV&/strong& 文件可以被转换成 &strong&OGG&/strong& 文件。这意味着我们不用动一行代码就可以节省更多的空间。&/p&&p&&img src=&/v2-80ea1cc85300_b.png& data-rawwidth=&483& data-rawheight=&272& class=&origin_image zh-lightbox-thumb& width=&483& data-original=&/v2-80ea1cc85300_r.png&&浏览 APK 里的其它文件夹&/p&&p&接下来要检查的是包含了我们支持的3个 ABI 的本地库, &strong&lib/&/strong& 文件夹,&/p&&p&我们决定用 Gradle 构建里的 &a href=&/?target=https%3A///studio/build/configure-apk-splits.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&APK 分离支持&i class=&icon-external&&&/i&&/a& 为每个 ABI 各创建一个版本。&/p&&p&我快速浏览了一遍 AndroidManifest.xml 并发现缺少 &a href=&/?target=https%3A///reference/android/R.attr.html%23extractNativeLibs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android:extractNativeLibs&i class=&icon-external&&&/i&&/a& 属性。把它设置为 &strong&false&/strong& 可以节省一点设备上的空间,因为它能阻止把本地库从 APK 拷贝到文件系统上。唯一的要求是文件已经经过整理并且未压缩地存于 APK 里。这个功能仅在高于 2.2.0 版本的 Android Gradle 插件中使用。&/p&&p&&img src=&/v2-81f3b9ee226b89dcecdfabb_b.png& data-rawwidth=&594& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&/v2-81f3b9ee226b89dcecdfabb_r.png&&在 APK Analyzer 中浏览到的整个 AndroidManifest.xml 文件&/p&&p&做完这些修改,我想知道现在的新版本跟旧版本对比有什么不同。我切换到我最开始提交的地方,编译 APK 并保存在别的文件夹。然后,我用 &strong&Compare with…&/strong& 功能查看新版本和旧版本的大小差异。&/p&&p&&img src=&/v2-c4b36de6e595a052c666ba0b48a923ee_b.png& data-rawwidth=&800& data-rawheight=&481& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-c4b36de6e595a052c666ba0b48a923ee_r.png&&APK 对比 - 右上角按钮&/p&&p&可以看到,我们对资源和本地库的修改取得了很大的成效,只用很少的更改节省了 17MB 的总大小。但是,我们的 DEX 却增加了 400KB。&/p&&h3&调试 DEX 增大的问题&/h3&&p&在这个例子中,大小的差异来源于升级我们的依赖到最新的版本并且添加了新的库。我们已经使用了 &a href=&/?target=https%3A///studio/build/shrink-code.html%23shrink-code& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Proguard&i class=&icon-external&&&/i&&/a& 和 &a href=&/?target=https%3A///studio/build/multidex.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Multidex&i class=&icon-external&&&/i&&/a& 来构建,所以我们无法再对 DEX 的大小做更多修改。但 APK analyzer 仍然是调试这些配置的利器,特别是当你在工程中第一次开启 Multidex 或者 Proguard。&/p&&p&&img src=&/v2-ba3dacb12d0c7f0d1ed564d34001b26b_b.png& data-rawwidth=&716& data-rawheight=&269& class=&origin_image zh-lightbox-thumb& width=&716& data-original=&/v2-ba3dacb12d0c7f0d1ed564d34001b26b_r.png&&探索 classes.dex 的内容&/p&&p&当你点击任何 DEX 文件,你可以看到一个含有多少类和方法被定义,以及它包含的总引用数(引用数不包括在单个 DEX 文件的 &a href=&/?target=https%3A///studio/build/multidex.html%23about& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&64K 限制&i class=&icon-external&&&/i&&/a&里)的总结。在示例的截屏中,应用程序刚好达到限制,这意味着它马上将需要 MultiDex 去分离类到不同的文件中。&/p&&p&你可以深入到包里查看到底是谁使用了这些引用。在本例中,支持库和 Google Play 服务是造成这个情况的主要原因:&/p&&p&&img src=&/v2-4b88ada1a_b.png& data-rawwidth=&800& data-rawheight=&426& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-4b88ada1a_r.png&&每个包的引用数&/p&&p&一旦你启用了 MultiDex 并编译你的应用,你会发现第二个 DEX 文件,classes2.dex(还可能有第三个 classes3.dex 或者更多)。Android gradle 插件会找出启动应用所需的类文件,并把它们放在主要的 classes.dex 文件。但是也有极少情况,它不能识别这些文件,并抛出 ClassNotFoundException 的错误。这种情况下,你可以用 APK analyzer 去检查 DEX 文件,然后&a href=&/?target=http%3A//google.github.io/android-gradle-dsl/2.2/com.android.build.gradle.internal.dsl.ProductFlavor.html%23com.android.build.gradle.internal.dsl.ProductFlavor%3AmultiDexKeepFile& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&强制把缺少的类放进主要的 DEX 文件&i class=&icon-external&&&/i&&/a&.&/p&&p&当你开启了 Proguard 并且利用反射或者在 XML 布局中调用类或方法,你会遇到类似的问题。APK Analyzer 可以帮助你验证你的 Proguard 的配置是否正确,比如查看你需要的方法或类是否在 APK 中存在或者它们是否被重命名(混淆)。你可以确定你不需要的类是不是被移除了,且没有占用之前说的引用方法数。&/p&&p&我们真的非常想知道你所知道的 APK Analyzer 的其它功能以及你期待这个工具还应该具备怎么样的功能!&/p&&br&
原文地址:原文作者:译文出自:译者:校对者:, 最近的 Android Studio 插件中我最喜欢的是 APK Analyzer。你可以从顶端菜单栏中的 Build 找到 Analyze APK。 …
这个问题就算没人邀请,我也一定要答。有一次和公司一个美术扯皮,最后他竟然威胁我说:“我画个圈圈诅咒你!”我立马反击道:“我写个程序,画一大坨圈圈诅咒你!而且我还会用N种方法画。”&br&&br&(1)第一种方法&br&写个循环,循环中随机生成一个圈圈的圆心坐标位置、半径。然后判断圈圈是否与已有的圈圈发生碰撞。如果有碰撞让它滚蛋,否则画圈圈。&br&&br&(2)第二种方法&br&还是写个循环,循环中随机生成一个圈圈的圆心坐标位置,然后判断这个坐标点是否在已有的圈圈内部,如果是就让它滚蛋,否则计算出与它到距离最近圈圈的距离,并以此画圈圈。&br&&br&(3)第三种方法&br&有时需要将一堆指定半径的圈圈,无碰撞的放置在某一空间中。这就需要一套物理碰撞算法,感觉很难,不要怕,圈圈之间的碰撞检测是所有碰撞检测中最容易的。碰到这一情况,首先要找到一个中心点,然后将所有的圈圈按照与该中心点的距离远近进行排序,依次将每一个圈圈朝向党中心靠近,最后实现大和谐。&br&这种方法中需要克服的一个难点是,如何实现三个圈圈的两两相碰。解决这一问题,需要用到一个数学公式:余弦定理,已知三角形的三边长度,求三个角度。这算是我在实际编程中用过最高深的数学知识之一。&br&我写的一个小游戏:&a class=& wrap external& href=&///?target=http%3A///WhyEngine/p/3424131.html& target=&_blank& rel=&nofollow noreferrer&&连泡泡&i class=&icon-external&&&/i&&/a&用的就是这一方法。&br&&img src=&/v2-02b8aeccd2b45e602b2627_b.jpg& data-rawwidth=&1321& data-rawheight=&767& class=&origin_image zh-lightbox-thumb& width=&1321& data-original=&/v2-02b8aeccd2b45e602b2627_r.jpg&&&img src=&/v2-63d07fbd565b16c4f7ee8e95cb82cfaa_b.jpg& data-rawwidth=&1321& data-rawheight=&767& class=&origin_image zh-lightbox-thumb& width=&1321& data-original=&/v2-63d07fbd565b16c4f7ee8e95cb82cfaa_r.jpg&&鼠标左键拖动泡泡到另一个与之相同颜色的泡泡旁边,松开鼠标左键,两个泡泡就会自动合并。将所有相同颜色的泡泡连到一块即过关。挺无聊的一个游戏,玩多了容易得强迫症。&br&&br&(4)第四种方法&br&让所有圈圈围向一个中心,这样太过集中,体现了独裁专制,这政治不正确吗。有时可能只是想让圈圈放到一个大框里。这时的处理方式和前一个类似,只是修改一下圈圈的排序方式,让圈圈按照朝向某一方向的远近进行排序,并且朝着该方向移动。&br&我还写过两个更无聊的小游戏:&br&&a class=& wrap external& href=&///?target=http%3A///WhyEngine/p/3573318.html& target=&_blank& rel=&nofollow noreferrer&&掐&i class=&icon-external&&&/i&&/a&&a class=& wrap external& href=&///?target=http%3A///WhyEngine/p/3573318.html& target=&_blank& rel=&nofollow noreferrer&&泡&i class=&icon-external&&&/i&&/a&&a class=& wrap external& href=&///?target=http%3A///WhyEngine/p/3573318.html& target=&_blank& rel=&nofollow noreferrer&&泡&i class=&icon-external&&&/i&&/a&,在这个游戏中场景中含有若干个大小颜色不同的泡泡,同色泡泡碰撞后会合并成一个大点的泡泡,当泡泡大到一定程度后会破裂消失。泡泡会不停变多,鼠标也需要不停地点击泡泡。当泡泡挤到最下方时,游戏结束。&br&&img src=&/v2-d31ee5fd15d7072bf1fdecc5_b.png& data-rawwidth=&885& data-rawheight=&916& class=&origin_image zh-lightbox-thumb& width=&885& data-original=&/v2-d31ee5fd15d7072bf1fdecc5_r.png&&&a class=& wrap external& href=&///?target=http%3A///WhyEngine/p/3571189.html& target=&_blank& rel=&nofollow noreferrer&&打泡泡&i class=&icon-external&&&/i&&/a&,和上个游戏类似,场景中含有若干个大小颜色不同的泡泡,界面下方可以发射不同颜色的泡泡,击中同色泡泡后会与之合并成一个大点的泡泡,当泡泡大到一定程度后会破裂消失。同样,当泡泡挤到最下方时,游戏结束。&br&&img src=&/v2-0949dfe2a34fc79f80f3_b.png& data-rawwidth=&755& data-rawheight=&933& class=&origin_image zh-lightbox-thumb& width=&755& data-original=&/v2-0949dfe2a34fc79f80f3_r.png&&&br&(5)第五种方法&br&前四种方法,每添加一个圈圈时,都需要遍历已有圈圈判断是否与之碰撞。当圈圈数目增大时,效率不高啊。第五种方法可以轻松画出大规模的圈圈:&br&先以固定步长生成规则的正方形网格点;&br&然后对网格点进行随机移动,移动距离不要超过固定步长;&br&移动后的网格点为圈圈的圆心;&br&计算出每一个网格点与其周围8个网格点的最近距离;&br&最近距离的一半为圈圈的半径;&br&画圈圈,就这么简单搞定。&br&发一下该算法的C代码:&br&&div class=&highlight&&&pre&&code class=&language-text&&inline void hash22(float px, float py, float& hx, float& hy)
float n = sinf(px * 7.0f + py * 157.0f);
hx = hx - floorf(hx);
hy = hy - floorf(hy);
// 查找最近的相邻顶点
nearest_dis_2d(float x, float y)
hash22(x, y, ox, oy); // 当前顶点偏移
float d, r = 2.0f;
for(int i = -1; i &= 1; i++)
for(int j = -1; j &= 1; j++)
if (i == 0 && j == 0)
hash22(i + x, j + y, vx, vy);
vx += float(i) -
vy += float(j) -
d = vx*vx + vy*
if (d & r)
return sqrtf(r);
// 使用worley画圈圈
circle_worley2d(float x, float y)
float fx = floorf(x);
float fy = floorf(y);
float gx = x -
float gy = y -
float d, r = 3.0f;
for(int i = -1; i &= 1; i++)
for(int j = -1; j &= 1; j++)
hash22(i + fx, j + fy, vx, vy);
vx += float(i) -
vy += float(j) -
d = vx*vx + vy*
if (d & r)
d = sqrtf(r) / nearest_dis_2d(si, sj) * 2.0f;
&/code&&/pre&&/div&代码中调用函数circle_worley2d,输入是平面上的一个二维坐标,返回值为1时,表示该坐标位于圆上。用上面的代码可以生成如下图像:&br&&img src=&/v2-57ffac1ef36e6faa922c2e_b.png& data-rawwidth=&1024& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-57ffac1ef36e6faa922c2e_r.png&&&img src=&/v2-849f6f9e14c9b69dff1aeea_b.png& data-rawwidth=&1024& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-849f6f9e14c9b69dff1aeea_r.png&&虽然这种方法对空间的利用率并不高,但它的运算复杂度与圈圈的数目无关。&br&&br&(6)第六种方法:&br&上一种方法中,float
circle_worley2d(float x, float y)函数,可以很容易地改成三维的&br&float circle_worley3d(float x, float y, float z)。&br&用三维的可以生成空间中若干个互相不重叠的球,如下图所示:&br&&img src=&/v2-b3cc9d2aaae30b13527e35_b.png& data-rawwidth=&1207& data-rawheight=&701& class=&origin_image zh-lightbox-thumb& width=&1207& data-original=&/v2-b3cc9d2aaae30b13527e35_r.png&&并且利用circle_worley3d函数可以实现球面上画圈圈:&br&&img src=&/v2-8c15afa27c460d81bd79b8_b.jpg& data-rawwidth=&641& data-rawheight=&574& class=&origin_image zh-lightbox-thumb& width=&641& data-original=&/v2-8c15afa27c460d81bd79b8_r.jpg&&&img src=&/v2-e146d44daf3cc_b.jpg& data-rawwidth=&625& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&625& data-original=&/v2-e146d44daf3cc_r.jpg&&当然,扩展到三维后的circle_worley3d函数,可以在任意一个三维图形上画圈圈。下图为将许多圈圈画在一个圈圈上:&br&&img src=&/v2-9d7a30c4decf81_b.jpg& data-rawwidth=&832& data-rawheight=&611& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&/v2-9d7a30c4decf81_r.jpg&&&br&&br&(7)终极圈圈诅咒&br&球面上画圈圈有什么用处呢?可以生成陨石坑。&br&将生成圈圈的算法迭代个若干次,就能生成一个布满陨石坑的星球:&br&&img src=&/v2-741f53598e4eabff4ec64a_b.png& data-rawwidth=&800& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-741f53598e4eabff4ec64a_r.png&&不过这个球不是我做的,生成它的代码在:&a href=&///?target=https%3A///view/MtjGRD& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Shadertoy&i class=&icon-external&&&/i&&/a&.&br&我生成的球是这样:&br&&img src=&/v2-52b7bc83ad8_b.jpg& data-rawwidth=&699& data-rawheight=&633& class=&origin_image zh-lightbox-thumb& width=&699& data-original=&/v2-52b7bc83ad8_r.jpg&&&img src=&/v2-8acde6bf360dd41f0efb64_b.jpg& data-rawwidth=&654& data-rawheight=&633& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&/v2-8acde6bf360dd41f0efb64_r.jpg&&当我看到这个星球时,有一种强烈的冲动:把这个球从显示器中拿出来,然后砸在某人脸上。这滋味想想就觉得酸爽。
这个问题就算没人邀请,我也一定要答。有一次和公司一个美术扯皮,最后他竟然威胁我说:“我画个圈圈诅咒你!”我立马反击道:“我写个程序,画一大坨圈圈诅咒你!而且我还会用N种方法画。” (1)第一种方法 写个循环,循环中随机生成一个圈圈的圆心坐标位…
&img src=&/50/v2-f66acbf361_b.jpg& data-rawwidth=&580& data-rawheight=&426& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/50/v2-f66acbf361_r.jpg&&&blockquote&原答案&a href=&/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/question/5297&/span&&span class=&invisible&&6889/answer/&/span&&span class=&ellipsis&&&/span&&/a&&/blockquote&&br&“每次改bug都只靠蒙”这个是很多编程入门的初学者都会遇到的问题——这篇文章将会对如何进行调试,做一个比较浅显的入门介绍。虽然你看完这篇文章之后,不见得就能一下子找到bug在哪,但是至少可以做到有的放矢,不至于完全只能随缘。&br&&br&对程序进行调试,一个最基本的思路,就是二分法——类似于算法中的二分查找,对于一个程序来说,其bug大多数情况下都只是集中在一个子模块里,我们通过二分法,&b&不断地把程序一分为二,排查缩小可能有问题的地方&/b&,这样一来调试的效率就比起“随缘法”和遍历法就高多了。&br&&br&这里使用Visual Studio 2015调试一个C++程序作为例子——其他语言和环境的方法是差不多的。如图所示:&br&&img src=&/v2-9035edaae9523a09fae78e1effb4193a_b.png& data-rawwidth=&495& data-rawheight=&798& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/v2-9035edaae9523a09fae78e1effb4193a_r.png&&然后这个程序运行的时候会炸:&br&&img src=&/v2-1c47f44ab104dfef94304_b.png& data-rawwidth=&993& data-rawheight=&519& class=&origin_image zh-lightbox-thumb& width=&993& data-original=&/v2-1c47f44ab104dfef94304_r.png&&这个时候我们就需要使用分治法来判断,程序到底是哪个部分出了问题了——这里我们采用一种虽然看起来“大力出奇迹”,十分简单粗暴,但是实际上却很有效,适用范围极广的方法:输出法。&br&比如对于上面这个程序,我们要判断程序里的两个for循环,到底是哪个出了问题——这个时候我们就可以通过添加一些额外的输出语句,作为标记。&br&比如对于上面的程序,我们可以在第16行添加以下代码:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&n&&cout&/span&&span class=&o&&&&&/span&&span class=&s&&&part 1 finished&&/span&&span class=&o&&&&&/span&&span class=&n&&endl&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&然后运行的结果就是这样:&br&&img src=&/v2-29ffc16aaee_b.png& data-rawwidth=&993& data-rawheight=&519& class=&origin_image zh-lightbox-thumb& width=&993& data-original=&/v2-29ffc16aaee_r.png&&我们可以看到,在炸之前,程序成功输出了这行标记——这就意味着,仅针对这个例子来看,第十六行之前的代码是没有问题的。进一步讲,如果程序逻辑更加复杂的话,你还可以输出特定的某些变量的值,看看这个变量的值是不是符合预期的。&br&这个时候,我们把注意力放在16行之后的代码上——对于如此小的代码块,我们已经可以直接用肉眼进行查错了。C++基础比较好的同学可以直接看出,这是一个典型的访问越界错误,向量v1现在只有n个元素,因此v1[n]是不存在的(大多数语言的数组索引都是左闭右开的,v1的最后一个元素索引是n-1),访问这个元素自然就会报错。&br&把i&=n的等号去掉,这个时候程序便能正确运行了:&br&&img src=&/v2-17ce142a8d840de67cded1_b.png& data-rawwidth=&1113& data-rawheight=&762& class=&origin_image zh-lightbox-thumb& width=&1113& data-original=&/v2-17ce142a8d840de67cded1_r.png&&这种方法,不光适用于CLI程序,GUI程序也可以。比如用C#写WinForm的话,就是这样:&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&MessageBox.Show(&输出&);
&/code&&/pre&&/div&这样就可以输出你要的内容了——可以是一个标记,也可以是特定变量的值。&br&&br&当然,这种“大力出奇迹”的办法,只是权宜之计——接下来将会介绍如何使用调试器。&br&&br&首先让我们明确一个概念——“断点”。所谓“断点”是调试器提供的一个功能之一,它可以让你的程序执行到某个步骤的时候停下来,进入中断模式。此时程序既不会被终止,也不会继续执行——接下来你就可以通过调试器,控制程序的执行过程了。&br&这里我们还是以C++和Visual Studio 2015为例进行说明——&b&其他语言和其他环境都是类似的(虽然调试器可能不怎么好用),万变不离其宗&/b&。&br&&br&还是上面那个程序,在第十六行代码左边点一下,如图所示:&br&&img src=&/v2-e6a63dffec704e_b.png& data-rawwidth=&656& data-rawheight=&794& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/v2-e6a63dffec704e_r.png&&点击运行,然后输入数字,接下来你就会看到程序停在了断点处:&br&&img src=&/v2-e21cce5fbbd2a5c9564e53_b.png& data-rawwidth=&1326& data-rawheight=&918& class=&origin_image zh-lightbox-thumb& width=&1326& data-original=&/v2-e21cce5fbbd2a5c9564e53_r.png&&于是我们可以得出跟之前一样的结论——第十六行之前的程序是没有问题的。&br&接下来,点击“继续”,就可以让程序直接执行到下一个断点处(断点可以加不止一个),或者直接结束——同时,工具栏上有两个按钮,可以控制程序一步一步地往下运行,这样就可以更加精确地确认哪里有bug。&br&这篇先讲这些——关于调试器的更多功能,之后再介绍……&br&调试器一共有三个最为核心的功能:&b&单步调试、查看变量的值,以及查看调用栈&/b&。接下来将会对这三个功能,逐一进行介绍。&br&&br&首先让我们来看下查看变量的值——还是上面那个程序,点击放大,可以看到我们已经在下方的“局部变量”窗口,看到一些变量的值了。比如说,这里我们能看到n的值为10&br&&br&不光是简单变量,Visual Studio还允许我们查看更为复杂的成员变量的值——比如说,这里我们建立了一个vector,然后将0-9这10个数字都添加了进去。这个时候,我们直接点击旁边的箭头,就可以展开v1:&br&&img src=&/v2-b063bde8e632f41fbf9e516dc27799f1_b.png& data-rawwidth=&1016& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&/v2-b063bde8e632f41fbf9e516dc27799f1_r.png&&这个时候,我们可以看到,展开之后,我们可以看到v1的详细信息——包括容量(capacity,这里我们可以看到STL默认分配了稍微大一点的空间),以及其中每一个元素的值。而我们自己定义的数组arr,因为还没有new,所以还不能访问。&br&&br&接下来,让我们把注意力放到上方的工具栏:&br&&img src=&/v2-2fd5e6ccd959a31d4e73_b.png& data-rawwidth=&714& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&714& data-original=&/v2-2fd5e6ccd959a31d4e73_r.png&&Visual Studio提供了两个不同的按钮——逐过程(右侧)和逐语句(左侧)。所谓“逐过程”指的是如果接下来要执行的语句是一个函数(或者对象的成员)的话,那就直接执行整个函数,只看返回结果,而“逐语句”指的则是直接进入函数/对象的体内。因此,需要注意的是,&b&如果某个语句使用了标准库的某些方法或者运算符重载的话,那就不要使用“逐语句”,不然会钻进标准库的代码里,没有意义。&/b&&br&&img src=&/v2-14a9ee35e655df_b.png& data-rawwidth=&808& data-rawheight=&515& class=&origin_image zh-lightbox-thumb& width=&808& data-original=&/v2-14a9ee35e655df_r.png&&可以看到,这是钻进了VC的库提供的new运算符的定义里。&br&&br&灵活利用单步调试功能,可以让你即使是不能直接用肉眼看出,也可以用“笨办法”找出bug——比如说,对于这个例子,我们使用单步调试,如下图所示:&br&&img src=&/v2-456ecf56c4bc7babb2bf99_b.png& data-rawwidth=&791& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&791& data-original=&/v2-456ecf56c4bc7babb2bf99_r.png&&现在循环体已经执行完了10轮,此时i=9,我们继续执行:&br&&img src=&/v2-92eb2f66a8f16a99de7c_b.png& data-rawwidth=&621& data-rawheight=&349& class=&origin_image zh-lightbox-thumb& width=&621& data-original=&/v2-92eb2f66a8f16a99de7c_r.png&&现在i变成10了,接下来一步就是执行赋值操作了,再往下走一步:&br&&img src=&/v2-0dd1cdd392c846cd7fde6c221a91f550_b.png& data-rawwidth=&478& data-rawheight=&375& class=&origin_image zh-lightbox-thumb& width=&478& data-original=&/v2-0dd1cdd392c846cd7fde6c221a91f550_r.png&&现在我们已经可以精确定位到具体是哪一步出了错,修改起来自然就容易多了。&br&另外,初学者使用VS做练习的时候,经常会出现一个问题——VS的程序执行完之后,命令行窗口就直接消失了,看不到输出结果。利用调试功能,我们也可以有一个非常简单而又没有额外影响的方法来解决这个问题:把断点打在return 0;上——这样一来,当程序的主体部分完全执行完毕之后,就会自动停在结束前的最后一步(return 0;),然后你就可以看到完整的输出结果了。&br&&br&最后让我们来看一下函数调用栈查看功能的使用——首先,你要懂得什么是函数调用栈,这里我就不再废话了,不懂的直接去上我的课:&a href=&/?target=https%3A///course/cs112& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 程序设计 - 课程 - 计蒜客&i class=&icon-external&&&/i&&/a&&br&&br&我们直接用这个图来举例——这是一个用递归法求阶乘的函数:&br&&img src=&/v2-b2c35dfff6d1cfdfb98ce343dd3854e7_b.jpg& data-rawwidth=&600& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-b2c35dfff6d1cfdfb98ce343dd3854e7_r.jpg&&代码如下——我们直接停在fac(1)这一步:&br&&img src=&/v2-5e83b20cf6c03b87889f_b.png& data-rawwidth=&1322& data-rawheight=&875& class=&origin_image zh-lightbox-thumb& width=&1322& data-original=&/v2-5e83b20cf6c03b87889f_r.png&&注意看右下角的调用堆栈窗口,我们可以看到现在调用栈里只有一个main()函数。然后继续往下执行,选择“逐语句”:&br&&img src=&/v2-baea6451_b.png& data-rawwidth=&424& data-rawheight=&217& class=&origin_image zh-lightbox-thumb& width=&424& data-original=&/v2-baea6451_r.png&&&br&我们可以看到,有一个fac已经被放进了调用栈里——继续向下走:&br&&img src=&/v2-3b315a56def58bb311bf45bdd4ff540c_b.png& data-rawwidth=&619& data-rawheight=&209& class=&origin_image zh-lightbox-thumb& width=&619& data-original=&/v2-3b315a56def58bb311bf45bdd4ff540c_r.png&&又有一个被放了进去——接下来该返回了:&br&&img src=&/v2-89af6e4ce06ef29cb56d58f0_b.png& data-rawwidth=&1174& data-rawheight=&422& class=&origin_image zh-lightbox-thumb& width=&1174& data-original=&/v2-89af6e4ce06ef29cb56d58f0_r.png&&&br&一目了然。&br&&br&这些就是调试器最为主要的三个功能——对于其他语言和其他环境(例如gdb),虽然具体细节有所不同,但是核心的思路都是一样的,万变不离其宗。&br&以上就是这篇文章的主要内容——很惭愧,做了一点微小的贡献,谢谢大家。
原答案 “每次改bug都只靠蒙”这个是很多编程入门的初学者都会遇到的问题——这篇文章将会对如何进行调试,做一个比较浅显的入门介绍。虽然你看完这篇文章之后,不见得就能一下子找到bug在哪,但是至少可以做到有的放矢,不至于完全只…
&p&302个赞了,谢谢。&/p&&p&闲来无事,更新一波:&/p&&p&1. Layout Inspector,看布局信息的:&/p&&br&&img src=&/v2-78ae1e326f240e9ec5ff36e_b.png& data-rawwidth=&692& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&/v2-78ae1e326f240e9ec5ff36e_r.png&&&p&2. 移出多余资源文件,之前在视频里也讲过,就是用Inspect Code里面的 Android Lint 去找 unused resources,但是那个方法不能自动移出子工程的资源和无用的id等。下面这个方法更简单,而且可以用于子工程:&/p&&p&在任意目录下右键 - Refactor - Remove Unused Resources....就好&/p&&img src=&/v2-0cb3bc38d2baee59cf833a8d_b.png& data-rawwidth=&1504& data-rawheight=&1218& class=&origin_image zh-lightbox-thumb& width=&1504& data-original=&/v2-0cb3bc38d2baee59cf833a8d_r.png&&&br&&p&下面是之前的回答&/p&&p&===================================================================已经有了29个支持了,我深受鼓舞啊,于是做了个系列视频,一共分三部,就叫《Android Studio使用技巧大全》&/p&&a class=&video-box& href=&///?target=https%3A///%3Ftarget%3Dhttp%253A///v_show/id_XMTQ3Njk1ODM5Mg%253D%253D.html%253Ff%253D& target=&_blank& data-video-id=&& data-video-playable=&false& data-name=&Android Studio 技巧大全& data-poster=&/C84F706A0A45045B8DDDEF& data-lens-id=&&&
&img class=&thumbnail& src=&/C84F706A0A45045B8DDDEF&&&span class=&content&&
&span class=&title&&Android Studio 技巧大全&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&/?target=http%3A///v_show/id_XMTQ3Njk1ODM5Mg%3D%3D.html%3Ff%3D&/span&
&/a&&br&&p&欢迎批评指正,也欢迎打赏!&/p&&p&下面是之前的回答
===================================================================&/p&&p&1. 在布局文件中抽取 style :光标位于目标控件中 - 右键 - Refactor - Extract - Style&/p&&img src=&/40fe4b626967cdfa9461fbc8a262f973_b.png& data-rawwidth=&1972& data-rawheight=&998& class=&origin_image zh-lightbox-thumb& width=&1972& data-original=&/40fe4b626967cdfa9461fbc8a262f973_r.png&&&br&&p&然后给抽取的style命名就好了(放心,它默认不抽取id):&/p&&img src=&/1f8be699b1ced29dccb72_b.png& data-rawwidth=&1016& data-rawheight=&714& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&/1f8be699b1ced29dccb72_r.png&&&br&&br&&p&2. 分多个窗口:&/p&&img src=&/aef883effb89885b70cba_b.png& data-rawwidth=&3358& data-rawheight=&1960& class=&origin_image zh-lightbox-thumb& width=&3358& data-original=&/aef883effb89885b70cba_r.png&&&br&&br&&p&3. 列编辑 - Edit - Column Selection Mode,最好设置成快捷键。
如果你只用它来选择文本就太小用它了,用于编辑的时候更强大:对很多格式相同但每个具体的元素长度不同的行,可以用列编辑把光标指向许多行最开始的一列,然后用alt或驼峰跳跃(或+shift)到目标元素那一列,这时候每一行选择的列数都可以是不一样的,很多时候这样编辑起来更方便。&/p&&br&&p&4. Annotate 标注每一行是git哪个用户那个版本什么时候提交的:&/p&&p&对着行号右边空白处右键 - Annotate&/p&&img src=&/ecf21c85fd06ae_b.png& data-rawwidth=&456& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&456& data-original=&/ecf21c85fd06ae_r.png&&&p&然后就可以显示出来了:&/p&&img src=&/6c7a41ec5ea_b.png& data-rawwidth=&544& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&/6c7a41ec5ea_r.png&&&p&鼠标放上去能显示这个commit的相关信息:&/p&&img src=&/287cfcb0b0f77f96b94a_b.png& data-rawwidth=&1220& data-rawheight=&160& class=&origin_image zh-lightbox-thumb& width=&1220& data-original=&/287cfcb0b0f77f96b94a_r.png&&&p&点击其中一个条目可以显示那个commit的提交信息:&/p&&img src=&/ff3d39dcfb203de601c131dfd0d724c5_b.png& data-rawwidth=&926& data-rawheight=&1124& class=&origin_image zh-lightbox-thumb& width=&926& data-original=&/ff3d39dcfb203de601c131dfd0d724c5_r.png&&&p&点击Show Diff可以显示选中的文件在那一次commit的修改,这一点很实用。&/p&&br&&p&5. 左下方的Version Control集成了版本控制(支持Git、svn...):&/p&&img src=&/477f79f0e47e7679f78c_b.png& data-rawwidth=&682& data-rawheight=&98& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&/477f79f0e47e7679f78c_r.png&&&img src=&/cbb051914faa3fa55c45e737_b.png& data-rawwidth=&3276& data-rawheight=&1196& class=&origin_image zh-lightbox-thumb& width=&3276& data-original=&/cbb051914faa3fa55c45e737_r.png&&&br&&br&&p&6. 集成了终端Terminal:&/p&&img src=&/dcf2667caabef19cd373058c_b.png& data-rawwidth=&1752& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&1752& data-original=&/dcf2667caabef19cd373058c_r.png&&&br&&br&&p&7. 集成了代码分析(包含Lint)&/p&&img src=&/edd6d0d564ea0e52dcb595_b.png& data-rawwidth=&574& data-rawheight=&688& class=&origin_image zh-lightbox-thumb& width=&574& data-original=&/edd6d0d564ea0e52dcb595_r.png&&&img src=&/bcbb1cccd12b81c00f582076_b.png& data-rawwidth=&1518& data-rawheight=&770& class=&origin_image zh-lightbox-thumb& width=&1518& data-original=&/bcbb1cccd12b81c00f582076_r.png&&&p&如果想光跑Android Lint可以点击Inspection profile右边的三个点...,把除了Android Lint之外的其他分析选项去掉,专门制作成一个profile:&/p&&img src=&/8eebafba3d424c8c0aaf0_b.png& data-rawwidth=&1448& data-rawheight=&1268& class=&origin_image zh-lightbox-thumb& width=&1448& data-original=&/8eebafba3d424c8c0aaf0_r.png&&&img src=&/7d9e3b4c5ca2f3b4edae_b.png& data-rawwidth=&1518& data-rawheight=&770& class=&origin_image zh-lightbox-thumb& width=&1518& data-original=&/7d9e3b4c5ca2f3b4edae_r.png&&&br&&p&PS: Android Lint 是官方的Android代码分析工具,可以分析出各种冗余资源、不规范的翻译、格式错误等等,优化项目必备良药。&/p&&br&&p&8. 集成bug追踪系统&/p&&img src=&/367a5f5a5d1b352db0c158d96088c94a_b.png& data-rawwidth=&1090& data-rawheight=&566& class=&origin_image zh-lightbox-thumb& width=&1090& data-original=&/367a5f5a5d1b352db0c158d96088c94a_r.png&&&img src=&/de222cfc04a7_b.png& data-rawwidth=&1184& data-rawheight=&1184& class=&origin_image zh-lightbox-thumb& width=&1184& data-original=&/de222cfc04a7_r.png&&&img src=&/30b9d0e20d0aa0fc64df1ac3a7f39543_b.png& data-rawwidth=&1188& data-rawheight=&1062& class=&origin_image zh-lightbox-thumb& width=&1188& data-original=&/30b9d0e20d0aa0fc64df1ac3a7f39543_r.png&&&p&可以支持各种bug管理系统:Trac, Redmine等等,配置一下服务器地址用户名密码什么的就可以了,当然所配置的系统也要安装相应的插件,嗯,没有bugfree,因为bugfree挫爆了。
然后(理论上)就可以愉快地在Android Studio上关bug了,妈妈再也不用担心我多开一个Chrome会浪费多少内存。(这个功能我还没试过,因为公司用bugfree...)&/p&&p&9. 修改方法签名&/p&&p&右键方法声明的地方&/p&&img src=&/870f205a36a5d28af218f_b.jpg& data-rawwidth=&1752& data-rawheight=&1874& class=&origin_image zh-lightbox-thumb& width=&1752& data-original=&/870f205a36a5d28af218f_r.jpg&&&p&选择Change Signature&/p&&img src=&/a1f1c4e897cfadcf50a46b_b.png& data-rawwidth=&1160& data-rawheight=&1538& class=&origin_image zh-lightbox-thumb& width=&1160& data-original=&/a1f1c4e897cfadcf50a46b_r.png&&&p&这里可以修改签名的各种属性,点那个+号可以添加参数,设置它的类型、名称、默认值,点击向上和向下箭头可以调整参数的顺序,最后点击下面的Refactor确定修改,修改可以作用于所有调用这个方法的地方,这样就不用一个一个手动修改了:)&/p&&p&10. 自动实现Parcelable接口&/p&&p&可以利用插件实现,下载这个插件:&/p&&img src=&/a328d341e186fb6f2c6a3c_b.png& data-rawwidth=&2074& data-rawheight=&1346& class=&origin_image zh-lightbox-thumb& width=&2074& data-original=&/a328d341e186fb6f2c6a3c_r.png&&&p&然后右键代码空白处,选择Generate:&/p&&img src=&/178c96a347f558aafdc710c_b.png& data-rawwidth=&550& data-rawheight=&968& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/178c96a347f558aafdc710c_r.png&&&p&选择Parcelable:&/p&&img src=&/4a0dfa9124ecd280efd95e_b.png& data-rawwidth=&732& data-rawheight=&678& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&/4a0dfa9124ecd280efd95e_r.png&&&p&搞定。
还可以下载生成拷贝构造函数的plugin:GenerateCopyConstructor
当然默认的已经可以Generate各种方法了:构造方法、Getter&Setter...&/p&&p&欢迎下载我的Android Studio自定义的编辑器颜色配置&/p&&p&预览:&/p&&img src=&/v2-2fac74eb4107_b.jpg& data-rawwidth=&1040& data-rawheight=&1112& class=&origin_image zh-lightbox-thumb& width=&1040& data-original=&/v2-2fac74eb4107_r.jpg&&&a href=&///?target=https%3A///s/1miJWGzQ& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/s/1miJWGz&/span&&span class=&invisible&&Q&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&p& 更新:&/p&&ul&&li&在 Tomorrow Night 的基础上的修改,命名为 Tomorrow Twilight。&/li&&li&改走了性冷淡风(体现了作者隐忍的特质)。&/li&&li&思路还是用多个颜色标注不同性质的变量(体现了作者闷骚的性格)。&/li&&li&基于 Language Defaults,而不是只改了 Java,Java 里面能用到 Language Defaults 的都用了,专属的语言特征字段也专门配色做了区分。&/li&&li&Android Logcat 和 IDE 集成的命令行界面等等也对应做了修改。&/li&&/ul&&br&&p&导入方式:&/p&&p&File - Import Settings - 选择 android_studio_settings_editor_color.jar - 勾选 Editor Colors,Mac用户可以尝试勾选 Keymap - OK
&/p&&p&设置方式(Mac):&/p&&p&Preferences... - Editor - Colors & Fonts - 右面版的Scheme -
Tomorrow Twilight - OK&/p&&p&为了体现本次更新的重大意义,特意加入如下“B格爆满的说明”:&/p&&br&&br&&br&&br&&br&&br&&br&&br&&br&&p&以上。&/p&
302个赞了,谢谢。闲来无事,更新一波:1. Layout Inspector,看布局信息的: 2. 移出多余资源文件,之前在视频里也讲过,就是用Inspect Code里面的 Android Lint 去找 unused resources,但是那个方法不能自动移出子工程的资源和无用的id等。下面这个方法更…
&b&呵呵。&/b&
&img src=&/50/v2-62a6f7cc9ed334ddf066aecdf880cf1c_b.jpg& data-rawwidth=&495& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/50/v2-62a6f7cc9ed334ddf066aecdf880cf1c_r.jpg&&&p&这篇文章是2年前翻译的,发表在伯乐翻译小组,曾经在微博上被大量转发、收藏,所以这里拿过来再次和大家分享一下。原文地址:&a href=&/?target=http%3A///blog/learning-path-data-science-python/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&learning-path-data-science-python&i class=&icon-external&&&/i&&/a&。&/p&&p&从Python菜鸟到Python Kaggler的旅程(译注:&a href=&/?target=https%3A//http///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kaggle&i class=&icon-external&&&/i&&/a&是一个数据建模和数据分析竞赛平台)&/p&&p&假如你想成为一个数据科学家,或者已经是数据科学家的你想扩展你的技能,那么你已经来对地方了。本文的目的就是给数据分析方面的Python新手提供一个完整的学习路径。该路径提供了你需要学习的利用Python进行数据分析的所有步骤的完整概述。如果你已经有一些相关的背景知识,或者你不需要路径中的所有内容,你可以随意调整你自己的学习路径,并且让大家知道你是如何调整的。&/p&&p&&strong&步骤0:热身&/strong&&/p&&p&开始学习旅程之前,先回答第一个问题:为什么使用Python?或者,Python如何发挥作用?&br&观看DataRobot创始人Jeremy在PyCon Ukraine 2014上的&a href=&/?target=https%3A///watch%3Fv%3DCoxjADZHUQA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&30分钟演讲&i class=&icon-external&&&/i&&/a&,来了解Python是多么的有用。&/p&&p&&strong&步骤1:设置你的机器环境&/strong&&/p&&p&现在你已经决心要好好学习了,也是时候设置你的机器环境了。最简单的方法就是从&a href=&/?target=http%3A//Continuum.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&Continuum.io&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&上下载&a href=&/?target=https%3A//store.continuum.io/cshop/anaconda/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&分发包Anaconda&i class=&icon-external&&&/i&&/a&。Anaconda将你以后可能会用到的大部分的东西进行了打包。采用这个方法的主要缺点是,即使可能已经有了可用的底层库的更新,你仍然需要等待Continuum去更新Anaconda包。当然如果你是一个初学者,这应该没什么问题。&/p&&p&如果你在安装过程中遇到任何问题,你可以在&a href=&/?target=http%3A///blog/getting-up-and-running-with-python/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&i class=&icon-external&&&/i&&/a&找到不同操作系统下更详细的安装说明。&/p&&p&&strong&步骤2:学习Python语言的基础知识&/strong&&/p&&p&你应该先去了解Python语言的基础知识、库和数据结构。Codecademy上的&a href=&/?target=http%3A///tracks/python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python课程&i class=&icon-external&&&/i&&/a&是你最好的选择之一。完成这个课程后,你就能轻松的利用Python写一些小脚本,同时也能理解Python中的类和对象。&/p&&p&具体学习内容:列表Lists,元组Tuples,字典Dictionaries,列表推导式,字典推导式。&br&任务:解决HackerRank上的一些Python教程题,这些题能让你更好的用Python脚本的方式去思考问题。&br&替代资源:如果你不喜欢交互编码这种学习方式,你也可以学习&a href=&/?target=https%3A///edu/python/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&谷歌的Python课程&i class=&icon-external&&&/i&&/a&。这个2天的课程系列不但包含前边提到的Python知识,还包含了一些后边将要讨论的东西。&/p&&p&&strong&步骤3:学习Python语言中的正则表达式&/strong&&/p&&p&你会经常用到正则表达式来进行数据清理,尤其是当你处理文本数据的时候。学习正则表达式的最好方法是参加&a href=&/?target=https%3A///edu/python/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&谷歌的Python课程&i class=&icon-external&&&/i&&/a&,它会让你能更容易的使用正则表达式。&/p&&p&任务:做关于&a href=&/?target=https%3A///edu/python/exercises/baby-names& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&小孩名字的正则表达式练习&i class=&icon-external&&&/i&&/a&。&/p&&p&如果你还需要更多的练习,你可以参与这个&a href=&/?target=http%3A///blog/2014/11/text-data-cleaning-steps-python/& class=& wra

我要回帖

更多关于 金属切削过程是什么 的文章

 

随机推荐