图片浏览器大作业_第1页
图片浏览器大作业_第2页
图片浏览器大作业_第3页
图片浏览器大作业_第4页
图片浏览器大作业_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件技术系列课程Android大作业( 2014/ 2015学年 第 一 学期) 课 题 图片浏览器 专 业 软件工程(计算机软件与服务外包) 学号 姓名 指 导 教 师 张怡婷 易磊 许鹏 指 导 单 位 南京邮电大学计算机学院 诚迈科技 日 期 2014 年 12 月 31 日 1、 实验背景以往的手机图片浏览器,通常是使用键盘键,即上下左右按钮实现不同图片的切换,操作上很不友好。而且现如今移动通信技术日新月异,各类触屏手机层数不穷,用户需求渐渐变高,以往的操作方式已经不能满足用户对应用的要求。不仅仅在实用性上,还包括简单、快捷、人性化的操作。所以开发一款针对触屏的手机的图片浏览器是很有必

2、要的。 本文主要阐述以面向对象的程序开发语言JAVA,eclipse作为开发集成环境,基于智能手机Android操作系统之上设计一个图片浏览器。该图片浏览器主要实现本地图片的浏览,并能查看浏览历史。借助Android系统的全触摸的形式,增强用户的体验。用户可以用简单、快捷、人性化的操作浏览图片。2、 开发环境开发环境是安卓平台,windows系统,运行环境是安卓真机。开发环境的搭建:1:安卓环境的配置1. 下载JDK JDK即Java Development Kit(Java开发工具包),包括JAVA运行环境,基础类库和JAVA工具,是JAVA运行的基础。2. 下载EclipseEclipse

3、是开发JAVA程序的软件工具。3. 下载Android SDKSDK即Software Development Kit(软件开发工具包)。Android SDK 指的是Android专属的软件开发工具包。4. 下载ADTADT,即Android Development Tools(Android开发工具),是在eclipse中开发android应用程序的插件。5. 安装JDK运行下载好的jdk-7u25-windows-x64.exe,按提示一步步走。6. 测试是否安装成功安装完成之后,可以用下述方法检查JDK是否安装成功:打开cmd窗口,输入java -version 。7. 添加环境变量操

4、作步骤:计算机->属性->高级系统设置->环境变量->系统变量->Path->编辑添加JDK的bin目录的路径。8. 安装Android SDK以前SDK直接下载完,在Eclipse里配置路径就可以了,现在貌似变成了一个管理器(SDK Manager),用来管理下载更新,双击之前下载的installer_r22.0.1-windows.exe。9. 安装SDK Manager10. 安装Platform仅仅SDK Tools是不够的,我们至少还需要一个Android平台和最新的SDK 平台工具。启动Android SDK Manager,如下图,勾选Andr

5、oid SDK Platform-tools和Android SDK Build-tools,Android 4.2.2文件夹,Extras下的Android Support Library。11添加环境变量操作步骤:计算机->属性->高级系统设置->环境变量->系统变量->新建变量名:ANDROID_SDK_HOME添加SDK目录的路径。12. 安装Eclipse,选择工作空间。13. 配置ADT点击Help->Install new Software,然后Add->Archive->找到我们下载好的ADT-22.0.1.zip,同时给个名称,

6、如ADT Plugin14. 配置SDK。截图如下:3、 需求分析图片浏览器:1、实现两种图片浏览模式:列表模式和幻灯片模式;2、列表模式中显示图片名称、像素大小、缩略图;3、实现修改图片名称的功能;4、幻灯片模式下用户可以通过滑动屏幕切换浏览不同图片。5、菜单栏目,可以退出、进入幻灯片模式以及显示版本信息。4、 概要设计1:功能模块2:整体的类以及界面之间的关系:MainActivity.java(activity.xml/simple.xml/main.xml)->ImageShow.java/ChangeSql.java/ActivityGallery.javaActivityGa

