1.1 平台简介
Android开发平台由JAVA JDK1.60,eclipse插件,Android SDK模拟平台,以及ADT插件所组成。安装好以上工具之后就可以在没有Android系统手机或者电脑的情况下进行Android应用的开发,下面介绍Android开发平台的搭建的大致步骤。
1.2 安装过程
一:下载安装JAVA JDK1.60版本。(省略)
二:下载eclipse3.5以上版本。
注意:为了后面的离线安装,请使用eclipse 3.5伽利略版本,或者eclipse 3.6 正式版
三:下载一个Android SDK完全包,可以快速进行Android SDK的安装。
四:ADT插件安装,在完成以上步骤后,下载ADT进行离线快速安装。
五:进入eclipse进行必要的配置。出现可以建立Android project,则安装完成。
2 Android应用开发
2.1 Android布局
2.1.1 概述
Android 布局文件存放在res->layout中的xml文件之中。当我们需要对界面进行布局时,就要去写layout中的布局文件,文件写好以后,在代码实现中创建Activity时调用setContentView(R.layout.main);即可实现布局。所有控件与布局以及一切资源Android都会自动在R.java中生成他自己专有的ID,在代码调用时,直接根据其ID进行使用。常用布局有五种:线性布局(LinearLayout)、相对布局(RelativeLayout)、表格布局(TableLayout)、单帧布局(FrameLayout)、绝对布局(AbsoluteLayout),下面将介绍这次所用到的三种布局。Eg见控件部分。
2.1.2 线性布局(LinearLayout)
LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。
LinearLayout常用属性:
android:layout_width定义其布局宽度 android:layout_height定义其布局高度
android:orientation定义其布局排版方向 android:layout_weight定义其布局所占权重
2.1.3 单帧布局(FrameLayout)
它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象,所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充。即可以利用透明度来实现一些控件的叠加效果。所以主要是控制控件的透明度来实现,控件透明度控制通过android:background=”#aabbccdd”,aa:表示透明度aa=255则不透明(在参数中是16进制),bbccdd是RGB命名规则。
2.1.4 相对布局(RelativeLayout)
RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。常用属性有
android:layout_toLeftOf在某一个控件的左边 android:layout_toRightOf在某一个控件的右边
android:layout_alignParentLeft在父控件的左边,同理具有父控件的右边,顶部,底部等属性。
2.2 常用控件
2.2.1 TextView
用于文本的显示
<TextView
android:text="@string/home"
android:background="#ffff00"
android:layout_width="fill_parent"(充满父控件)
android:layout_height="wrap_content"(刚好够文本显示)
android:gravity="center_horizontal"
android:textSize="20px"/>
android:text:显示的文本,android:background:文本框背景,
android:gravity:文本显示位置,android:textSize:文本显示大小
2.2.2 Button
按钮
<Button
android:id="@+id/Button2"
android:layout_width="wrap_content"
android:layout_height="fill_parent">
</Button>
android:id:定义Button控件的ID,其他两个属性见上。
2.2.3 WebView
用于一个网页的显示,与以上两个控件具有相似的属性。在使用此控件时必须注意,在实现我们自己的Activity上网时,必须在manifest.xml文件中进行权限的申请。即加入 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.2.4 EditText
属性和TextView几乎相同,这个控件用来实现文本的获取。
2.2.5 SlidingDrawer
抽屉控件,隐藏屏外的内容,并允许用户通过handle以显示隐藏内容。它可以垂直或水平滑动,它有俩个View组成,其一是可以拖动的handle,其二是隐藏内容的View。它里面的控件必须设置布局,在布局文件中必须指定handle和content。Eg:
<SlidingDrawer
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:handle="@+id/handle"
android:content="@+id/content"
android:orientation="vertical"
android:id="@+id/slidingdrawer">
<ImageButton android:id="@id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/up" />
<LinearLayout android:id="@id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff">
<TextView android:text="这是一个滑动式抽屉的示例"
android:id="@+id/tv"
android:textSize="18px"
android:textColor="#00ff00"
android:gravity="center_vertical|center_horizontal"
android:layout_width="wrap_content"
android:textStyle="bold"
android:layout_height="wrap_content"
>
</TextView>
</LinearLayout>
2.2.6 ImageView
用于图片的显示,图片资源必须在res->drawable中获取。属性同TextView。
2.2.7 ImageButton
能够设计一个任意图形作为我们所需要按键,丰富按键设计。属性同Button,同样图片必须在res->drawable中获取资源。
2.2.8 ViewFlipper
翻转视图,可以简单实现子页面的切换它只需使用addView方法添加几个View,每个View对应的是一个页面,即可完成对于多页面的管理,在android上实现手势的识别也比较简单,可以实现OnTouchListener和OnGuestureListener接口,然后在OnTouch函数中注册GestureDetector来判别手势动作。实现滑动翻页效果,还配合旋转(rotate)、缩放(scale),移动(translate)、淡入淡出(alpha)。Eg
布局文件:<ViewFlipper
android:id="@+id/ViewFlipper01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:persistentDrawingCache="animation"
android:inAnimation="@anim/push_left_in"
android:outAnimation="@anim/push_left_out">
<LinearLayout
android:id="@+id/page_home"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:text="@string/home"
android:background="#ffff00"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20px"/>
<ImageView
android:id="@+id/myImageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/picture1">
</ImageView>
</LinearLayout>
<LinearLayout
android:id="@+id/page_publish"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:text="@string/publish"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ff00ff"
android:textSize="20px"/>
<ImageView
android:id="@+id/myImageView2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/picture2">
</ImageView>
</LinearLayout>
<LinearLayout
android:id="@+id/page_change"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:text="@string/change"
android:background="#00ffff"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20px"/>
<ImageView
android:id="@+id/myImageView3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/picture3">
</ImageView>
</LinearLayout>
</ViewFlipper>
源代码:
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > 90) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
this.flipper.showNext();
return true;
}
else if (e1.getX() - e2.getX() < -90)
{
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
this.flipper.showPrevious();
return true;
}
return false;
}
push_right_in定义:<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0"
android:duration="500" />
<alpha android:fromAlpha="0.1" android:toAlpha="1.0"
android:duration="500" />
</set>
其他简单动画可以类推出来。
2.3 事件监听
2.3.1 匿名内部类
Button_publish.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
while(flipper.getCurrentView().getId()!=R.id.page_publish)
flipper.showNext();
Button_publish.setBackgroundResource(R.drawable.tab_two_highlight);
Button_home.setBackgroundResource(R.drawable.tab_one_normal);
Button_change.setBackgroundResource(R.drawable.tab_one_normal);
Button_more.setBackgroundResource(R.drawable.tab_one_normal);
}
});
2.3.2 普通内部类
//监听器的绑定
Button_publish.setOnClickListener(new mypublishOnClickListener());
//监听器的定义,以及在内部实现事件发生时的处理方法
class mypublishOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
while(flipper.getCurrentView().getId()!=R.id.page_publish)
flipper.showNext();
Button_publish.setBackgroundResource(R.drawable.tab_two_highlight);
Button_home.setBackgroundResource(R.drawable.tab_one_normal);
Button_change.setBackgroundResource(R.drawable.tab_one_normal);
Button_more.setBackgroundResource(R.drawable.tab_one_normal);
}
}
上面两种监听器实现方式是相同的效果的,都是当按下这个按钮后,执行某一个处理事件。