Android开发的基础常识二之程序解读
前言:虽然写android开发时间也有半年之久,但是对于用java开发出自己的代码还是比较薄弱,因为自己都是看例程已有的代码或者看视频中按部就班来运行,更注重的是结果。所以想就一篇例程来详细注释每一行代码的意思,了解android编程的特点,同时对于Java面向对象的特点展示出来,就有了此片文章,所以面对的读者都是基础学者,希望一起学习,一起进步,欢迎评论。
本文建立在获取手势的例程上:
1、src目录下的.java文件是完成事务,也就是自己编写的主要代码,其内容如下:
package com.example.gesturetest; //建立工程时,新建立的包文件,分别有com、example、gesturetest三个子文件夹,指出这个档桉所在的名称空间
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
//程序中预设导入了 "android.app.Activity"跟"android.os.Bundle"两个
Package,在所有的 Android 应用程序中都会用到这两个 Package。"import"(导入)是用作导入Package
的关键字。在 Java 语言中,使用到任何 API 前都要事先导入相对应的 Package。我们马上将学到这两个 Package 的用途。Android
支援的 Package 与标准的 Java(j2se) 不尽相同。在写 Android 应用程序时,你偶而可能需要参考可用的 API 列表,以确认使用到的 Package 是否有内建支援。后续章节中也将讲解如何透过新增"jar"档来呼叫额外的
Package。完整的 API 可查阅官方的 package 列表:http://code.google.com/android/reference/packages.html
public class Gesture extends Activity
//第 6 行开始了程序的主体。其组成是这样的:代码:public class Gesture"Gesture"是这个类别的名称。"class"则是用作宣告类别关键字。"private"关键字是用来修饰"Gesture"这个类别。表示"Gesture"是个"私有"的类别,不可以从 package 外部取用。"public class Gesture"后面再加上"extends Activity"叙述,则表示 "Gesture"这个类别的功能、型别等全继承自"Activity"类别。"extends"是继承(Inherit)类别的关键字。"Activity"是 来自于我们在第 3 行刚导入的 Package。因此整句话的含意即:"宣告一个私有的 Gesture 类别。这个 Gesture 类别继承了程序开头导入的 Activity 类别"。"{}"大括号规范了一个程序区块。大括号中的程序表达的这个程序区块的主要内容。
{
private Button mButton; //private定义了私有的成员变量,Button是继承类下来的关键字,所以重新定义了一个Button按钮的变量
private GestureDetector mGestureDetector; //同上,定义了一个新的手势检测的新成员变量。
@Override
//表示重写父类函数的方法
protected void onCreate(Bundle savedInstanceState)
// "onCreate"是这个方法的名称。"void"则是宣告了这个方法的回传值的型别(type)。"public"关键字是用来修饰"onCreate"这个方法。表示"onCreate"是个"公开"的方法,可以由
bmi 类别外部取用。方法的回传值的型别,即是这个方法的型别。"onCreate"这个方法使用"void"型别,表示
"onCreate"这个方法不需回传值。同时,这个方法传入了一个名为"savedInstanceState"的"Bundle"型别参数,"Bundle"型别正是来自我们前面所导入的
Package 之一。我们并不需要知道太多"Bundle"型别或"savedInstanceState"实体的细节,只要知道"Bundle"的内容与手机平台的记
忆体管理有关(Bundle一般用于携带数据、数据传送)。当 Android 应用程序启动、换到背景等待、关闭时,都会用到 "savedInstanceState"这个实体来处理记忆体相关的事宜。当然,你也可以用其他名称来代替它。还好"onCreate"这个方法永远都
是传入"Bundle savedInstanceState"这个参数,写应用程序时只要正确照规定传入即可,你可以不用太去在意它。给对 Bundle 是什么有兴趣的读者:"Bundle"可以保存程序上一次关闭(冻结)时的状态。你可以透过覆写
onFreeze 方法(与onCreate 方法的作用类似) 来保存冻结前的状态。 当程序启动(Activity 重新初始化)时,会再次呼叫 onCreate 方法,你就能从 savedInstanceState
中得到前一次冻结的状态。我们也可以透过"Bundle"来将这个 Activity 的内容传到下一个 Activity 中。 之后讲Activity 时,也会讲解 onCreate/onFreeze 等方法的关系。
{
super.onCreate(savedInstanceState);
//"super"是关键字。代表着这个 "Bmi"类别的上层类别(Activity)。"super.onCreate(savedInstanceState);"的意思就是:"执行 Activity 类别中 onCreate
方法的内容"。这麽做的目的是什么呢?Google Android 将其应用程序的界面称为视图 (View),而负责控制各种动作行为的程序主体(Controller),则称为活动(Activity)。因此一个
Android 应用程序,必定会对应到一个以上的 Activity。 "onCreate" 方法则是每个 Activity 类别初始化时都会去呼叫
的方法。我们想做的事,是保持原本"onCreate" 方法预设的动作,然后在其中加入我们想要的内容。而 Android
产生的程序预设却覆载(@Override)了"Bmi" 类别的"onCreate" 方法。原本继承自"Activity"类别的"onCreate"方法,其原本内容都被覆载掉了。因此想将原本的"onCreate"方法内容保留,并在
其中加入我们的内容的话,就要使用"super"语句。当程序运行到我们覆写的"onCreate"方法时,透
过"super.onCreate(savedInstanceState);"语句,会先将
原本"Activity"类别中的"onCreate"方法 执行一次,然后再执行我们覆写的"onCreate"方法里面其他的程序内容。我们要执行原本的"onCreate"方法时,仍然需要提 供原本"onCreate"方法所需的传入参数。因此"super.onCreate(savedInstanceState);"语句中,我们
将"savedInstanceState"这个参数传入原本的"onCreate"函式中。"savedInstanceState"是我们 在"public void onCreate(BundlesavedInstanceState)"语句中所宣告的传入参数。
setContentView(R.layout.activity_gesture);
//透过萤幕显示的各种元素是按照界面层次结构来描述的。要将一个显示元素的层次结构转换显示到一个萤幕上,Activity 会呼叫它用来设定 View 的 "setContentView" 方法,并传入想引用的 XML 描述文件。当 Activity 被启动并需要显示到萤幕上时,系统会通知Activity,并根据引用的 XML 文件叙述来描绘出使用者界面。上一章中我们定义好的res/layout/main.xml 描述档,就是透过这个机制绘出到萤幕上。setContentView 方法也可以在 Activity 类别中找到。你可能也注意到 "setContentView" 方法确实是透过 "R.layout.main"来引用 XML 文件描述档的资源,而不是直接透过 res 目录来引用。
mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
//新建一个GestureDetector类型的mGestureDetector和MyOnGestureListener()
mButton = (Button) findViewById(R.id.btn_textgesture);
//通过findViewById方法来获取来自.xml中的Button按钮mButton
mButton.setOnTouchListener(new OnTouchListener() //为按钮添加触摸监听器
{
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(getClass().getName(), "onTouch-----" + getActionName(event.getAction()));
//使用包中的log函数来查看输出
mGestureDetector.onTouchEvent(event);
//同时也绑定手势检测的监听器
// 一定要返回true,不然获取不到完整的事件
return true;
}
});
}
//自定义获取名称的成员函数
private String getActionName(int action)
{
String name = "";
switch (action) {
case MotionEvent.ACTION_DOWN: {
name = "ACTION_DOWN";
break;
}
case MotionEvent.ACTION_MOVE: {
name = "ACTION_MOVE";
break;
}
case MotionEvent.ACTION_UP: {
name = "ACTION_UP";
break;
}
default:
break;
}
return name;
}
class MyOnGestureListener extends SimpleOnGestureListener implements OnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(getClass().getName(), "onSingleTapUp-----" + getActionName(e.getAction()));
return false;
}
//复写类MyOnGestureListener中的函数,利用log输出查看所检测到的手势
@Override
public void onLongPress(MotionEvent e) {
Log.i(getClass().getName(), "onLongPress-----" + getActionName(e.getAction()));
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i(getClass().getName(),
"onScroll-----" + getActionName(e2.getAction()) + ",(" + e1.getX() + "," + e1.getY() + ") ,("
+ e2.getX() + "," + e2.getY() + ")");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i(getClass().getName(),
"onFling-----" + getActionName(e2.getAction()) + ",(" + e1.getX() + "," + e1.getY() + ") ,("
+ e2.getX() + "," + e2.getY() + ")");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.i(getClass().getName(), "onShowPress-----" + getActionName(e.getAction()));
}
@Override
public boolean onDown(MotionEvent e) {
Log.i(getClass().getName(), "onDown-----" + getActionName(e.getAction()));
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i(getClass().getName(), "onDoubleTap-----" + getActionName(e.getAction()));
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i(getClass().getName(), "onDoubleTapEvent-----" + getActionName(e.getAction()));
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(getClass().getName(), "onSingleTapConfirmed-----" + getActionName(e.getAction()));
return false;
}
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。