7、llery.java(activity02.xml/main2.xml)->MainActivity.javaChangeSql.java(activity03.xml)->MainActivity.javaImageShow.java(activity01.xml/popmenu.xml)5、 详细设计1:图片显示功能ImageShow.java1 public class ImageShow extends Activity implements Runnable /取出图片Bitmap bmp;/获取位图 protected void onCreate(Bundle save

8、dInstanceState)当一个Activity在PAUSE时,被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息。2 Button btnPopupMenu = (Button) findViewById(R.id.button1);/弹出窗口菜单 btnPopupMenu.setOnClickListener(new Button.OnClickListener() SuppressLint("NewApi") public void onClick(View v) /接口函数 PopupMenu popup =

9、 new PopupMenu(ImageShow.this, v);/创建popup menu MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.popmenu,popup.getMenu(); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() Overridepublic boolean onMenuItemClick(MenuItem arg0) / TODO Auto-generated metho

10、d stubAlertDialog dialog=new AlertDialog.Builder(ImageShow.this).setTitle("退出提示").setMessage("你确定要退出?").setPositiveButton("确定", new DialogInterface.OnClickListener()/OnClickListener是DialogInterface的一个内部接口Overridepublic void onClick(DialogInterface dialog, int which) / T

11、ODO Auto-generated method stubImageShow.this.finish();/图片显示活动结束).setNegativeButton("取消", null).create(); dialog.show();/对话框显示return false; ); popup.show();/弹出菜单显示 );2:修改图片名字ChangeSql.java1 public class ChangeSql extends Activity Button button2;/按键定义EditText ev;/文本框定义int id;/定义id地址SQLiteDat

12、abase db;/数据库public ChangeSql() / TODO Auto-generated constructor stub 这段代码主要是定义变量。数据库创建在Main activity之中,然后就是使用数据库实现应用程序功能了。基本的操作包括创建、读取、更新、删除,即我们通常说的CRUD(Create, Read, Update, Delete)。在实现这些操作的时候,我们会使用到比较重要的类SQLiteDatabase类。 SQLiteDatabase这个类是核心类,用于管理和操作SQLite数据库,几乎所有的数据库操作,最终都将由这个类完成。Cursor类主要用于保存查

13、询返回的结果,提供随机读、写的功能。2 public boolean onKeyDown(int keyCode, KeyEvent event) /定义参数/ TODO Auto-generated method stubIntent intent=new Intent();/初始化intent.setClass(ChangeSql.this, MainActivity.class);startActivity(intent);/使用intent启动activityChangeSql.this.finish();/图片名称修改活动结束return super.onKeyDown(keyCod

14、e, event);/返回值参数keyCode,该参数为被按下的键值即键盘码,手机键盘中每个按钮都会有其单独的键盘码,在应用程序都是通过键盘码才知道用户按下的是哪个键。参数event,该参数为按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。返回值,该方法的返回值为一个boolean类型的变量,当返回true时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返 回false时,表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理。3 prote

15、cted void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity03);/设置这个这句话所在的Activity采用R.layout下的activity03布局文件进行布局Intent intent = this.getIntent(); /数据传递 id=intent.getExtras().getInt("id");/获取图片地址button2=(Button)findViewById(R.id.button2)

