【我与慕课的红娘—Android】
第一次接触Android就是从慕课网开始的。
那时候刚刚学完java的基本知识,会用Swing写几个小的窗口程序,凭着一股子刚学完一门新知识的激动与好奇的劲儿,就想着开发一个漂亮又实用的小软件。但因为可重用的组件不多,对于独立开发者来说, 想用Swing开发出一个客户端,应该是比较困难的。
在当时国内介绍的Android入门书籍还不多,版本也比较落后。有一次看到同学正在看慕课网的视频,才知道有这么一个免费学习知识的网站。其实以学习视频的方式来入门一项技术或者一门学科是比较好的选择,因为再没有比跟着视频动手完成一件项目更方便、简易,而且能带给人满满成就感的学习方法了——纸质书的作者虽然也会列出完成这个项目的每个步骤,然而他有可能会忽略一些在他看来十分简单的小细节,这些小细节正是打击初学者激情和好奇的罪魁祸首。
言归正传,通过慕课网的Android工程师计划,我开始一步一步的学习如何在手机上编写APP,边看视频边自己跟着码代码。这也是我的老师告诉我的方法:千万别认为自己能看懂的代码就是自己已经熟练掌握了的,也千万别认为自己看不懂的代码敲到电脑上也无济于事——无论如何都要自己写一遍。无数次编译错误和运行异常告诉我,在脑子里能运行代码在计算机上不一定能真正运行:有可能是计算机的环境跟老师的不相同(版本问题永远是程序员心中的痛);也有可能是自己码代码的时候有笔误,而且这种错误是会重复出现的,直到你记住并改变自己的书写习惯为止;还有可能是代码本身有逻辑上的错误——书上和视频上的代码真的是正确的么?它们肯定没有经过严格的黑白盒测试,也许一个特殊的测试用例就能使整个程序crash掉。程序crash时一大堆红色的堆栈异常信息总是看的人头疼,这也许就是漫漫编程路上出现的一个个小Boss吧。
以前慕课网没有问答区时,我只能把错误信息复制到网上,然后期待有别人也遇到相同的问题,或者把问题发到CSDN等论坛上希望有人能帮助自己。不过这样针对性不强,实时性也不够,要知道回答问题的人不一定就看过这个视频或者做过类似的项目,所以解答如何处理这种错误信息的最好人选不一定是专家,而应该是有过类似经验的先行者。所以慕课网推出问答区后,能有一个这样自由交流经验的地方确实是一件让人愉快而庆幸的事。第二天打开慕课网,慕女神就会亲切地发来提示信息:“嗨,你提的问题有人回答啦!”让我每次对打开慕课都有一种莫名的兴奋感。而且,那么多小伙伴和自己一块儿学习,并且经常帮助自己,让枯燥的学习也变得有趣味了许多。
其实网上也有很多类似的发布教学视频和有讨论组的网站,但我总是对这些网站的首页上大大的广告:“3个月让你成为XXX工程师,月薪10k-20k”很不感兴趣。也许是先入为主的观念,我一直很赞同Paul Graham对黑客(这里是指致力于编写优美软件的程序员)观点—— “黑客为了解决生计问题,会找一份‘白天工作’(day job),然后在其余时间开发优美的软件。”在我看来这些网站无非就是解决你的day job(前提是你还得有金钱投入),对于正在上大学的我而言,还是在这段“业余时间”好好做一点自己喜欢的事吧。
【心得与体验】
前面提到过,代码一定要自己写一遍,否则你以为你懂了,到真的需要码代码的时候就会傻眼。正好我有个APP的小创意,于是,我把它作为我的“练习器”——新学的UI模板定义方法,滑动效果,ImageButton,文字滚动效果……哈哈哈,通通给它用上,好似不会打扮的爸爸把所有发卡都别在女儿头上,这也是一种莫名的幸福感啊。此外,自己在编程实践中使用过的代码和遇到的bug,都能帮助自己更好的理解代码、理解编程。深以为,自己的第一份代码正是最好的学习资料。带着深情,以及把编程当成艺术的态度,在最原始的代码基础上,精雕细琢,不断优化,使之简洁、优美、流畅……这种不断进步的感觉,该是多么美妙啊!
出乎我意料的是,慕课网居然还设置了笔记区,我也饶有兴味地看了大家的笔记。仔细一思考,写笔记不就是对所学知识的再现吗?这是一种很重要的理论学习方法。尤其对视频内容抽象、归纳与总结的过程,帮助了我们记忆,甚至某种程度上帮助我们理解。可是,笔记中也不乏“灌水”的,复制粘贴别人的笔记发表,莫非是为攒积分?这样反倒本末倒置了。不论笔记多么简单雷同、千篇一律,自己码的总是更有用一些。有敷衍了事的,却也有认真有心的。我在笔记区也看到有小伙伴写的笔记,竟然是老师所授知识的拓展,甚至举一反三。看客看了之后,也感到似乎对该主题理解更深了一些,利人利己。而值得推崇的,就是这种有心人的态度,这种主动学习的精神。我心里暗暗感到佩服,同时也鼓励自己也做一个有心人。
前面提到,错误是程序员路上遇到的小Boss,但是错误提示可以起到指明debug思路的作用,也能真正的增长debug经验;此外,善于查阅安卓的帮助文档难道不是一项很棒的技能?我觉得,大概初学者都不会想到这个办法,而是直接百度搜索或者网站提问吧!事实上我觉得,帮助文档应该是最好的教材了。
除此之外,慕课网还有博客区。看到丰富的文章列表,我不禁感叹,知识真是浩如烟海!这也燃起我的满满斗志——要学的还有很多很多呢!而慕课网,又是一个可以不断探索其神奇功能的学习网站。
【你们要的“干货”】
在自己的应用的Activity中调用相机的Activity,Intent是处理问题核心,步骤如下:
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
MainActivity.this.startActivityForResult(camera, CAMERA);
在这里使用Intent的方式跟以前有所不同,如果我们需要打开一个特定的Activity,那可以使用
Intent camera = new Intent(this,XXActivity.class);
但是在这里我们的需求是打开照相机即可,我们希望系统中的照相机能响应这个Intent,所以Intent中的Action就是用来告诉系统这个需求,系统会自动找到相应的Activity并打开(通过Activity标签的Action标签进行匹配)
同样,调用系统相册也是这个道理:
Intent photo = new Intent();
photo.setAction(Intent.ACTION_PICK);
photo.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
MainActivity.this.startActivityForResult(photo, PHOTO);
响应Intent的应用完成工作后,发起调用的Activity(这里是MainActivity)的onActivityResult方法就会被调用,返回的数据同样是封装在这个方法的Intent参数中。在这里需要注意的是怎么得到这个Intent中的数据,相册直接返回了Uri格式的被选择图片的地址,我们需要通过ContentResolver来得到这个Bitmap。
//从中得到MainActivity传过来的Uri
Uri selectImage = this.getIntent().getData();
//把MediaStore.Images.Me``````封装到了String数组中
filePathColumns = new String[]{MediaStore.Images.Media.DATA};
//请求系统根据Uri查询图片位置,第一个参数Uri就是图片地址,后面的是过滤器,意思是只查询.img类型的图片
c = this.getContentResolver().query(selectImage, filePathColumns, null, null, null);
if (c != null) {
//这句不能少, Cursor游标默认是指向第0行的,直接get数据得不到,得让他移动到第1行
c.moveToFirst();
}
//显示出图片来
showImage(c);
而相机则是直接返回封装在Bundle中的Bitmap,因而比通过ContentResolver去查询要简单多了
Bundle bundle = photo.getExtras();
//获取返回的数据,并转换为图片格式
Bitmap bitmap = (Bitmap) bundle.get("data");
总结:调用系统相机相册是一个比较好的学习例子,涉及到Android的四大组件中的Activity, ContentProvider,还有Intent的使用方法。后面我们还做了些扩展,通过学习慕课网的自定义View视频使用了可支持双指缩放的ImageView来显示相机回传的图片,通过File流在本地保存照好的相片。
共同学习,写下你的评论
评论加载中...
作者其他优质文章