应用开发_android应用开发 - CSDN
  • 给菜鸟看的Android应用开发全流程

    万次阅读 多人点赞 2011-08-31 22:17:02
    给菜鸟看的Android应用开发全流程——好多Android开发中,没人告诉过你的事  很多菜鸟开始学习Android开发,去网上搜集过很多“Android开发教程”,但是搜索出来的东西,如果不是特别针对性的关键词,基本上内容都...
     
    

    给菜鸟看的Android应用开发全流程——好多Android开发中,没人告诉过你的事

            很多菜鸟开始学习Android开发,去网上搜集过很多“Android开发教程”,但是搜索出来的东西,如果不是特别针对性的关键词,基本上内容都是:环境配置-工具安装-第一个Hello Android项目-项目结构、文件作用-布局-控件-……等等涉及具体开发内容的文章,最后打包发布了事;且不说这些文章又有一大半都是互相转载来转载去,单看内容,大部分都是讲具体功能实现手段,或者某个API怎么用,然而很多细节可能虽然确实很简单,却往往令菜鸟迷惑头痛不已……唉,我当年不堪回首的岁月啊!虽然这些问题可能日后看来是小意思,但当初一个菜鸟可能根本不知道这个问题的存在,更不用说用什么词去搜索;所以虽然这些问题可能也是有专门文章讲,但菜鸟们根本不知道这个关键字啊~~~~

            本人靠着一本书+网上各种搜,现在总算能完成一个完整的Android开发流程。回头看看,总结一下这些经验,即给自己加深印象,也帮助后来的菜鸟,也是功德无量啊

            话说本人半路出家,编程水平实在一般,所以此文重点在流程,至于技术细节和各种实现功能的技巧,还是专门搜索专业的文章吧,不过想必彼时已经能够知道自己想要什么了,那些问题也就不算个事了。

            该流程基本是本人的经验总结,未必是完全官方和教科书式的。不过虽然不一定是最好的解决办法,但起码都走得通,替后来人排除一些弯路。如果有幸被大牛看到此文,还请对不妥之处不吝赐教,哪怕路过留个名也好啊~

    一、准备工作

    1.    技能储备

              1)    Java

         重要程度:

         当然是掌握的越多越好,毕竟Android就是用Java语言来开发的。遇到很多没有Java基础的朋友问:要想直接学AndroidJava应该掌握到什么程度?个人认为,如果一个熟练的Java程序员技能算100分的话,掌握到40-50分,基本开发Android不会有语言上的太大障碍了。其实主要也就是Java的类、继承、接口、IOXML解析等这些基本的操作掌握了也就可以开始用Android开发些简单应用了。话说我一个朋友完全没有Java基础,直接上手开发Android,没几天也就能写出个应用,虽然他是个C++C#高手……编程这玩意很多东西都是相通的,基本的搞明白了,再学学Java特有的也就算入门了。不过还是强烈建议——掌握的越多越好

            不过也不用摸不着头脑,太刻意去学,没目标抱着本《Java编程思想》学也不见得有多大效果。自己动手做个Android小应用,遇到问题了回头再针对性的去学Java。我这个半吊子也是这样,开发Android时,经常碰到一些Java比较基础的类的使用,但当时没弄明白,所以需要回头专门再看看。

             2)      XML

        重要程度:★★★★

               Android开发中很重要的一类文件,也是一种标记语言,与平台和编程语言无关,所以一般用来保存和传递各种数据、参数。在Android中,很多配置信息、数据存储,尤其是Android界面,要大量的和xml打交道。虽然很重要,但其实并不复杂,找些基本教程看看,明白xml结构和语法特点也就基本够用了。(这里顺便强烈推荐新手一个入门网站:http://www.w3school.com.cn/,简洁,全面,有力!没有多余的废话,页面干净无广告!……最主要我觉得有一定的权威性,作为XML等学习的入门网站和查询工具很有用)

             3)      数据库

        重要程度:★★★

              Android要保存数据,经常使用内置的SQLite数据库,可以使用SQL查询语言操作。所以如果有数据库使用经验,这个就简单多了。如果没接触过,就了解一些基本的SQL语句:增加、删除、修改、查询。

              4)     Dos

        重要程度:★★

        这个,貌似也谈不上掌握了,会操作就行了,因为之前碰到几个哥们,确实连cddir等一点dos操作都不会用,这就稍微麻烦点了,因为无论一开始配置java,还是最后生成签名,当然还有很多场合会需要在Dos环境操作,虽然可能有部分操作已经有图像界面替代了,但还是稍微看看吧,起码很酷么~~

              5)     Linux

        重要程度:★

        好像不应该是“重要程度”,应该是会使用程度吧。Android本身是基于Linux内核开发,说不重要可能会被拍唉。

            主要就是会一些基本的linux命令,su,sh,cd什么的,后期调试Android程序可能会用到,比如查看SQLite数据。也不用特意去学,需要的时候网上现找找,多用几次也就记住了。

    2.    工具准备

          1)    Eclipse

       最强大的Java开发工具,安装Android开发插件后可以方便快速的开发和调试Android程序。

          2)  Android SDK

            Android开发工具包,包括核心APIAVDAndroid虚拟设备)等,可以到Android官网下载。具体安装配置就不多写了,网上很多,我再引用这文章写成书了……

        参考:http://android.tgbus.com/Android/tutorial/200812/171154.shtml

             3)    Java SDK

              Java工具包,包括JDKJRE,可到Java官网下载。

        安装,配置环境变量。

        参考:http://blog.csdn.net/huanghm88/article/details/3965218(很全,一般到path和classpath设置完就ok了)

             4)     其他

              FireWorks:用于编辑png图片,Android中主要的图片格式。纯粹个人喜好,有其他图片编辑工具也行。

    3.    文档资料

             1)     一本纸质书

        最好有本入门的纸质书,毕竟写的质量比较好的书能够尽量全部的涵盖Android开发各个方面,对新手很有帮助。

        说下我当时看的吧:《深入浅出Google Android》,人民邮电出版的,不过很老了,09年的,还是基于Android API1.5。

             2)     API文档

              Java APIAndroid API,重要的查询手册。不能上传附件,这个搜一下吧,很多。

    二、开发

     1.     建立项目

        在Eclipse中新建一个Android项目,基本流程是:新建项目,选择Android Project,然后输入package名、应用名和Activity名,选择Android Api版本。

        菜鸟提示package,包名,一般的命名规则是尽量独一无二,方便区分和管理,所以一般比较规范的命名都是公司域名的倒写,比如google的包,google域名是google.com,所以包名是:com.google.*

    2.    基本开发流程

              1)    构思布局,用xml构建基本的布局和控件

              2)     java程序,实体化xml的布局、控件、实现业务逻辑。

          菜鸟提示:很多控件既可以在xml文件中设定各种属性,也可以在java文件中设定属性;通常如果需要动态的改变某些属性,比如setText(),则需要在java中实现,这也是非常常用的,比如按下按键,按键颜色变深等等。

              3)     运行,调试程序:即可以使用Android模拟器调试,也可以通过数据线,直接接手机调试。提示:如果是用模拟器调试,调试后需要修改程序再次调试时,不需要关闭模拟器,直接再次运行就可以。

             4)    美化、找图片:菜鸟提示Android标准图标根据手机分辨率不同,分别有36*36/48*48/72*72这三种尺寸,你会看到drawable-hdpi/drawable-ldpi/drawable-mdpi不同的目录用来存储不同尺寸的图标,在AndroidManifest.xml中只需要写@drawable/icon就可以,它会根据屏幕分辨率去找不同目录下的图标。(参考:http://zl4393753.iteye.com/blog/1056785

             5)    关于应用中的文字等引用资源:重点说说文字吧,应用中比如菜单名字,标题等,既可以直接写在java文件中,也可先写在res/values/strings.xml文件里。不过呢,还是强烈建议,尽量都写在strings.xml文件里,这样以后要修改文字,直接改这个文件就行,否则在java程序里找可费了大劲了,尤其是要开发多语言版本的话,所有文字全部要改成外语,当然还是在strings.xml里写方便的多。养成个好习惯,不要嫌麻烦,Android系统里专门弄这么个文件是有道理的。

             6)     最后,切记切记,修改AndroidManifest.xml文件,修改版本信息,加上需要的各种权限,如发送短信,访问网络等等,否则程序发布了,很多相关功能没法用。

    三、打包发布

          每次发布前都是最激动人心的时刻啊~然而这部分网上很少有专门讲的(也许我手拙没找到),针对这部分我还专门到开发论坛发布了很多帖子提问,时至今日,除了同样困扰的菜鸟帮顶,无人回答……鄙视一下。也正因如此,动了写这篇文章的念头,Android开发,很多东西简单,但是从没有人和你说过~

    1.  加入广告

             我们很多开发的应用,最终目的是发布到网上给大家用,如果顺便能有收入也是我们的一项劳动成果,虽然很多很惨淡(又是我不堪回首的过去啊)。

             1)   选择广告平台:常用的有GoogleAdMob,国内的有:有米,微云等等,至于说哪个效果最好,众说纷纭,最好还是自己亲自试试。还有一种平台是各种广告平台的集成,能根据使用者优化,动态选择。但因为某些电子市场不允许这个,我就没用,也就暂时不点名了,想试试的,百度……(我没说是第一个哈~)。

                     不过呢,最好固定一两个效果比较好的,因为很多平台要提款的话,必须达到一定额度,而且太分散的话,自己添加着也挺麻烦的。当然,如果这个平台效果公认的已经落后了,还是要毅然换平台的,毕竟不同的广告联盟广告主资源水平还是有差距。

            2)    普遍有一个说法,如果是针对国外的应用,最好还是GoogleAdmob,针对英文环境能够提供的广告数量也多。不过本人没用过,不多说了。至于为什么没用,见下文。

            3)   进入正题,如何给程序加入广告呢?通常步骤是:下载该平台的sdk包,把jar加入到你项目的buildpath,然后在主程序里加上调用广告的程序,再在界面中设置展示广告的位置,最后修改AndroidManifest.xml文件,加入广告涉及的程序、权限等。然后,欧了!

          具体详细的安装方法,看广告平台提供的说明文档就行了,放心,一定会非常详细,一步一步教你,因为他们比你更希望你的应用中展示他们的广告。

    2.    添加最终用户许可协议

          类似License授权使用之类的,可能你已经在某些程序中见过,第一次启动,显示的那一大篇文字,却几乎不看,直接点“Accept”……具体添加步骤……网上还真没有几个讲这玩意的,要不说很多东西没人告诉你呢。我还是从书上看来的,好几页,也懒得抄了。话说,其实这东西主要就是保护你的知识产权的,也不知道是咱们缺少这意识,还是太简单没人写。

           找了半天找到个老外写的:http://bees4honey.com/blog/tutorial/adding-eula-to-android-app/,差不多就是这个步骤。我也只用过一次,是在给摩托罗拉电子市场提交应用时,人家明确要求要有这个东西。到时候需要的话就参考一下,不想弄这个呢,也完全不影响你程序的正常使用。

    3.    数字签名:你开发的Android应用必须有签名才能安装。之前调试的时候,是Android SDK自动用默认的签名调试,发布的时候必须要重新生成一个签名;另外,同一个应用的不同版本,要使用同一个签名,这样安装程序的时候,才会自动升级,新版本代替旧版本。否则,不同的签名系统会认为是不同的应用,而且包名(之前的package)必须不一样。具体签名过程,参考这里:http://www.cnblogs.com/feisky/archive/2010/01/17/1650076.html

    还有这里:

    http://lufengdie.iteye.com/blog/814660

    其实这里连带打包都包括了。

    4.   打包为可安装的apk文件Eclipse,右击需要签名的工程-->android tools-->export signed application package...
    出现对话框,选择需要签名的工程;next,选择上面生成的android.keystore文件位置和设置的密码next
    next,
    选择签名生成文件的位置和名称
    finish,
    搞定啦...

    5.  发布你的应用程序

             1)  首先,如果应用中有广告,应先上传到对应广告平台。审核通过后,你的广告才真正启用。

             2)    发布到其他电子市场。这一步其实可以和上一步同时进行。但一般为了防止你没测试到的错误或者其他原因,广告平台审核未通过,还需要再次修改,而且一般的广告平台1~2个工作日就可以审核完成,稍微等一下不误事。

         广告审核通过后,就可以发布到各大电子市场啦!

         以安卓市场为例,先要到这里注册开发者身份,然后提交你的应用,当然一般还要提交应用截图等信息,截图可以在模拟器上用电脑截图,也可以在手机上用截图软件截图(推荐个截图软件:ScreenCapture,http://bbs.hiapk.com/thread-737845-1-1.html下载)。

         上传完,填好信息,就等着审核吧。审核通过了,正式上线,然后你就可以在安卓电子市场搜索到你的应用了~

    其他的电子市场类似,我常用的有:

    http://www.eoemarket.com

    http://www.goapk.com

    http://www.hiapk.com

          其他还有好多,木蚂蚁,爱米,机锋网等等。另外中国移动MM市场不允许广告,要注意一下。其他电信、联通也有自己的应用市场。

          当然,还有个最重要的GoogleAndroid Market,这个电子市场可是全球销售啊~不过因为你懂的原因,没有直接的中国大陆地区注册。要注册这里的开发者,必有有个支持美元的信用卡,而且需要25美元/每年(好像是)的注册费,注册地中国地区最近的只有香港,而且貌似有点麻烦,所以我也没去注册,有兴趣的试试。

          其实直接把apk文件复制给别人就可以用了,只不过电子市场终究是传播最快的一种途径。如果有自己的博客、微博等等,也可以发个链接推广。

     P.S.:多去论坛看看,多提问,还是会有很多同好回复的~多试验。再推荐两个常用网站:

    http://stackoverflow.com/questions 一个老外的编程论坛,继承了老外事无巨细、不厌其烦解答的风格,基本你能想到的问题大部分都有

    http://findicons.com/ 很棒的图标搜索网站,美化必备。

            嗯,差不多就这些吧,the END. Happy Androiding~


    T2ag4tXe4MXXXXXXXX_!!706194963.jpg_sum.jpg
    chocchoco全球独家比利时巧克力生日礼盒iphone款200g
    288.0元  fgetccode_btn.gif
    展开全文
  • Linux应用开发自学之路

    万次阅读 多人点赞 2019-02-23 18:27:56
    在 「关于我 」那篇博文里,朋友们应该知道了我不是科班出身,是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程,希望对大家有所启发。   我是学机械专业的,对于机械专业我...

     

    前言

     

     

     

     

    在 「关于我 」那篇博文里,朋友们应该知道了我不是科班出身,是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程,希望对大家有所启发。

     

    我是学机械专业的,对于机械专业我还是很感兴趣,而且当年这个专业也是我自己选择的。本科时成绩没排第一,但也排专业前列。硕士时成绩一直是专业第一,还拿过国家奖学金。由此可见,我还是挺热爱机械的,考研时甚至还想去中科院深造(可惜落榜了),想成为一名机械砖家。

     

     

    转折点

     

     

     

    但转机在我毕业之后。本来我就想一直踏踏实实的做机械,但阴差阳错的,第一份工作由机械工程师调剂到电子工程师。虽然是电子工程师,但做了很多代码工作,那时候学了一些Verilog,以及C#,并且用C#开发了一个测试工具及一个生产用的上位机,据说那个测试工具现在还在电子部门使用。也就是那时,我真正接触到了编程,并深深的被编程世界所着迷。

     

    可是,我在学校学的是机械啊,跟软件相关的东西顶多是C语言及汇编语言,但C语言是十年前(那时候)学的,早就还给老师了。因此,为了工作的需要,我硬着头皮开始学习编程。我每天早上6点起床,学习一个小时后7点去赶班车,晚上下班回来再继续学习。在这样的条件下我学会了Verilog及C#,同时对STM32有个大概的了解。

     

    但那个岗位毕竟不是完全做软件工作,还需要做电子方面的工作。做软件的都知道,写代码的时候需要一个不被打扰的环境,而我那个岗位,一天可以接到十几个电话,严重干扰我的软件开发进度,因此,我决定离开公司,去做真正的软件工程师。

     

     

    入门

     

     

     

    第二份工作,我是嵌入式工程师。在去公司之前,我系统的学了一遍51,看的是 「郭天祥十天学会51单片机」,对单片机有个初步的入门。真正入职后,再利用一个月的时间系统学习一遍C语言,看的是C语言之父写的 「C程序设计语言」。这本书虽然写于80年代,但现在看来依然不过时。而且这本书比较薄,容易看完,比较有成就感。

     

    看完 「C程序设计语言」之后,最好再看 「C和指针」 ,「C专家编程」,「C陷阱与缺陷」。这三本书号称「C语言三剑客」 ,学完它们你的C语言水平绝对是非常之高了。做我们这行,C语言是基础语言,一定要把C语言完全拿下。

     

    之后为了工作的需要,开始接触了Marvell 88MC200及88MW300。这两款是WIFI芯片,但本质是单片机,采用的是ARM M3内核。底层驱动已经由厂家写好了,我们要做的工作就是在SDK基础上做应用做二次开发。在这个过程中,我对敏捷开发有了初步的认识,看了 「高效程序员的45个习惯:敏捷开发修炼之道」这本书。

     

    在第二家公司里,我知道了物联网的整体解决方案,对于物联网的整体框架有了更深入的了解。同时对嵌入式开发所需的技能有了全面的掌握,达到能够独立做一个物联网项目的水平。当然,期间还学会了版本控制工具git,看的是 「Pro Git」及 「git权威指南」。同时再进一步系统学习了STM32,看的书是野火的 「STM32库开发实战指南」,但看的视频却是正点原子的。这里强烈推荐正点原子的视频,真的是做的非常好。

     

    由于我是转行,我自知底子薄,起点比别人落后很多,因此我很刻苦学习。我就住在公司附近,公司8点上班,我依然6点起床,12点睡觉。平时没事的时候就在公司学习,看代码,写代码,调代码,甚至好几个周末也是在公司度过。为了转行我一心扑在了学习上,放弃了一切娱乐活动,只为能赶上同事一点半点。这个状态一直持续了我在这个公司的整个过程。

     

     

    新挑战

     

     

     

    可惜,一年之后我不得不离开了,因为我老婆在广州,我去广州追随我老婆了。由于我面试时的不错表现,以及我不错的英语口语,我顺利的被广州一家外资世界500强录用。我的新岗位是Linux应用开发工程师,使用C++开发。而在那时,我既不会Linux,也不会C++,所以公司敢录用我真的是勇气可嘉。

     

    从单片机到Linux又是一个比较大的跨度。Linux主要有三个方向:运维、应用、底层,而我选择的是应用方向。为了工作的需要,我必须先拿下C++。好在公司是外企,几乎不加班,于是我有充足的时间学习。可是,每天坐班车的时间加起来有三个小时,这么好的时间我不能浪费啊,于是,我买了个iPad,下载一套视频,在班车上也进行学习。当然,我也注意保护眼睛,在班车上绝不看书,看视频的时候也经常往窗外看看。

     

    这里讲讲自学过程中是采用看书还是看视频的方式。我采用的是先看视频再看书的方式。为什么要这样?因为我个人觉得,很多技术书都是很厚的一本,自己看下来要花费很多时间精力,而且很多知识点在工作中很少会用到,可以暂时先略过的。视频一般会比较短,一般是几天就能看完,而且老师一般只挑重点的讲。我们时间都很宝贵,我建议先把老师讲的知识完全掌握了以后,再利用书籍进一步扩展其它知识。但是,不管是看书还是看视频,一定要写代码,一定要写代码,一定要写代码,否则非常容易造成眼高手低!!

     

    我这家公司里我依然保持着早上6点起床,晚上11点睡觉的习惯。这样早上有1个小时,晚上3个小时,班车上3个小时,一天总共有7个小时可以用于学习。而周末我会睡个懒觉,7点起床,依然11点睡觉,周末几乎不出门,所以周末又有大量的时间可以用来学习。

     

    C++实在是太难了,我用了一个多月才将视频里的知识完全拿下来。之后,在工作中,陆续开始看「C++ Primer」 进一步巩固。其它书籍推荐:「Effective C++」,「C++语言的设计与演化」,「C++ 标准程序库」。在stackoverflow上有个C++必读书单,可以去看看。

     

    学完C++我再学习了Linux系统编程,同样采用的是先视频后书籍的方式进行。不管是视频还是书籍,一定要看最经典的。市面上有太多良莠不齐的视频和书籍,如果选择了一个质量不好的材料来看,不仅会浪费很多时间,而且有可能还会被误导。对于视频的选择,可以去各大培训机构,里面通常有一些免费视频资料供我们下载。

     

    对于Linux应用的学习,主要有六部分:1. 环境搭建;2. 基本操作;3. 系统编程;4. 网络编程;5. 数据库编程,6. Shell编程。下面一一详细介绍。

     

    1. 环境搭建

    作为Linux工程师,毋庸置疑一定需要Linux环境。对于Linux环境的获取,我们通常有两种方式:

    • 将电脑整体安装为Linux系统;

    • 在电脑里安装一个虚拟机,跑Linux电脑;

    • Window+Linux双系统。

    得到Linux环境后还不够,还要知道如何配置、如何远程连接Linux电脑、如何与Linux电脑互传文件、如何在主机上阅读Linux电脑中的代码,等等。

     

    2. 基本操作

    众所周知,Linux很少或几乎没有界面,所有的操作几乎都可以通过命令行来完成。对于运维人员来说,需要掌握相当大量的Linux命令。而对于应用、驱动方向的人员来说,只需掌握一些基本的常用的命令即可。对于这部分很多人建议看 「鸟哥的私房菜」 ,但我觉得这个更适合运维人员,我们无需掌握那么多命令。

     

    3. 系统编程

    在学系统编程之前,一定要先学习Makefile,这会为后续的学习提高很大效率。之后的系统编程,主要有几大块:IO编程、进程、线程、进程间通讯(包括管道、信号、信号量、共享内存等)。这几部分学完了,基本也就差不多了。

     

    4. 网络编程

    网络编程主要就是socket,poll,epoll,以及对TCP/IP的理解,同时要学会高并发式服务器的编写。

     

    5. 数据库编程

    数据库的内容其实并不属于Linux,但在项目中经常要用到。这部分主要要学会数据库的基本操作,以及如何写一套接口去操作数据库。

     

    6. Shell编程

    Shell是Linux下的脚本语言,功能虽然不如高级语言强大,但它可能做很多事,在某些场合甚至比高级语言要方便得多。当然除了Shell脚本,还有Python脚本。

     

    Linux应用编程书籍推荐:

    • UNIX环境高级编程。简称APUE,号称程序员的圣经。它不是一本API字典,它还讲述了很多操作系统的细节,内存,文件系统等方面,是一本难得的好书。但是它起点有点高,不适合初学者。

    • Linux程序设计。如果觉得APUE有点难入门的话,可以选择此书进行入门。

    • Unix/Linux系统编程手册。这本书号称是一本超越APUE的书,它是一本比较新的书,里面新增了APUE所没有的Linux/Unix新特性。而且对于一些概念性的东西讲的确实比APUE好。但至于能否超载APUE,还有待历史的考验。

    • UNIX 网络编程。也是一本非常经典的书,主要是网络编程方向的。

    • MySQL必知必会。本书在Amazon上长期排在数据库销售榜首,建议想快速了解数据库原理和MySQL的新手阅读。快餐性质,简洁明快,小开本,而且很薄,比较好阅读。

    • Linux Shell脚本攻略。这本书很薄很精华,它追求的不是全,而是精,所以用它来入门再适合不过了。

     

    学完以上六部分,基本就有能力完成Linux环境下的应用编程了。当然,在有些场合我们可能还需要用到Python脚本。像我公司的项目部分脚本就是用Python完成的。对于Python的入门,可以参考 「简明Python教程」。但如果想进一步提高的话,那就需要阅读大量书籍了。对于Linux层级的脚本应用,掌握一些基础的足够了。

     

    以上就是我的Linux应用开发自学之路,虽然我离高手还有很长的距离,但我还是将自己的这段自学经历分享出来,希望能够帮助朋友们少走一些弯路,同时也期待和高手一起学习、提高。好了,今天的分享就至此为止。

    ---------------

    我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。

     

     

     

     

    展开全文
  • Android应用开发--MP3音乐播放器滚动歌词实现

    万次阅读 多人点赞 2014-08-05 09:02:26
    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日 简、美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先看一下。其实小巫也有参考过别人的代码...

    Android应用开发--MP3音乐播放器滚动歌词实现

    2013年6月2日  简、美音乐播放器开发记录

    -----前话

    有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先看一下。其实小巫也有参考过别人的代码,主要是具体看某一个功能是怎么实现的,但是因为开发的思路不一样,只能说自己去写一些符合自己思路的代码。编写代码过程中,或多或少有纰漏之处,但基本上能实现功能就行了。小巫的功底还不够,不具备很强的重构代码的能力,一直都是以最直观的想法来编程,并没有太过关注性能的优化啥的,因为我也没发现自己开发的这款音乐播放器用起来不爽。不过,小巫会一直学习的,努力提升自己的编程水平,争取生产出优美的代码供朋友们参考。

    -----主题

         这篇博客的主题是:“滚动歌词的实现”

         要的效果如下:

               

    ----实现过程

    1. 建立歌词内容实体类

    2. 自定义View

    3. 加入布局文件

    4. 编写歌词处理类

    5. 在Service里面实现同步更新歌词


    ----代码实现

    --LrcContent.java

    package com.wwj.sb.domain;
    /**
     * 2013/6/1
     * @author wwj
     * 歌词实体类
     */
    public class LrcContent {
    	private String lrcStr;	//歌词内容
    	private int lrcTime;	//歌词当前时间
    	public String getLrcStr() {
    		return lrcStr;
    	}
    	public void setLrcStr(String lrcStr) {
    		this.lrcStr = lrcStr;
    	}
    	public int getLrcTime() {
    		return lrcTime;
    	}
    	public void setLrcTime(int lrcTime) {
    		this.lrcTime = lrcTime;
    	}
    }
    


    --LrcView.java

    package com.wwj.sb.custom;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    
    import com.wwj.sb.domain.LrcContent;
    
    /**
     * 自定义绘画歌词,产生滚动效果
     * @author wwj
     *
     */
    public class LrcView extends android.widget.TextView {
    	private float width;		//歌词视图宽度
    	private float height;		//歌词视图高度
    	private Paint currentPaint;	//当前画笔对象
    	private Paint notCurrentPaint;	//非当前画笔对象
    	private float textHeight = 25;	//文本高度
    	private float textSize = 18;		//文本大小
    	private int index = 0;		//list集合下标
    	
    	
    	private List<LrcContent> mLrcList = new ArrayList<LrcContent>();
    	
    	public void setmLrcList(List<LrcContent> mLrcList) {
    		this.mLrcList = mLrcList;
    	}
    
    	public LrcView(Context context) {
    		super(context);
    		init();
    	}
    	public LrcView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		init();
    	}
    
    	public LrcView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init();
    	}
    
    	private void init() {
    		setFocusable(true);		//设置可对焦
    		
    		//高亮部分
    		currentPaint = new Paint();
    		currentPaint.setAntiAlias(true);	//设置抗锯齿,让文字美观饱满
    		currentPaint.setTextAlign(Paint.Align.CENTER);//设置文本对齐方式
    		
    		//非高亮部分
    		notCurrentPaint = new Paint();
    		notCurrentPaint.setAntiAlias(true);
    		notCurrentPaint.setTextAlign(Paint.Align.CENTER);
    	}
    	
    	/**
    	 * 绘画歌词
    	 */
    	@Override
    	protected void onDraw(Canvas canvas) {
    		super.onDraw(canvas);
    		if(canvas == null) {
    			return;
    		}
    		
    		currentPaint.setColor(Color.argb(210, 251, 248, 29));
    		notCurrentPaint.setColor(Color.argb(140, 255, 255, 255));
    		
    		currentPaint.setTextSize(24);
    		currentPaint.setTypeface(Typeface.SERIF);
    		
    		notCurrentPaint.setTextSize(textSize);
    		notCurrentPaint.setTypeface(Typeface.DEFAULT);
    		
    		try {
    			setText("");
    			canvas.drawText(mLrcList.get(index).getLrcStr(), width / 2, height / 2, currentPaint);
    			
    			float tempY = height / 2;
    			//画出本句之前的句子
    			for(int i = index - 1; i >= 0; i--) {
    				//向上推移
    				tempY = tempY - textHeight;
    				canvas.drawText(mLrcList.get(i).getLrcStr(), width / 2, tempY, notCurrentPaint);
    			}
    			tempY = height / 2;
    			//画出本句之后的句子
    			for(int i = index + 1; i < mLrcList.size(); i++) {
    				//往下推移
    				tempY = tempY + textHeight;
    				canvas.drawText(mLrcList.get(i).getLrcStr(), width / 2, tempY, notCurrentPaint);
    			} 
    		} catch (Exception e) {
    			setText("...木有歌词文件,赶紧去下载...");
    		}
    	}
    
    	/**
    	 * 当view大小改变的时候调用的方法
    	 */
    	@Override
    	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    		super.onSizeChanged(w, h, oldw, oldh);
    		this.width = w;
    		this.height = h;
    	}
    
    	public void setIndex(int index) {
    		this.index = index;
    	}
    	
    }
    

    --LrcProcess.java

    package com.wwj.sb.custom;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.util.Xml.Encoding;
    import android.widget.SlidingDrawer;
    
    import com.wwj.sb.domain.LrcContent;
    
    /**
     * 2013/6/1
     * @author	wwj
     *	处理歌词的类
     */
    public class LrcProcess {
    	private List<LrcContent> lrcList;	//List集合存放歌词内容对象
    	private LrcContent mLrcContent;		//声明一个歌词内容对象
    	/**
    	 * 无参构造函数用来实例化对象
    	 */
    	public LrcProcess() {
    		mLrcContent = new LrcContent();
    		lrcList = new ArrayList<LrcContent>();
    	}
    	
    	/**
    	 * 读取歌词
    	 * @param path
    	 * @return
    	 */
    	public String readLRC(String path) {
    		//定义一个StringBuilder对象,用来存放歌词内容
    		StringBuilder stringBuilder = new StringBuilder();
    		File f = new File(path.replace(".mp3", ".lrc"));
    		
    		try {
    			//创建一个文件输入流对象
    			FileInputStream fis = new FileInputStream(f);
    			InputStreamReader isr = new InputStreamReader(fis, "utf-8");
    			BufferedReader br = new BufferedReader(isr);
    			String s = "";
    			while((s = br.readLine()) != null) {
    				//替换字符
    				s = s.replace("[", "");
    				s = s.replace("]", "@");
    				
    				//分离“@”字符
    				String splitLrcData[] = s.split("@");
    				if(splitLrcData.length > 1) {
    					mLrcContent.setLrcStr(splitLrcData[1]);
    					
    					//处理歌词取得歌曲的时间
    					int lrcTime = time2Str(splitLrcData[0]);
    					
    					mLrcContent.setLrcTime(lrcTime);
    					
    					//添加进列表数组
    					lrcList.add(mLrcContent);
    					
    					//新创建歌词内容对象
    					mLrcContent = new LrcContent();
    				}
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			stringBuilder.append("木有歌词文件,赶紧去下载!...");
    		} catch (IOException e) {
    			e.printStackTrace();
    			stringBuilder.append("木有读取到歌词哦!");
    		}
    		return stringBuilder.toString();
    	}
    	/**
    	 * 解析歌词时间
    	 * 歌词内容格式如下:
    	 * [00:02.32]陈奕迅
    	 * [00:03.43]好久不见
    	 * [00:05.22]歌词制作  王涛
    	 * @param timeStr
    	 * @return
    	 */
    	public int time2Str(String timeStr) {
    		timeStr = timeStr.replace(":", ".");
    		timeStr = timeStr.replace(".", "@");
    		
    		String timeData[] = timeStr.split("@");	//将时间分隔成字符串数组
    		
    		//分离出分、秒并转换为整型
    		int minute = Integer.parseInt(timeData[0]);
    		int second = Integer.parseInt(timeData[1]);
    		int millisecond = Integer.parseInt(timeData[2]);
    		
    		//计算上一行与下一行的时间转换为毫秒数
    		int currentTime = (minute * 60 + second) * 1000 + millisecond * 10;
    		return currentTime;
    	}
    	public List<LrcContent> getLrcList() {
    		return lrcList;
    	}
    }
    


    加入布局文件:

    	<com.wwj.sb.custom.LrcView
    	    android:id="@+id/lrcShowView"
    	    android:layout_width="match_parent"
    	    android:layout_height="200dip"
    	    android:layout_above="@+id/footer_layout"
    	    android:layout_below="@+id/header_layout"
    	    android:layout_centerHorizontal="true" />


    --在Service.java中的实现,这里就不贴完整的Service类了,主要是如何在Service实现歌词同步的。

    声明变量:

    private LrcProcess mLrcProcess;	//歌词处理
    private List<LrcContent> lrcList = new ArrayList<LrcContent>(); //存放歌词列表对象
    private int index = 0;			//歌词检索值

    核心实现代码:

    	/**
    	 * 初始化歌词配置
    	 */
    	public void initLrc(){
    		mLrcProcess = new LrcProcess();
    		//读取歌词文件
    		mLrcProcess.readLRC(mp3Infos.get(current).getUrl());
    		//传回处理后的歌词文件
    		lrcList = mLrcProcess.getLrcList();
    		PlayerActivity.lrcView.setmLrcList(lrcList);
    		//切换带动画显示歌词
    		PlayerActivity.lrcView.setAnimation(AnimationUtils.loadAnimation(PlayerService.this,R.anim.alpha_z));
    		handler.post(mRunnable);
    	}
    	Runnable mRunnable = new Runnable() {
    		
    		@Override
    		public void run() {
    			PlayerActivity.lrcView.setIndex(lrcIndex());
    			PlayerActivity.lrcView.invalidate();
    			handler.postDelayed(mRunnable, 100);
    		}
    	};

    	/**
    	 * 根据时间获取歌词显示的索引值
    	 * @return
    	 */
    	public int lrcIndex() {
    		if(mediaPlayer.isPlaying()) {
    			currentTime = mediaPlayer.getCurrentPosition();
    			duration = mediaPlayer.getDuration();
    		}
    		if(currentTime < duration) {
    			for (int i = 0; i < lrcList.size(); i++) {
    				if (i < lrcList.size() - 1) {
    					if (currentTime < lrcList.get(i).getLrcTime() && i == 0) {
    						index = i;
    					}
    					if (currentTime > lrcList.get(i).getLrcTime()
    							&& currentTime < lrcList.get(i + 1).getLrcTime()) {
    						index = i;
    					}
    				}
    				if (i == lrcList.size() - 1
    						&& currentTime > lrcList.get(i).getLrcTime()) {
    					index = i;
    				}
    			}
    		}
    		return index;
    	}


    其实,小巫还想实现可以拖动歌词来控制播放进度,还有自动搜索歌词等更加完备的实现。


    展开全文
  • Android快应用开发(一)

    千次阅读 2019-08-12 16:24:06
    在华为2019的开发者大会中也是吹了一把快应用,快服务的使用,以后在鸿蒙系统中也会支持这种快速开发,高效,资源占用率低,免安装的快应用模式。 下面是传统APP,H5APP,混合APP,小程序等使用对比 从上图也可以...

    快应用是Android未来的使用趋势,其优势在于免安装,渲染能力强,使用原生系统的能力强,H5实时更新等。

    在华为2019的开发者大会中也是吹了一把快应用,快服务的使用,以后在鸿蒙系统中也会支持这种快速开发,高效,资源占用率低,免安装的快应用模式。

    下面是传统APP,H5APP,混合APP,小程序等使用对比

    从上图也可以看出,各手机厂商制定了快应用标准,就是为了死磕上去年和前年比较火的微信小程序

    现在小程序已经有了一席之地了,快应用还没有怎么被用户所知

    那就要吐槽一下快应用的使用入口了,几乎所有的手机快应用入口都在应用商店里去找,平时也没有看到各手机商在销售时有过介绍什么的。用户不仔细找都没发现有....

    那么就干起来吧:

    开发要求,必须有一些JS基础,不要求能写的有多华丽,但是比较基础的HTML JS CSS代码可以看得懂,后面使用到的知识再慢慢学习补上了了。

    第一步:欲善其工,先利其器,环境搭起来先

    1、安装Node.js环境,Node.js官网地址:https://nodejs.org/en/ 

    2、下载华为快应用开发IDE,Win地址:https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/DevecoFastAppIDE-V1.4.1-Win64.exe

    MAC地址:https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/DevecoFastAppIDE-20190706-V1.4.dmg

    3、安装到*****目录下,开始嗨起来。

    第二步:连接手机

    手机打开开发者模式,连接手机。介绍说也可以局域网连接,但是我一直没有尝试成功,也不知道为什么,可能是我的手机不是华为的?一直提示设备已离线。emmm......

    那就用线连接吧。头大

    连上手机后,点击这图标就可以实时预览手机的画面啦????

    华为官网是这样介绍的,但是我没有运行在华为手机上,导致页面一直在刷新,而且开启之后跑项目可以进入调试界面

    页面有点类似浏览器的F12,啊,本来就是同一个东西好伐!

     

    第三 创建自己的应用(对,我就写在第三步怎么了,我自己第二步就先搞了)

    1、填入各项信息,什么包名啊,项目名啊,Android开发的小伙伴最熟悉了,就不多写了。

    2、新建时可以看到有一大推模式可以选择,一大堆已经写好的常用应用视图框架,秉着对hello world传统的尊重,我们就

    3、新建了Hello world工程,毕竟越简单,越容易看出架构最原始的样子。

    4、进去之后还有各种组件库可以直接拖拽,这也太方便了吧,看来以后不用熬夜写代码了,对,大家都要失业了。

    还是跑一下项目先吧。

    emmm....需要先按照华为的快应用加载器(一部手机只能加载一个快应用加载器)

    5、安装成功之后,很快就跑起来了!

    6、这时我们注意到好多IDE右下角有很多组件,我们随便加几个进去,编译(啊,也太快了吧,突然有点嫌弃AndroidStudio,哭唧唧,项目大了有时居然给我编译个7、8分钟,信不信我砸了你,呃,跑偏了!),各个页面的切换真的很流畅。

    快应用是否以后真的可以真正代替Android原始APP。这次真的是有点头大,虽然一开始小程序也是这么喊的,干掉原生,混合APP也是这么喊的,干掉原生,现在快应用也加入了这个行列,显然快应用要比前两者做的好,但是弊端就是只能做Android,IOS开发者还是要写一套自己的原生代码,这个就有点比不过前两者的快速开发(什么快速开发,其实就是老板想节省点钱,把两个人的工作量交给一个人,两个平台共同维护一套代码,其实写起来页面什么的也是很操蛋)。

     

     

     

    那么第一部分就先到这里了,后面继续摸索学习,毕竟华为号称3天就可以完成一个APP的开发,虽然我们大多数开发节奏没这么快,但是快应用突出就是快字,是否可以替代原生拭目以待了。(看来要失业了......)

    下一篇我们看看项目框架具体是如果分布的。

     

     

     

     

     

     

     

     

    展开全文
  • 使用这个APP,可以快速的创建活动,参加感兴趣的活动,在活动中结交新朋友。
  • 应用开发系列(一)

    千次阅读 2018-05-30 18:38:22
    一、前期环境安装准备: 1、安装nodejs https://nodejs.org/en/... 2、安装hap-toolkit npm install -g hap-toolkit 在命令行中执行hap -V会输出版本信息表示hap-toolkit安装成功,如下命令所示: ...3、手机安装快...
  • 安卓 Android之开发简单小应用(一)

    万次阅读 多人点赞 2018-10-30 11:29:32
    安卓 Android之开发简单小应用(一) 一、简述  记 --没学过Android之开发简单小应用。(课程设计作业)  例子打包:链接:https://pan.baidu.com/s/1LEQ1oWkUX8OmtfCFVydxWQ 密码:9o0d 二、环境搭建 软件打包:...
  • 应用App开发

    千次阅读 2018-06-11 18:07:29
    虽然有人说,快应用只是雷声大,雨点小,经过小编这几天的接触,觉得,目前快应用还只是在开发阶段,有很多东西还需要完善,不建议各个公司争着做第一个吃螃蟹的人。在此,和大家探讨一些小编在接触过程中遇到的一些...
  • 跨越平台桌面应用开发框架electron使用的心路历程

    万次阅读 多人点赞 2018-06-26 15:57:50
    从接触Electron到真正去做出一个桌面应用,再到今天写下这边文章,大概花了三个月时间吧,到不是因为有多难学,主要是由于这纯碎是个人兴趣,自己是在业余时间干的,公司里面目前还没有推行,这段时间开发任务又比较...
  • Android应用开发实战.pdf

    千次下载 热门讨论 2020-07-30 23:30:40
    《Android应用开发实战》是一本实践与理论紧密结合的Android应用开发参考书。实践部分以一个完整的大型案例(功能完善的微博客户端)贯穿始终,以迭代的方式详细演示和讲解了该案例的开发全过程,旨在帮助读者迅速...
  • HarmonyOS应用开发 — HelloWorld应用开发E2E体验

    万次阅读 多人点赞 2020-09-18 12:32:59
    智慧屏是首个搭载HarmonyOS的终端产品,通过HarmonyOS智慧屏多页签应用开发,让开发者了解HarmonyOS应用开发的全流程,20分钟快速上手,实现从工程创建到应用上架全过程。 您将建立什么 在这个Codelab中,您将使用...
  • 自从共享单车火了以后物联网应用开发就比较热门了, 甚至一些非物联网的公司也开始切入物联网项目中去,结果用传统的互联网技术和团队开发出来的项目问题多多。核心原因是物联网应用开发本身有一些特殊性需要关注,...
  • 企业微信自建应用开发初探

    千次阅读 2019-04-04 17:21:42
    企业微信是腾讯推出的一个新的办公协作平台,通过与微信一致的沟通体验,为企业员工提供最基础和最实用的...本文以该项目为例对在企业微信平台开发企业应用的特点进行了总结,重点分析了企业微信开发平台对应用开发...
  • 《Android移动应用开发》 复习题(一)

    千次阅读 多人点赞 2020-03-30 12:45:58
    《Android移动应用开发》 复习题(一) (一)Android的体系结构是怎样的?请简要加以说明。 Android的系统架构采用了分层架构的思想,从上层到底层共包括四层,分别是应用层、应用框架层、系统运行库层以及Linux...
  • Delphi XE8跨平台开发让你使用一套代码完成iOS和Android移动应用开发。强大的控件支持,让你可以不用编写一句代码并在短短几分钟内完成数据库的读写 应用开发,开发效率得到充分提升,让编程不再是枯燥无味的工作。...
  • 其中有一些虽然不是专用于应用开发,但是如果有快速成型的需求,可以试一试用于设计 DEMO,或许有奇效。 列表 平台 介绍 Android Native 现在正在做项目的平台。指的是用 Android SDK/NDK 一类工具包开发...
  • Fabric--区块链应用开发

    千次阅读 2018-07-06 11:24:08
    区块链应用开发 简介 数字货币曾是区块链技术的唯一应用场景 对智能合约的支持突破了场景限制, 丰富了区块链应用的适用范围, 可以支持多行业、大规模的商业应用 区块链应用 区块链应用: 一般由若干部署在...
  • 今天我们带来了 Growth 的纸质版《全栈应用开发:精益实践》,她一定不会让你失望的~。 那么,作为 Growth 纸质版的 《全栈应用开发:精益实践》到底在讲些。本书目标本书的主线结合了《全栈增长工程师指南 》与...
  • HarmonyOS应用开发-分布式任务调度

    千次阅读 2020-09-18 11:20:42
    通过一个简单应用开发,体验HarmonyOS的分布式任务调度 您将建立什么 在这个Codelab中,你将创建Demo Project,并将Demo编译成Hap,此示例应用程序展示了如何使用分布式任务调度。 您将会学到什么 如何创建一个...
  • 《HTML5移动应用开发入门经典》将这两者巧妙结合起来,详细讲解了如何利用HTML5进行移动应用开发。 HTML5移动应用开发入门经典总共分为24章,以示例的方式对如何使用HTML5及相关技术进行移动应用开发做了全面而细致...
1 2 3 4 5 ... 20
收藏数 2,910,549
精华内容 1,164,219
关键字:

应用开发