16、;/按键设置ev=(EditText)findViewById(R.id.editText1);/事件为弹出编辑文本框button2.setOnClickListener(new Button.OnClickListener()Override在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了。这时候,就需要有种机制,能保存当时的状态,这就是savedInstanceState的作用。当一个Activity在PAUSE时,被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息(在pause

17、d状态时,要被KILLED的时候)。4 public void onClick(View v)OnClick 是android.view.View.OnClickListener这个接口中的函数,设置了按钮监听,当点击按钮的时候,就会进入到OnClick函数中,然后通过按钮ID找到对应的按钮做操作。5 实现功能:长按选中条目,弹出窗口,可以进行图片名字的修改。点击ok键进行确认。 public void onClick(View v) / TODO Auto-generated method stubString name=ev.getText().toString();trydb=SQLit

18、eDatabase.openOrCreateDatabase(ChangeSql.this.getFilesDir().toString()+"/my.db3", null); Cursor cursor=db.rawQuery("Select * from news_inf", null);/用于保存查询返回的结果 if(cursor.getCount()>0) int r1=cursor.getColumnIndex("news_id");/定义整型变量 cursor.moveToFirst();/将 cursor移动到第一

19、条记录上 for(int i=0;i<cursor.getCount();i+) String s1=cursor.getString(r1); int temp=Integer.valueOf(s1).intValue(); if(temp=id) ContentValues cv = new ContentValues(); cv.put("news_picname", name);/输入新名称 String ss=String.valueOf(id);/将id转化成String类型赋值给ss db.update("news_inf", cv,

20、 "news_id=?", new Stringss);/数据库更新 break; cursor.moveToNext();/从指向第一条记录之前向后移动一个位置变为刚好指向第一条记录位置 catch(SQLiteException se) db.execSQL("create table news_inf(_id integer primary key autoincrement,"+"news_picname varchar,"+"news_id varchar,"+"news_size varcha

21、r)"); Intent intent=new Intent();intent.setClass(ChangeSql.this, MainActivity.class);startActivity(intent);ChangeSql.this.finish();3:幻灯片模式ActivityGallery.java Layout文件里面用到了两个控件ImageSwitcher和Gallery ,ImageSwitcher用于显示全图,Gallery用来显示缩略图。 利用Gallery控件中,首先是需要定义一个BaseAdaper的子类来操作控制图片资源,然后在主类中通过gallery

22、.setAdapter(new ImageAdapter(this);来使用这个控制类,设置gallery适配器。 在ImageSwitcher中,需要实现ViewFactory这个接口,这个接口里有个方法makeView,可以产生用来显示图片的view。ImageSwitcher调用过程是首先要有一个Factory为它提供一个View,然后ImageSwitcher就可以初始化各种资源了。在使用ImageSwitcher之前,一定要调用setFactory方法,否则setImageResource这个方法会报空指针异常。同时使用这个方法:is.setImageResource(mImageI

23、dsposition);实现了图片在ImageSwitcher中的切换。部分代码如下:public class ActivityGallery extends Activity implementsOnItemSelectedListener, ViewFactory /实现ViewFactory接口private ImageSwitcher is;private Gallery gallery;private Integer mThumbIds = R.drawable.pic1,R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,R.drawab

24、le.pic5,R.drawable.pic6,R.drawable.pic7,R.drawable.pic8,R.drawable.pic9,R.drawable.pic10,R.drawable.pic11;/定义大图资源private Integer mImageIds = R.drawable.pic1,R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,R.drawable.pic5,R.drawable.pic6,R.drawable.pic7,R.drawable.pic8,R.drawable.pic9,R.drawable.pic1

25、0,R.drawable.pic11;/定义小图资源Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); /设置窗体无标题setContentView(R.layout.activity02);is = (ImageSwitcher) findViewById(R.id.switcher); /设置Im

26、ageSwitcher对象的数据源is.setFactory(this); / 设置显示图片is.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in); /设置图片进入时的滑动效果,淡入is.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out); /设置图片退出时的滑动效果,淡出gallery = (Gallery) findViewById(R.id.gallery); /定义 Gallery 控件gall

27、ery.setAdapter(new ImageAdapter(this); /设置Gallery的适配器gallery.setOnItemSelectedListener(this); /设置Gallery的鼠标监听(当鼠标滚动时触发事件)Overridepublic View makeView() /实现ViewFactory方法ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000); /设置背景颜色i.setScaleType(ImageView.ScaleType.FIT_CENTER); /设置比例类型,

28、把图片按比例扩大或缩小到ImageView的宽度,居中显示i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); /设置控件ImageSwitcher的layoutParams为自动适应大小return i; /将所有图片显示通过ImageView来显示public class ImageAdapter extends BaseAdapter /Gallery的适配器public ImageAdapter(Context c) mContext

29、 = c;public int getCount() /获取图片的个数return mThumbIds.length;public Object getItem(int position) /获取图片在库中的位置return position;public long getItemId(int position) /获取图片在库中的位置return position;SuppressWarnings("deprecation")public View getView(int position, View convertView, ViewGroup parent) Imag

30、eView i = new ImageView(mContext);i.setImageResource(mThumbIdsposition);/从mThumbIds取得图片IDi.setAdjustViewBounds(true); /自动适应视图大小i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); /设置布局 图片自动适应大小显示return i; private Context mContext;Overridepublic void onIt

