android图片浏览器的开发
Shanghai Dianji University
课程
课程名称: 嵌入式系统设计与运用
姓 名:
班级学号:
指导教师:
完成日期: 2011-6-9
电 子 信 息 学 院
Electronic Information School
2011年 6月
2 嵌入式系统与运用课程设计
目录
目录 ........................................................................................................................................................... 1
一、课程设计目的 ................................................................................................................................... 3
二、课程设计要求 ................................................................................................................................... 3
三、相关知识 ........................................................................................................................................... 3
3.1 Android系统介绍 ............................................................................................................................... 3
3.2 如何搭建Android开发环境 ............................................................................................................. 3 3.3 Android程序APK包的构成 ............................................................................................................. 4 3.4 Activity、常见控件、常见布局方式、Intent ................................................................................... 4 四、课程设计
................................................................................................................................... 6
4.1 程序介绍 ............................................................................................................................................ 6
4.2编程思路 ............................................................................................................................................. 6
五、程序相关代码及截图 ....................................................................................................................... 8 五、程序相关代码及截图 ....................................................................................................................... 9 5.1程序代码: ......................................................................................................................................... 9
5.2程序运行截图: ............................................................................................................................... 13
六、课程设计小结 ................................................................................................................................. 15
2
3 嵌入式系统与运用课程设计
一、课程设计目的
通过本次课程设计,了解Android手机系统平台的基本情况。学习Android开发环境的建立、android程序的编写以及调试。通过编写实例程序,学习Activity的基本概念以及编写
,了解Android几个控件的创建以及调用方法。了解Android系统基本组成以及复习JAVA语言的相关知识。
二、课程设计要求
1.掌握Android开发环境的安装与程序调试。
2.了解Android系统的基本概念与组成。
3.学习Android程序开发的基本方法包括Activity、Intent的基本概念以及系统控件与布局文件的创建与使用。
4.自拟
目利用以上知识点完成一个实例程序。
三、相关知识
3.1 Android系统介绍
Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续进行对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。
2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:华为、中兴、联想等
3.2 如何搭建Android开发环境
1.下载Android SDK
将SDK的目录添加到Windows的path环境变量中
2.下载JDK6
下载并安装Java开发包。
3.下载Eclipse3.5.2
3
4 嵌入式系统与运用课程设计
4.下载Eclipse的Android ADT插件
启动Eclipse,选择【Help】 > 【Soft Updates】 > 【Find and Install„】 选择“Available Software”标签页,点击【Add Site„】按键。添加update站点:这时窗口中新增了;项,选中该项,点击【Install„】按键即可下载。
或者到Android官网去下载这个ADT插件:
下载完成后解压,将“features”和“plugins”目录中的文件拷贝到Eclipse的对应目录中就可以了。
5.重启Eclipse,进行Android SDK设置:
选择【Windows】 > 【Preferences„】打开编辑属性窗口
选择Android属性面板
加入Android SDK的目录(点击【Browse„】进行选择,这里是“android-sdk-windows-1.0_r1”所在的目录)。
3.3 Android程序APK包的构成
一般情况下Android应用程序是由以下四种组件构造而成的:
1.Activity 活动
2.Broadcast Intent Reciver 广播接收器
3.Service 服务
4.Content Provider 内容提供器
需要注意的是,并不是每个Andorid应用程序都必须构建这4个组件,有些可能由这些组件的组合而成。一旦你确定了你的应用程序中需要的组件,那么你就应该在AndroidManifest.xml中列出他们。 这是一个XML配置文件,它用于定义应用程序中需要的组件、组件的功能及必要条件等。这个文件是必须的。
3.4 Activity、常见控件、常见布局方式、Intent
Activity:
Activity是最基本的Andorid应用程序组件,应用程序中,一个Activity通常就是一个单独的屏幕。每一个Activity都被实现为一个独立的类,并且从Activity基类中继承而来, Activity类将会显示由视图控件组成的用户接口,并对事件做出响应。 大多数的应用是由多屏幕显示组成。当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态并且压入历史堆栈中。用户可以通过回退回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个从桌面打开的程序保留在堆栈中
4
5 嵌入式系统与运用课程设计
常见控件:
TextView - 文本显示控件
Button - 按钮控件
ImageButton - 图片按钮控件
ImageView - 图片显示控件
CheckBox - 复选框控件
RadioButton - 单选框控件
AnalogClock - 钟表(带表盘的那种)控件
DigitalClock - 电子表控件
常见布局方式:
1.帧布局 FrameLayout:
是最简单的一个布局对象。在他里面的的所有显示对象爱你过都将固定在屏幕的左上角,不能指定位置,但允许有多个显示对象,只是后一个会直接覆盖在前一个之上显示,会把前面的组件部分或全部挡住。
android:layout_width=”wrap_content” android:layout_height=”wrap_content”>
2.线性布局 LinearLayout:
线性布局是所有布局中最常用的类之一,也是RadioGroup, TabWidget,
TableLayout, TableRow, ZoomControls类的父类。LinearLayout可以让它的子元素垂直或水平的方式排成一行(不设置方向的时候默认按照垂直方向排列)。
3.绝对布局 AbsoluteLayout
绝对定位AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。分辨率不一样的屏幕,显示的位置也会有所不同。
4.相对布局 RelativeLayout
相对布局 RelativeLayout 允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试。
Intent:
在一个Android应用中,主要是由Activity、Broadcast Intent Reciver、Service、Content Provider组成的。而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由Intent协助完成的。
Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
5
6 嵌入式系统与运用课程设计
四、课程设计分析
4.1 程序介绍
程序名称:图片浏览器
运行环境:Android1.6-2.3
“图片浏览器”是一款用于浏览图片的手机小程序,它的主要功能是,通过拖动图片列表的图片来实现图片的浏览功能。
4.2编程思路
第一步:选择API级别、创建项目
在开始开发本程序时首先要明确需要兼容的Android的系统版本,由于不同的Android系统版本所支持的API的等级不同。如果勾选的API版本太高将影响程序的兼容范围,很多低版本的Android设备可能无法使用本程序。如果勾选的API太低,有许多高级的控件以及方法将无法被调用,以至于无法实现程序的一些功能。所以正确的选择API级别非常重要。由于本程序比较简单,考虑到高版本兼容低版,所以API的最低兼容级别选择4。
第二步:建立Activity以及编写布局文件
本软件需要两个Activity来实现基本功能。第一个Activity用于欢迎界面(demo),用于提示用户的一些操作。第二个Activity(ImageSwitcher1)是供用户浏览图片。这个Activity用于整个程序功能比较简单,用到的控件主要是ViewFlipper,Gallery,以及ImageSwitcher等一些基本的控件,使用相对布局模式。
图4.1
6
7 嵌入式系统与运用课程设计
第三步:基本算法
一、重要方法
setAdapter(ListAdapter adapter):设置图片源
setImageResource(int):设置ImageView资源
setLayoutParams(ViewGroup.LayoutParams params) :设置显示布局图片(长宽适应屏幕大小) setBackgroundResource(int) :指定默认背景
setInAnimation(Context context, int resourceID) :设置View进入屏幕时候使用的动画 设置动画效果
在imageSwitcher控件中加入setOnItemSelectedListener事件实现图片的拖拉切换
第四步:图片拖拉过程的代码
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
mSwitcher.setInAnimation(slideLeftIn);//设置View进入屏幕时候使用的动画
mSwitcher.setOutAnimation(slideLeftOut);
g_position++;
if(g_position>mImageIds.length )
g_position = 0;
if(0>g_position )
g_position = mImageIds.length;
mSwitcher.setImageResource(mImageIds[g_position]);
//viewFlipper.showNext();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
7
8 嵌入式系统与运用课程设计
mSwitcher.setInAnimation(slideRightIn);
mSwitcher.setOutAnimation(slideRightOut);
g_position--;
if(0>g_position )
g_position = mImageIds.length;
if(g_position>mImageIds.length )
g_position = 0;
mSwitcher.setImageResource(mImageIds[g_position]);
第五步:软件流程图
主界面(demo
Activity)
点击按钮
浏览界面
ImageSwitcher1 (
Activity)
ImageSwitcher Gallery 显示
SimpleOnGestureListener
获得动作
获得图片
setOnItemSelectedListener
8
9 嵌入式系统与运用课程设计
五、程序相关代码及截图
5.1程序代码:
主界面
package com.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle; import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;
import android.widget.TextView;
public class demo extends Activity implements OnClickListener{
/** Called when the activity is first created. */
private Button bt = null;
private TextView aboutView =null;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt = (Button)findViewById(R.id.bt);
bt.setOnClickListener(this);
bt.setText(R.string.start); }
@Override
public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub
if(item.getItemId() == 1){
finish(); }
if(item.getItemId() == 2){
aboutView = (TextView)findViewById(R.id.aboutView); aboutView.setText(R.string.abouttext);
} return super.onOptionsItemSelected(item);
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, 1, 1, R.string.exit); menu.add(0, 2, 2, R.string.about);
return super.onCreateOptionsMenu(menu);
} public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) { case R.id.bt:
Intent intent = new Intent(this,com.demo.ImageSwitcher1.class);
startActivity(intent);
break;
} }
}
9
10 嵌入式系统与运用课程设计
浏览界面
package com.demo;
import android.app.Activity;
import android.content.Context; import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent; import android.view.View;
import android.view.ViewGroup;
import android.view.Window; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery; import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewFlipper; import android.widget.ViewSwitcher;
import android.widget.Gallery.LayoutParams;
public class ImageSwitcher1 extends Activity implements
AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory {
private ImageSwitcher mSwitcher;
private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private Animation slideLeftIn; private Animation slideLeftOut;
private Animation slideRightIn;
private Animation slideRightOut; private ViewFlipper viewFlipper;
private GestureDetector gestureDetector; View.OnTouchListener gestureListener;
public int g_position = 0;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.image_switcher_1);
mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
mSwitcher.setFactory(this);
mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));
Gallery g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));//设置图片源(小图片) g.setOnItemSelectedListener(this);
//-------------
viewFlipper = (ViewFlipper)findViewById(R.id.flipper); slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out);
10
11 嵌入式系统与运用课程设计
slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out);
gestureDetector = new GestureDetector(new MyGestureDetector()); gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
} return false;
}
}; }
public void onItemSelected(AdapterView parent, View v, int position, long id) { mSwitcher.setImageResource(mImageIds[position]);
g_position = position;
}
public void onNothingSelected(AdapterView parent) {
}
public View makeView() {
ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);//把图片按比例扩大/缩小到View的宽度,居中显示 i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));//布局参数设置
return i; }
public class ImageAdapter extends BaseAdapter {
private Context mContext;//图片源
public ImageAdapter(Context c) { //声明ImageAdapter
mContext = c;
}
public int getCount() { //获取图片的个数
return mThumbIds.length; }
public Object getItem(int position) { //获取图片在库中的位置 return position;
}
public long getItemId(int position) { //获取图片在库中的位置
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mThumbIds[position]); //设置ImageView资源
i.setAdjustViewBounds(true); i.setLayoutParams(new Gallery.LayoutParams( //设置显示布局图片(长宽适应屏幕大小)
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
i.setBackgroundResource(R.drawable.picture_frame); //指定默认背景 return i;
}
}
11
12 嵌入式系统与运用课程设计
class MyGestureDetector extends SimpleOnGestureListener {
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
mSwitcher.setInAnimation(slideLeftIn);//设置View进入屏幕时候使用的动画
mSwitcher.setOutAnimation(slideLeftOut); g_position++;
if(g_position>mImageIds.length )
g_position = 0; if(0>g_position )
g_position = mImageIds.length;
mSwitcher.setImageResource(mImageIds[g_position]);
//viewFlipper.showNext();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
mSwitcher.setInAnimation(slideRightIn);
mSwitcher.setOutAnimation(slideRightOut); g_position--;
if(0>g_position )
g_position = mImageIds.length; if(g_position>mImageIds.length )
g_position = 0;
mSwitcher.setImageResource(mImageIds[g_position]); //viewFlipper.showPrevious();
}
} catch (Exception e) { // nothing
}
return false; }
}
@Override
public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event))
return true;
else return false;
}
private Integer[] mThumbIds = {
R.drawable.sample_thumb_0, R.drawable.sample_thumb_1,
R.drawable.sample_thumb_2, R.drawable.sample_thumb_3, R.drawable.sample_thumb_4, R.drawable.sample_thumb_5,
R.drawable.sample_thumb_6, R.drawable.sample_thumb_7};
private Integer[] mImageIds = {
R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7}; }
12
13 嵌入式系统与运用课程设计
5.2程序运行截图:
图1 开机界面
图2 点击MENU
13
14 嵌入式系统与运用课程设计
图3 点击关于
图4 点击“开始浏览”按钮
14
15 嵌入式系统与运用课程设计
六、课程设计小结
此次课程设计我们小组选择的课题是基于Android系统的图片浏览器的设计与开发。Android系统对于我来说还是十分的陌生,以前并没有接触过Android系统,对它是一无所知。为了进行此次的课程设计,自己在同学的帮助下在我自己的的电脑上面安装了Android系统以及Android手机系统软件开发平台,并且安装了eclipse,对图片浏览器程序进行开发和设计。通过本次的课程设计,我对于Android的安装以及Android开发环境的建立、android程序的编写有了很大的了解,并且通过使用eclipse以及Android手机系统平台对图片浏览器的开发使我学习了Activity的基本概念以及编写方法,了解Android几个控件的创建以及调用方法,了解Android系统基本组成以及复习JAVA语言的相关知识。
本次的程序开发应用的是Eclipse3.5.2,jdk1.6.0_07,以及android各个版本虚拟机和API(截图的虚拟机版本是1.6,API Level为4),整个工程一共涉及了两个Activity:显示主界面Activity(demo)、显示浏览界面的Activity(ImageSwitcher1),通过主界面的一个按钮(Button)“开始浏览”在两个Activity上进行跳转。主界面由TextView、Button、menu控件组成,采用LinearLayoutx线性布局,Button用来跳转到浏览界面,menu用来退出程序或者显示软件详情。
我主要是进行图片浏览器界面的Gallery以及ImageSwitcher的设计,ImageSwithcer是用来图片显示那块区域的控件,Gallery是来控制底下那个图标索引列表索引用的。Gallery是Android中的图片库控件,在中心锁定,水平显示列表的项,用反射机制来动态读取资源中的图片,是用来显示缩略图(进行图片选择)。ImageSwitcher是Android中控制图片展示效果的一个控件,在Windows 平台上要查看多张图片,最简单的办法就是通过 "Window 图片和传真查看器“在 ”下一张“ 和”上一张“之间切换,Android平台上可以通过 ImageSwitcher 类来实现这一效果。ImageSwitcher 类必须设置一个ViewFactory,主要用来将显示的图片和父窗口区分开来,因此需要实现ViewSwitcher.ViewFactory接口,通过makeView()方法来显示图片,这里会返回一个ImageView 对象,而方法 setImageResource用来指定图片资源,setImageURI(Uri uri)用来设置图片地址,setImageDrawable(Drawable drawable)用来绘制图片。总体上两个控件是通过setOnItemSelectedListener和SimpleOnGestureListener监听手指触摸的动作变化来判断,再进行图片数组选择并显示。
此次课设,自我感觉还是十分的辛苦,主要因为对于android系统的以及eclipse的不熟悉还有对于JAVA的不精通,上学期的java课程学习到的知识基本上忘记了许多,自己又重新翻开书本进行学习。 Android开发环境的搭建与基本的Helloworld程序调试是在同学的帮助之下完成的,耗时将近一天时间。然后又下载了许多关于android系统软件开发和控件使用的讲解视频,通过对视频的学习,以及网上的各种资料还有android和eclipse自带的系统帮助,最终还是完成了本次的课程设计,本次课程设计离不开我们小组各位成员的努力,虽然只是一个很简单的图片浏览器的设计和开发,界面以及功能等和正版的软件还有很大的差距,但是我们最终成功的设计出了软件,这是值得我们庆幸的,这意味着我们在软件开发的方面卖出了一小步。但是,我们还需要进行更加深入的学习,希望自己以后会有更多的实践的机会,同时在此也要谢谢老师的指导。
15