洛阳理工学院手机软件开发实训报告专业计算机应用技术班级Z120551学号Z12055139姓完成日期2014-1-6一、简介本款图片浏览器软件基于Android系统平台研发的,设计有透明度、缩放、旋转和选择图片等功能,其中设计涉及8个button按钮,可以实现图片的查看和基本的操作功能,框架结构ImageView有两个子类ImageButton 和QuickContactBadge, ImageButton还有一个子类是ZoomButton。
二、程序模块划分1.XML文件属性调整边界, 保持长宽比 :android:adjustViewBounds, setAdjustViewBounds(boo lean), 是否调整自己的边界, 用来保持图片的长宽比例, 该属性与android:maxHe ight 和android:maxWidth 属性一起使用才有效果, 单独使用没有效果; 设置最大宽, 高 :android:maxWidth(android:maxHeight),setMaxWidth(int)[setMaxHeight(in t)], 该属性需要与android:adjustViewBounds属性一起使用,单独使用无效果;设置图片固定大小, 同时保持长宽比 : a. 设置android:adjustViewBounds 为true; b. 设置最大宽度, 高度; c. 设置android:layout_width 与android:layout_hei ght 值为warp_content; 裁剪保留空白 :android:cropToPadding, setCropToPadding (boolean), 是否裁剪, 用来保留ImageView的padding, 该属性与android:scrollY属性一起使用的时候才有用, 单独使用没有效果; 即在滚动的时候, 滚动到边界,边界的padding空白是否显示;填充方式 :android:scaleType, setScaleType(ImageView.ScaleType), 设置图片缩放类型以适配ImageView大小, 即填充方式;可能的取值 : matrix, fitXY, fitStart, fitCenter, fitEnd, center, centerCrop, cen terInside;matrix : 方法中的常量值为ImageView.ScaleType.MATRIX, 使用矩阵来进行绘图;fitXY : 方法中的常量值为ImageView.ScaleType.FIT_XY, 在x y 两个方向上缩放, 使图片完全填充整个ImageView 不按照长宽比例缩放;fitStart : 方法中的常量值为ImageView.ScaleType.FIT_START, 保持长宽比缩放, 直到该图片完全显示在ImageView中, 缩放完成之后该图片在左上角;fitCenter : 方法中的常量值为ImageView.ScaleType.FIT_CENTER, 保持长宽比缩放, 直到该图片完全显示在ImageView中, 缩放完成之后该图片位于中央;fitEnd : 方法中的常量值为ImageView.ScaleType.FIT_END, 保持长宽比缩放, 直到该图片完全显示在ImageView中, 缩放完成之后该图片位于右下角;center : 方法中的常量值为ImageView.ScaleType.CENTER, 将图片放在ImageView的中央, 不进行缩放;centerCrop : 方法中的常量值为ImageView.ScaleType.CENTER_CROP, 保持长宽比缩放, 使图片完全覆盖ImageView;centerInside : 方法中的常量值为ImageView.ScaleType.CENTER_INSIDE, 保持长宽比缩放, 是的ImageView完全显示图片;(1)程序运行的AndroidManifest描述:【AndroidManifest.xml】<?xml version="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"package="com.lyc.pic"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon"android:label="@string/app_name"><activity android:name=".MianActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><categoryandroid:name="UNCHER"/></intent-filter></activity><uses-sdk android:minSdkVersion="8"/></application></manifest>(2)程序界面布局XML文件 : 【activity_main.xml】<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_im"android:orientation="vertical"><LinearLayoutandroid:orientation="horizontal"android:layout_height="wrap_content"android:layout_width="fill_parent"android:padding="5dp"android:gravity="center"><Buttonandroid:id="@+id/alpha_plus"android:layout_height="fill_parent"android:layout_width="fill_parent"android:layout_weight="1"android:text="透明度+"android:background="@drawable/bg_bt"android:onClick="onClick"/><Buttonandroid:id="@+id/alpha_minus"android:layout_height="fill_parent"android:layout_width="fill_parent" android:layout_weight="1"android:text="透明度-"android:background="@drawable/bg_bt" android:onClick="onClick"/><Buttonandroid:id="@+id/prev_page"android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"android:text="上一张"android:background="@drawable/bg_bt" android:onClick="onClick"/><Buttonandroid:id="@+id/next_page"android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"android:text="下一张"android:background="@drawable/bg_bt" android:onClick="onClick"/></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_height="wrap_content"android:layout_width="fill_parent"android:padding="5dp"android:gravity="center"><Buttonandroid:id="@+id/big"android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"android:text="放大"android:background="@drawable/bg_bt" android:onClick="onClick"/><Buttonandroid:id="@+id/small"android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"android:text="缩小"android:background="@drawable/bg_bt" android:onClick="onClick"/><Buttonandroid:id="@+id/turn_left"android:layout_height="fill_parent"android:layout_width="fill_parent"android:layout_weight="1"android:text="左转"android:background="@drawable/bg_bt"android:onClick="onClick"/><Buttonandroid:id="@+id/turn_right"android:layout_height="fill_parent"android:layout_width="fill_parent"android:layout_weight="1"android:text="右转"android:background="@drawable/bg_bt"android:onClick="onClick"/></LinearLayout><ImageViewandroid:id="@+id/image_all"android:layout_width="fill_parent"android:layout_height="fill_parent"android:scaleType="fitCenter"android:src="@drawable/mary1"/></LinearLayout>2.ImageView常用方法设置位图 : setImageBitmap(bitmap), 为ImageView设置Bitmap位图显示;设置Drawable : setImageDrawable(drawable), 为ImageView设置Drawable显示; 设置资源 : setImageResource(int), 为ImageView设置资源图片;设置路径 : setImageUri(uri), 为ImageView设置图片路径, 显示该路径的图片; 3. 图片浏览器操作介绍(1). 实现左右循环切换图片图片数组 : 将图片放在数组中, ImageView显示数组中的图片;当前显示图片下标索引 : 设置一个int值, 用来表示当前显示图片数组中的图片, 这个值不是int下标, 这个值设置很大设置成Integer.MAXV ALUE / 2, 该值与图片数组的长度进行取模运算结果就是当前显示的图片数组下标值;翻页操作 : 上一页操作就将当前显示索引自减1, 然后模上图片数组大小; 下一页就将当前索引自增1, 然后模上图片数组大小;代码如下 :/设置一个很大的值, 保证前后翻页不会出现异常currentImage = Integer.MAX_V ALUE / 2;//为了保证图片能够循环, 这里模运算是关键, 显示图片的下标始终是长度的模image_all.setImageResource(images[ ++currentImage % images.length ]);image_all.setImageResource(images[ --currentImage % images.length ]);(2). 透明度改变设置当前透明度 : 设置一个当前透明度值, 初始值为255, 255是不透明, 0为完全透明;透明度改变 : 当点击透明度增加按钮的时候, 透明度自增20, 如果结果透明度大于255, 那么改透明度强制设置为255; 当点击透明度见效按钮的时候, 透明度自减20, 当透明度小于0的时候, 透明度强制设置为0;代码如下 ://透明度初始值alpha = 255;//透明度增加alpha += 20;if(alpha >= 255)alpha = 255;image_all.setAlpha(alpha);//透明度减小alpha -= 20;if(alpha <= 0)alpha = 0;image_all.setAlpha(alpha);(3). 图片的放大缩小获取View组件宽高 : 在Activity普通方法中无法获取到view组件的准确值, 如果想要获取view组件的宽高, 可以在 onWindowFocusChanged()方法中获取;计算每次自增自减的单位值 : 当按下缩放按钮的时候, 就对ImageView的宽高值进行自增自减单位值操作;为ImageView设置宽高 : 即设置LayoutParams, 注意是youtPa rams对象;代码如下 :获取宽高 :@Overridepublic void onWindowFocusChanged(boolean hasFocus) {// TODO Auto-generated method stubsuper.onWindowFocusChanged(hasFocus);//获取ImageView组件的宽高imageWidth = image_all.getWidth();imageHeight = image_all.getHeight();//计算每次自增自减的值addWidth = imageWidth / 5;addHeight = imageHeight / 5;}缩放图片操作 :case R.id.big: //放大图片imageWidth += addWidth;imageHeight += addHeight;image_all.setLayoutParams(new youtParams(imageWidth, imageHe ight));break;case R.id.small: //缩小图片imageWidth -= addWidth;imageHeight -= addHeight;if(imageWidth <= 0 || imageHeight <=0){imageWidth += addWidth;imageHeight += addHeight;}image_all.setLayoutParams(new youtParams(imageWidth, imageHe ight));break;(4). 旋转图片操作设置Matrix对象 : 该对象用来存放图像的旋转角度;设置旋转角度 : matrix.setRotate(), 即可设置旋转角度;创建Bitmap : 创建一个位图, 注意将设置了旋转角度的matrix 设置上去; 源码如下 :matrix = new Matrix();//向左旋转进行的操作anglel += 45;matrix.setRotate(anglel);Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(images[currentImag e % images.length])).getBitmap();bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), ma trix, true);image_all.setImageBitmap(bitmap);//向右旋转进行的操作anglel -= 45;matrix.setRotate(anglel);Bitmap bitmap1 = ((BitmapDrawable) getResources().getDrawable(images[currentIma ge % images.length])).getBitmap();bitmap1 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),bitmap1.getHeight( ), matrix, true);image_all.setImageBitmap(bitmap1);运行结果:心得体会:通过本次生产实习受益匪浅,知道了一个项目的完成步骤和模块的划分,在本次生产实习中遇到的困难是有以下几点:(1)对android软件开发知识掌握的不够,把代码敲出来功能实现了但是还是不知道怎样实现的;(2)对开发软件的过程不是很熟悉一个功能实现了不知道下一步要干什么;(3)对eclipse的调试方法知道的不是很多,所以遇到问题自己却束手无策只能求助,最终在网络和好友的帮助下实现了老师要求的功能。