31、emSelected(AdapterView<?> parent, View view, int position,long id) is.setImageResource(mImageIdsposition); /从mThumbIds取得图片ID 实现图片切换Overridepublic void onNothingSelected(AdapterView<?> parent) / TODO Auto-generated method stubpublic boolean onCreateOptionsMenu(Menu menu) / Inflate the men

32、u; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main2, menu); /添加main.xml中的菜单 return true;public boolean onOptionsItemSelected(MenuItem item) /响应菜单的方式:每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。super.onOptionsItemSelected(item); switch (item.getItemId() case R.id.abou

33、t: /点击“关于”,显示“安卓大作业”,并有返回按钮 AlertDialog dialog1=new AlertDialog.Builder(ActivityGallery.this). setTitle("关于").setMessage("安卓大作业").setPositiveButton("返回", null).create(); dialog1.show(); break; case R.id.exit: /点击“退出”,跳出退出提示“你确定要退出?”并有确定和取消按钮 AlertDialog dialog=new Alert

34、Dialog.Builder(ActivityGallery.this).setTitle("退出提示"). setMessage("你确定要退出?").setPositiveButton("确定", new DialogInterface.OnClickListener()Overridepublic void onClick(DialogInterface dialog, int which) / TODO Auto-generated method stubActivityGallery.this.finish(); /点击确定

35、,结束).setNegativeButton("取消", null).create(); dialog.show(); break; case R.id.listview: /点击“列表视图”,退出幻灯片,显示图片列表 Intent intent=new Intent(); intent.setClass(ActivityGallery.this, MainActivity.class); startActivity(intent); ActivityGallery.this.finish(); break; default: break; /对没有处理的事件,交给父类来处

36、理 return true; /返回ture表示处理完菜单项的事件,不需要将该事件继续传播下去了4:主界面MainAcitivity.java1 通知的设置,基本的使用方式就是用新建一个Notification对象,然后设置好通知的各项参数,然后使用系统后台运行的NotificationManager服务将通知发出来。步骤:<1>得到NotificationManagerm_NotificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); <2>创建一个新的Notificat

37、ion对象m_Notification=new Notification(); <3>填充Notification属性mContext=getApplicationContext();2 用于显示list列表setContentView(R.layout.activity);list=(ListView)findViewById(R.id.listView1);ArrayList<HashMap<String,Object>>listItem=new ArrayList<HashMap<String,Object>>();3 数据库处

38、理步骤:<1>打开或创建数据库db=SQLiteDatabase.openOrCreateDatabase(MainActivity.this.getFilesDir().toString()+"/my.db3", null); <2>try/代码区catch(Exeception e)/异常处理;代码区如果有错误,则会返回所写异常的处理 try /将每张图片的id、name、size对应到simple.xml Cursor cursor=db.rawQuery("Select * from news_inf", null);/执

39、行select语句,Cursor 是每行的集合 if(cursor.getCount()>0)/cursor中的行数 int r1=cursor.getColumnIndex("news_picname");/ 根据name的名称获得它的列索引 int r2=cursor.getColumnIndex("news_size"); id=id1=R.drawable.pic1; cursor.moveToFirst();/定位第一行 for(int i=0;i<cursor.getCount();i+) String s1=cursor.get

40、String(r1);/获取数据库picname的值 String s2=cursor.getString(r2);/获取数据库size的值 HashMap<String,Object> map=new HashMap<String,Object>(); map.put("imageView1", id);/通过put来插入id、name、size map.put("textView1",s1); map.put("textView2",s2); listItem.add(map); id+; cursor.m

41、oveToNext();/cursor移到下一行 catch(SQLiteException se) /出错处理,即数据库创建失败或没有数据库 db.execSQL("create table news_inf(_id integer primary key autoincrement,"+"news_picname varchar,"+"news_id varchar,"+"news_size varchar)");/创建数据库,表中包括id,name,size/execSQL()方法可以执行insert、del

42、ete、update和CREATE TABLE之类有更改行为的SQL语句 id=id1=R.drawable.pic1; for(int i=0;i<10;i+) tName=mContext.getResources().getResourceName(id); tName=tName.substring(tName.lastIndexOf('/')+1);/获取id Bitmap bmp=(getResouBitmapFactory.decodeResourcerces(),id); size=bmp.getWidth()+"*"+bmp

