Android开发的基础常识二之程序解读

来源:互联网 发布:linux从u盘复制文件 编辑:程序博客网 时间:2024/05/16 08:02

前言:虽然写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"是个"公开"的方法,可以由 Gesture 类别外部取用。方法的回传值的型别,即是这个方法的型别。"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;
       } 
  
}



}

0 0