次笔记首次发表于博客misskissC:http://blog.csdn.net/misskissc/article/details/9427461
学习C语言未必有助于面向对象设计程序语言(C++,java等),学习C语言有助于程序中的逻辑设计。程序中的逻辑编写大多都是采用最开始编写C语言的方式。这有助于快速的编写程序。
面向对象设计语言适用于图形界面设计。正因为如此,为了专门用来进图形界面设计,就出现了类、封装、重载等重要概念。从而对象和继承成了图形界面的主要思想。
除了对象和继承之外,还有一个载体是程序架构。用过MFC程序架构之后,Android 应用程序的结构就显得简单。
所以,个人笔记认为:一天人门一个带程序架构的开发,必须具有程序价格和编程语言基础方能如此[ 天才又被排除在外 ]
所谓的一天入门,也包括先掌握程序下载运行的步骤滴。
1 android程序项目建立及程序下载运行
Android应用程序本文采用java语言开发,采用eclipse继承开发环境。如此的搭配使程序具有的特点为:
- 架构性:Androidjava project程序具有一定的程序框架。程序开始运行,有的函数由操作系统自动调用。
- 封装性:库中包含众多的类。编程时要适应用类定义对象来完成程序的思想。
如果本人具有一定的编程基础(如:C语言编程能力)[对应此次编写java程序的逻辑程序部分编写 ],接触过程序架构(如MFC程序架构)[对应此次java Android程序的架构]及有类相关概念的话,那么开发一个简单的Android应用就是很简单的了。如开发题设的Android应用,按照以下步骤理清编写代码的地方,一天就能完成。完全不用理会java语言的语法,哪怕是一天的java都没有学过[我们都没有学过java ]。
启动eclipse[ 不要撇下eclipse的配置块 ]。
- File->New->Project->Android[ Android Application Project ],点击Next。
- 然后填写ApplicationName[如HelloWorldIII],其余选项默认,点击Next。
- 默认页面的选项,点击Next。
- 默认再点Next。
- 可选CreateActivity下的Blank Activity,然后点击Next。[如Create Activity 下木有选项则打开Android SDK下的 SDK Manager,继续下载或者更新Packages吧 ]
默认页面设置,点击Next。点击Finish完成项目创建。
如果项目成功建立,则此次项目的建立就是hello world!的程序,就可以将其*.apk文件下载到模拟器或者真机之上运行了。
(1)下载到模拟器
- 选中项目文件右键-->RunAs-->Run configurations。
- 选择Target进入Target页面,选择“Automaticallypick compatible devices/AVD’S”,并勾选其下的模拟器后,如模拟器未开启,点击start按钮开启模拟器。如果模拟器已经开启,则点击Run运行程序。如此就会在模拟器之上运行Android程序。
(2)真机运行
真机运行就是将*.apk文件下载置ARM11开发板之上运行。有两种办法:
- 第一种方法是用eclipse下载,配置过程跟下载到模拟器差不多,只是在Target页面时需要选择”Always prompt to pick device”或者选择“Launch on allcompatible devices/AVD’s 下的 Active devices”。
- 第二种方法是通过ADB下载。首先要安装USB ADB驱动( 可在SDK Manager之上下载 ),然后将adb命令添加到Path环境变量中[ 在Path中添加:“C:\ProgramFiles\Android\android-sdk\platform-tools;”],添加后打开cmd输入adb回车,检测是否添加adb命令成功。如果adb命令添加成功则用“adb devices”命令检测当前是否有真机连接在PC之上,如果出现以下界面,则连接成功。
然后通过 “adb install 路径/*.apk”命令将Android的apk程序下载知ARM11 之上运行。
2 Android程序目录( 结构 )
项目创建完成以后,在eclipse左边的Package Explorer下就有了刚刚创建的项目HelloWorldIII。展开HelloWorldIII得如下结构目录:
Android程序目录结构
(1)src目录
这是编写java源代码的目录。此项目就在MainActivity.java文件中编写java代码,完成主要程序功能。
(2)gen目录
虽然第一次在编写程序的过程中不会来操作这个目录,但是值得一提的是,如果建立程序项目后,gen目录下没有R.java这个文件。则程序就会报错,因为R.java这个文件是多么的重要,很多的代码都要通过R.*[ *表示任何字符串 ]来引用其它文件的变量。
(3)res目录
这是编写程序时的资源目录。一般都是将程序中索要用的资源放在res/下的某个目录下,也可以在此目录下新建目录[目录命令要符合java命名规则 ]来存放程序中会使用到的资源。如drawable目录为新建来保存程序中要用到的图片的文件夹,raw文件夹是用来保存各种音效的。layout下的activity_main.xml是专门用来为Android界面布局的,可以直接操作图形界面,也可以编写代码实现。通常是编写代码为主,直接操作图形界面为辅。values下的*.xml文件是用来定义一些字符串等供其它文件使用的文件。
(3)AndroidManifest.xml文件
这个文件在程序调试必要时会修改一下子。
可以在Android项目下新建符合java命名的任何文件夹及文件下可以新建符合java名的任何编写代码的文件。
3 Android界面布局
Android的界面布局通常是通过res/layout/activity_main.xml文件代码编写来实现的。新建项目的默认布局是<RelativeLayout …>…</ RelativeLayout>。
其中xmlns::android="http://schemas.android.com/apk/res/android"及xmlns:tools="http://schemas.android.com/tools"表示此次编写xml文件所遵循的规则都是以android为准。
(1)为界面添加文本
为界面添加文本的代码框架为<TextView … />。具体代码如下:
<TextView
android:id="@+id/lable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/input_statr"
/>
其中android:id=”@+id/lable”表示为添加的文本内容的id设置为lable[没当利用XML代码在界面之上添加一个控件时都要为其设置一个id,此id标识此控件,当其它代码要利用此控件的时候就通过应用此id就可以了 ]。
然后android:layout_width表示此文本控件的宽度,也可以设置具体的值如android:layout_width=“100dip”。同理下一行代码就表示文本控件的高度。
最后一行的android:text=“@string/input_statr”文本控件显示的内容就是res/string下的input_startr对应的字符串。
Res/value下string.xml内容如下:
res/value/string.xml内容
此外,一个控件的除了这些id,高度,宽度,文字内容之外,还可以设置其具体位置,左位于某控件的左边还是右边,位于某控件的上面还是下面等。具体可以以关键字 android 布局查看具体的内容。@符号表示引用。
(3)为界面添加背景图片
在<RelativeLaout >中添加代码android:background=”@drawable/ic_bg”。@表示引用,drawable是在res下新建的一个目录,专门用来放图片的。ic_bg就是背景图片。图片的格式为.png。
(4)为界面添加钢琴图片
添加图片时采用<ImageView …>框架,同样,需要为图片设置id,大小、位置属性等,加载图片的代码为android:src=”@drawable/ic_piano”。
XML界面布局
界面布置好之后,剩余的就是来处理图片先关的事件了。
4 程序执行流程浅浅述
当Android启动你的应用程序的时候,Android会首先调用onCreate这个方法。在Eclipse生成的代码中,onCreate把activity的视图设置成R.layout.main。这行代码告诉Android解释我们的布局配置XML文件,并显示它。
在Android中,R是一个自动生成的对象,这是一个特殊的对象,你可以在代码中通过这个对象访问项目中的资源(布局,字符串,菜单,图标,…) 。每个资源都有一个给定的id。在上面的那个布局文件中,有一些@+id XML 属性。我们将通过这些值来关联布局中的Buttons 与TextViews。
5 Android事件检测及处理( 关联Android界面 )
(1)检测按钮(Button)点击事件
为了检测到用户单击我们的按钮,我们需要实现一个监听器listener。你可能会从其他的事件驱动系统中熟悉监听器或回调函数callbacks。比如Javascript/JQuery事件或Rails的回调函数。
Android通过Listener接口提供相似的机制,例如OnClickListener,这个接口中定义了那些会被事件触发的方法。当用户点击屏幕的时候,实现OnClickListener 接口将会通知你的应用程序,并告诉他们所按得屏幕按钮。你当然也需要告诉每个button的ClickListener,以便Android知道具体通知到那个监听器。
实现代码的具体步骤:
- 在MainActivity.java文件的类程序之前添加加载对应类的语句,这里要处理按键,故添加语句import android.widget.Button。也可以在编写了相关的Button代码后用快捷键“Ctrl + Shift +o ”来自动加载对应类。
- 在程序中定义Button类对象。并获取对应Button的id。
- 为响应的Button添加listener。
- 添加点击屏幕事件的响应函数。
具体代码流程如下:
package com.example.helloworldiii;
…
import android.widget.Button;
…
public class MainActivity extends Activity
implements OnClickListener{
//Objects for XML
protected Button Bsurewf;
protected Button Bsureny;
protected Button Bsurezhm;
…
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Play Piano III");
setContentView(R.layout.activity_main);
//Connect interface elements[Bsure Button is dai biao sure anniu] to objects
Bsurewf = (Button) findViewById( R.id.wf );
Bsureny = (Button) findViewById( R.id.ny );
Bsurezhm = (Button) findViewById( R.id.zhm );
…
//Set listener for each button
Bsurewf.setOnClickListener( this );
Bsureny.setOnClickListener( this );
Bsurezhm.setOnClickListener( this );
…
public void onClick( View v ){
if( v == Bsurewf ){
…
}
…
}
}
implements OnClickListener语句需要像以上一样添加到代码之中,不然Bsurewf.setOnClickListener(this );语句会有编译错误。往程序中添加如此的代码之后,由于每个按钮都被添加了点击事件监听器,程序就能检测到用户是否发生了“按钮点击”事件,然后在onClick函数中再进一步判断到底是点击了哪一个按钮,按钮由对应的id标识。如果还有相关类未定义的,使用“Ctrl + Shift +o ”来自动加载对应类。
其中onClick函数在有按钮被点击时由系统自动调用。
(2)检测触屏事件
跟检测按钮点击事件一样,在程序中检测触屏事件的步骤也一样。只是检测触屏操作的函数不再是onClick,而是onTouchEvent( MotionEvent event ),此时需要做的是在onClick函数下方添加onTouchEvent函数的编写。然后使用“Ctrl + Shift +o ”来自动加载对应类。
OnTouchEvent函数的参数为MontionEvent, MontionEvent对应的操作为:
- getPointerCount()获取触屏的点数。
- getX()获得触屏的X坐标值。
- getY()获得触屏的Y坐标值。
- getAction()获取触屏的动作。包括ACTION_DOWN,按下的动作;ACTION_UP:离开屏幕的动作,ACTION_MOVE:手指滑动。
然后根据触屏的具体事件和坐标值来实现具体的操作。检测坐标可将坐标输出到EditText中。
为了方便,ImageView中有具体的方法获得ImangeView定义图片的坐标:
ImageView坐标获取说明
Left和top指的是ImageView左上角的坐标x和y,right和bottom指的是ImageView图片右下角坐标的x和y值。
onTouchEvent函数在有触屏操作时又系统自动调用。
某些函数有系统自动调用都是程序架构即封装的作用。
(3)播放音效
播放音效由MediaPlayer类来完成。
package com.example.helloworldiii;
…
import android.media.MediaPlayer;
…
public class MainActivity extends Activity
implements OnClickListener{
//Define object for mediaplayer
protected MediaPlayer mp;
…
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Play Piano III");
setContentView(R.layout.activity_main);
//Create mediaplayer object
mp = MediaPlayer.create(this, R.raw.ic_music_1);
@Override
public void onClick( View v ){
//Play the music
if( v == Bsurewf ){
try{
if( mp_nfdsm != null){
mp_nfdsm.stop();
}
mp_nfdsm.prepare();
mp_nfdsm.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
一个MediaPlayer对象创建以后,就可以播放盒控制对应的音效。根据控制条件就可以播放盒停止播放音效。而且在播放音效期间不响应其它的操作。
6 此次Android程序开发的调试
(1)编译错误:The method oncreate(Bundle) of type HelloWorld must overrideor implement a supertype method
解决方案:在排除其它的可造成这个编译错误的原因之外。是因为函数没有完全按照大小写来书写,故而会出现这个错误,只要将函数的大小写部分写对就可以了。
(2)call requires API level 11(current mini is 8)
解决方法:修改AndroidManifest.xml,Minisdkversion="8",targetsdkversion="10",如再发生相同错误时又将targetsdkversion="10"改为targetsdkversion="17"。
(3)R cannot be resolved to a variable
解决方案:排除网上说的很多原因。最终更新AndroidSDK后解决问题。
(4)android:View cannot be resolved to a type
解决方案:press Ctrl+Shift+o加载进相应的类。
…….
7 总结
(1)调试
调试可能会由很多的原因组成。当遇到一个不知道是什么错误的时候应该按照网上说的解决方案进行调试,一步步调试直至成功。要学会阅读英文的。
(2)胡思乱想 +移植
要勇敢的想。达到创新的高度(虽然是难了点)。
具有供性的东西,咱在接触了一样之后一定记得将经验和心得移植,以在没有接触过另一事物的情况下做到快速上手。
(3)贴图成品
下载致开发板之上的Android App界面
初次使用java,初次接触android。时间有限,编码一天。所以这个应用肯定是及其羞涩的,往能够激发继续深造的好奇心。听闻,android应用于许多工业只上,望有机会能接触。
此次笔记记录完毕。