43、.getHeight(); /size显示模式 String sId=String.valueOf(id); /将id转换成字符串 db.execSQL("insert into news_inf values(null,?,?,?)",new StringtName,sId,size); id+; /在数据库插入10行id,size id=id1; Cursor cursor=db.rawQuery("Select * from news_inf", null);/创建数据库之后,再执行将每张图片的id、name、size对应到simple.xml i

44、f(cursor.getCount()>0) int r1=cursor.getColumnIndex("news_picname"); int r2=cursor.getColumnIndex("news_size"); id=id1=R.drawable.pic1; cursor.moveToFirst(); for(int i=0;i<cursor.getCount();i+) String s1=cursor.getString(r1); String s2=cursor.getString(r2); HashMap<Strin

45、g,Object> map=new HashMap<String,Object>(); map.put("imageView1", id); map.put("textView1",s1); map.put("textView2",s2); listItem.add(map); id+; cursor.moveToNext(); 4 接2用于显示list列表listItemAdapter = new SimpleAdapter(this,listItem,R.layout.simple, new String &qu

46、ot;imageView1","textView1", "textView2", new intR.id.imageView1,R.id.textView1,R.id.textView2);list.setAdapter(listItemAdapter);/显示list内容5 点击list中的列会转向ImageShow.class list.setOnItemClickListener(new AdapterView.OnItemClickListener()/添加点击事件SuppressWarnings("deprecation&q

47、uot;)Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) / TODO Auto-generated method stubDisplayToast("选中了第"+Integer.toString(arg2+1)+"张图片");/显示m_Notification.icon=R.drawable.ic_launcher;m_Notification.tickerText="选中了第"+Integer.toS

48、tring(arg2+1)+"张图片"m_Notification.setLatestEventInfo(MainActivity.this,"AndroidText4", "选中了第"+Integer.toString(arg2+1)+"张图片", null);(NotificationManager) getSystemService(NOTIFICATION_SERVICE).notify("aaaaa", 0, m_Notification);id=id+arg2;Bundle bund

49、le=new Bundle();bundle.putInt("id", id);Intent intent=new Intent();intent.setClass(MainActivity.this, ImageShow.class);intent.putExtras(bundle); startActivity(intent);id=id-arg2; );6 长按list中的列会转向ChangeSql.class list.setOnItemLongClickListener(new OnItemLongClickListener()SuppressWarnings(&

50、quot;deprecation")Overridepublic boolean onItemLongClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) / TODO Auto-generated method stubDisplayToast("长按选中了第"+Integer.toString(arg2+1)+"张图片");m_Notification.icon=R.drawable.ic_launcher;m_Notification.tickerText=&quo

51、t;选中了第"+Integer.toString(arg2+1)+"张图片"m_Notification.setLatestEventInfo(MainActivity.this,"AndroidText4", "选中了第"+Integer.toString(arg2+1)+"张图片", null);(NotificationManager) getSystemService(NOTIFICATION_SERVICE).notify("aaaaa", 0, m_Notification

52、);id=id+arg2;Bundle bundle=new Bundle();bundle.putInt("id", id);Intent intent=new Intent();intent.setClass(MainActivity.this, ChangeSql.class);intent.putExtras(bundle); startActivity(intent);MainActivity.this.finish();id=id-arg2;return false; );7 消息的显示时间大概为1秒public void DisplayToast(String

53、 string) / TODO Auto-generated method stubToast.makeText(this, string, Toast.LENGTH_SHORT).show();8 创建响应菜单onOptionsItemSelected 点击about:显示“安卓大作业” 点击exit:退出程序 点击gallery:转向ActivityGallery.java进入幻灯片播放模式5:界面设计 根据需求分析知道,用户程序应该主要包括4个界面:主界面、菜单界面、幻灯片模式界面、修改图片名称界面。 在主界面,需要2个区域,一个显示缩略图,一个显示图片的信息(包括名字、大小)。为了不使页面显得拥挤,把菜单一栏放在右下角。<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:layout_width=&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论