项目地址:Android-课程设计-图书馆选座-论文-Android文档类资源-CSDN下载

Android-图书馆选座-课程设计(源码+论文)_基于Android的图书馆选座系统的设计与实现-Android文档类资源-CSDN下载详细介绍:https://blog.csdn.net/qq_34060370/article/det基于Android的图书馆选座系统的设计与实现更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_34060370/72361522

如何运行blog:

Android studio2020.3.1如何运行as2.几版本项目或module_刘建杰的博客-CSDN博客

简介

  1. 项目时间:2020年6月大专二年级的安卓课程设计
  2. 项目亮点:2D可视化的编辑地图,灵感和代码来源于贪吃蛇项目的编辑地图,曾有一家互联网公司借鉴了本小项目的编辑地图的页面功能
  3. 项目简要:
    管理员编辑图书馆楼层的2D地图,学生在图书馆2D地图上选座。
    用户管理:登录、注册、修改个人信息、更改头像 。
    楼层管理:添加、修改、编辑、删除楼层地图、保存为模板 。
    模板管理:修改、删除、生成为楼层地图 。
    选座管理:查询座位、我的座位、修改座位、预约座位(当时没写取消预约功能) 。
    知识点:application+sqlite+canvas+碎片+recycleviw。
  4. 视频链接:基于Android的图书馆选座系统app_哔哩哔哩_bilibili

Android实践

2019-2020第二学期期末项目考试

班级:安卓1802

学号:183052745

姓名:刘建杰

得分:

目录

一、项目目的及意义... 0

1.1项目设计目的... 0

1.2项目设计意义... 0

二、相关技术及工具... 0

2.1 Android. 0

2.2 Sqlite. 1

2.3 Canvas. 1

三、系统设计及功能... 2

3.1功能需求... 2

3.2系统总体设计... 3

3.3模块设计... 4

3.4数据库相关设计... 4

四、系统实现及关键代码分析... 6

4.1 程序运行... 6

4.2 程序模块细分... 21

4.3主要功能关键代码分析... 24

五、收获与体会... 36

5.1 项目总结... 36

5.2 收获与体会... 37

一、项目目的及意义

1.1项目设计目的

1.复习、巩固Android的基础知识,进一步加深对Android的理解和掌握。

2.为我提供一个动手动脑,独立实践的机会,将课本上的知识和实际应用有机结合起来,锻炼分析我实际解决问题的能力。

3.提高我面对对象分析与设计能力以及实际项目进行综合开发能力。

1.2项目设计意义

我开发的这个项目是图书馆在线选座,学生在手机app上,对今天明天图书馆的座位进行选座,这样可以避免早起排长队,选座的界面需要2D平面地图化,不是单纯的数字座位。

对我个人来说是展示个人能力的项目,开发项目过程中是以工程为目的的开发模式,系统模块分明,功能完善。

二、相关技术及工具

2.1 Android

安卓(Android)是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

2.2 Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2021年已经接近有21个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

2.3 Canvas

Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图形处理相关的: Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、 BitmapDrawable和TransitionDrawable等。以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。下面我们就主要来了解下Canvas的使用方法。

三、系统设计及功能

3.1功能需求

一、项目基本内容

学生在手机app上,对今天明天图书馆的座位进行选座,这样可以避免早起排长队,像天猫电影院订座一样有座位分布图显示,地图界面需要2D平面地图化,不是单纯的数字座位。图书馆管理员在app上编辑修改图书馆楼层地图分布显示。

二、大体功能

1.用户管理

  1. 用户登录
  2. 用户注册
  3. 用户找回密码
  4. 用户修改个人信息

2.选座功能

  1. 查看每个楼层的地图
  2. 查询座位根据不同时间段剩余的座位信息
  3. 选座要选的座位
  4. 取消原先座位
  5. 选择坐多久:上午、下午、晚上
  6. 我的座位信息

3.管理员

  1. 设置楼层数目
  2. 设置一层的2D地图
  3. 编辑一层的2D地图
  4. 删除一层的2D地图
  5. 设置为第几层的2D地图

3.2系统总体设计

3.3模块设计

3.4数据库相关设计

一、实体关系分析

二、数据库表设计

表1.1 用户信息表(user)

列名

数据类型

是否允许为空

说明

uid

int

序号(主键)

username

text

昵称

userpwd

text

密码

role

Int

角色(0普通用户,1管理员)

headimg

text

头像

phone

text

电话

表1.2楼层地图表(floormap)

列名

数据类型

是否允许为空

说明

fid

int

序号(主键)

flayer

int

第几层

flayermap

varchar(15)

*地图数据*

表1.3座位信息表(seatinfo)

列名

数据类型

是否允许为空

说明

sid

int

序号(主键)

uid

int

用户id

fid

Int

楼层id

sday

Text

日期

stime

Int

时间段int值(0上午,1下午,2晚上,3无)

snumber

text

座位号

Sx

Int

X坐标

sy

Int

Y坐标

表1.4地图模板表(mapmoudlesql)

列名

数据类型

是否允许为空

说明

mid

int

序号(主键)

mname

Text

模板名称

mlayermap

text

地图数据

四、系统实现及关键代码分析

4.1 程序运行

1.用户打开程序显示“登录界面”,登录界面会显示上一个登录的用户头像,并且账号和密码已输好,下面一行左右两侧分别是忘记密码?和用户注册。

 

2.按照国际案列,先注册,点击“登录页面”的新用户注册,会跳转到“用户注册”页面。此页面和登录界面比较像,输入昵称和密码即可注册。

3.回到“登录页面”登录管理员账号

4.输入完账号密码点击登录会跳转到程序的“主页面”,此页面分为上中下3部分,上:是标题、返回、功能按钮,中:是显示各个楼层的预览图,下是3个模块切换,第一个选中的模块是楼层模块,第二个是楼层模板模块,第三个是用户模块

5.我们先点击第三个模块“用户信息页面”,对用户信息可以修改,更改头像、个人用户信息、密码、管理员可以删除指定用户等

1)用户信息页面

2)修改手机

3)修改头像可以拍照和从图库选择

4)查看所有用户

5)可以删除用户

6.用户相关模块讲完,回到选座主题。点开第一个楼层模块。

点击右上角的+号图标可以进行对空白地图编辑,跳转到“编辑地图”页面。

此页面分两块,左边是显示由右边控制按钮操作的地图结果,右边是控制按钮。

对地图适当编辑后显示的地图。

其中,凳子图片代表座位,木头的图标代表书架,深灰色的图标代表墙壁。

可以根据不同地图的平面设置不同的地图。

7.    我们切换到普通用户,进行座位选座,首先登录普通用户账号后,楼层管理并没有编辑和删除按钮,只有选座的功能按钮。

用户选择相应楼层的座位,在“选座地图”中,手先单击座位,屏幕用绿色标记次座位,再右边控制按钮点击选座,此时将所选座位选中,并用黄色标记。

此“选择地图”页面和“编辑地图”页面大体相似,不过是为了用户选座而设计,不能对地图编辑,只能选择相应座位。

8.一个用户选座完成,另一个用户再登录选择这个座位会提示选择失败,需另选择座位。

9.选完座位,可以在“个人信息”界面的我的座位按钮点击进入“我的座位”信息界面,显示自己的座位信息

4.2 程序模块细分

总体目录

1.页面模块包

2.列表适配器包

3.实体bean包

4.数据库表操作包

5.canvas绘图包

6.工具包

4.3主要功能关键代码分析

编辑地图

Xml代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:weightSum="10"><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="8"><!-- 地图view --><com.example.libraryselection.mappack.EditMapLayerViewandroid:id="@+id/edfloormap_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"></com.example.libraryselection.mappack.EditMapLayerView></RelativeLayout><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="2"><!-- 控件组件view --><ScrollViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:layout_centerVertical="true"android:layout_alignParentLeft="true"><LinearLayoutandroid:id="@+id/edfloormap_linear"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/edfloormap_tx_showfloorc"android:layout_width="match_parent"android:layout_height="50dp"android:text="@string/firstfloornamestr"android:gravity="center"/><Buttonandroid:id="@+id/edfloormap_bt1_setseat"android:layout_width="100dp"android:layout_height="35dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setseatstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt_setshujia"android:layout_marginTop="5dp"android:layout_width="100dp"android:layout_height="35dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setshujia"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt2_setbar"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setbarstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt3_setfield"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setfieldstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt_setseatno"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setseatnostr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt_setcancleseatno"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setcanleseatnostr"android:layout_gravity="center"android:textColor="#fff"android:textSize="12sp"/><Buttonandroid:id="@+id/edfloormap_bt_editmap_geneyqseat"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/geneyqseatstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt_editmap_recover"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/recoverstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><!--             <Button  --><!--                 android:id="@+id/edfloormap_bt4_save" --><!--                 android:layout_width="100dp" --><!--                 android:layout_height="35dp" --><!--                 android:layout_marginTop="5dp" --><!--                 android:background="@drawable/bt_editmap_shape" --><!--                 android:text="@string/savestr" --><!--                 android:layout_gravity="center" --><!--                 android:textColor="#fff" --><!--               android:textSize="14sp"/> --><Buttonandroid:id="@+id/edfloormap_bt5_savemold"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/setmoldstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt7_lastlayer"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="上一层"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt8_nextlayer"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="下一层"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/><!-- 放一起试试,是修改模板的控件 --><Buttonandroid:id="@+id/edfloormap_bt9_geneMapLayer"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="设为新楼层"android:layout_gravity="center"android:visibility="gone"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt10_lastmoudle"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="上一模板"android:layout_gravity="center"android:visibility="gone"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt11_lastmoudle"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="下一模板"android:layout_gravity="center"android:visibility="gone"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid:id="@+id/edfloormap_bt6_quit"android:layout_width="100dp"android:layout_height="35dp"android:layout_marginTop="5dp"android:background="@drawable/bt_editmap_shape"android:text="@string/quitstr"android:layout_gravity="center"android:textColor="#fff"android:textSize="14sp"/></LinearLayout></ScrollView></RelativeLayout></LinearLayout>

这是编辑地图的xml代码,线性布局里面套相对布局,右边scrollview包围,左边显示地图是自定义canvas的视图,是在代码里写的,如下:

// 选择座位的地图的view,还是公用原始地图与当前地图,不过能变得东西少了,只有座位public class ChooseSeatMapLayerView extends View{// 上级Context supercon;// 很重要的ChooseSeatMapActivity chooseactivity;private Paint yuxuanpaint;// 预选位置的paint,不填充并且绿色private Paint myseatpaint;// 我选择的座位private Paint beichooseseatpaint;// 被选择的座位// 地图范围// private int mapdata[][];public ChooseSeatMapLayerView(Context context, AttributeSet attrs) {super(context, attrs);supercon = context;// 需要强制转换chooseactivity = (ChooseSeatMapActivity)context;// 直接从maplist获取地图数据initData();initPaint();Log.i("library", "ChooseSeatMapLayerView构造函数");// 图片大小是固定的mSrcRect = new Rect(0, 0, MapConstant.MapBigimgWidth, MapConstant.MapBigimgHeight);}public void initData(){EditMapDataUtil.getMapDataFromMapList();invalidate();}protected void initPaint(){yuxuanpaint = new Paint();yuxuanpaint.setColor(Color.GREEN);yuxuanpaint.setStyle(Paint.Style.STROKE);yuxuanpaint.setStrokeWidth(2);myseatpaint = new Paint();myseatpaint.setColor(Color.YELLOW);myseatpaint.setStyle(Paint.Style.STROKE);myseatpaint.setStrokeWidth(2);beichooseseatpaint = new Paint();beichooseseatpaint.setColor(Color.RED);beichooseseatpaint.setStyle(Paint.Style.STROKE);beichooseseatpaint.setStrokeWidth(2);}@Overridepublic void invalidate() {// TODO Auto-generated method stub// 重新更新画布super.invalidate();}// 根据pix大小设置 图片显示区域private Rect mSrcRect;// 测量@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);Log.e("library", "onMeasure--widthMode-->" + widthMode);Log.e("library", "onMeasure--widthSize-->" + widthSize);Log.e("library", "onMeasure--heightMode-->" + heightMode);Log.e("library", "onMeasure--heightSize-->" + heightSize);// 通过height设置width,// 因为height是match ,height减去100, 要居中heightSize = heightSize - 100;// 向下取整绘制像素大小int pix = (int) Math.floor(heightSize / (double)MapConstant.i);// 设为全局的像素MapConstant.MapPiexl = pix;Log.e("library", "onMeasure--pix-->" + pix);//        Toast.makeText(supercon, "pix:"+pix, Toast.LENGTH_SHORT).show();// 因为绘制像素向下取整,偏小了,就小下去heightSize = pix * MapConstant.i;// 根据绘制像素得到widthwidthSize = pix * MapConstant.j;//取最小边为控件的宽高的最小值setMeasuredDimension(widthSize,heightSize);}// 触碰函数/*直接变为预选*/int lasti,lastj;int mychoosei, mychoosej;@Overridepublic boolean onTouchEvent(MotionEvent event) {// 让这个位置 /40mychoosej = (int) (event.getX() / MapConstant.MapPiexl);mychoosei = (int) (event.getY() / MapConstant.MapPiexl);switch(event.getAction()){// 手指按下case  MotionEvent.ACTION_DOWN:break;// 手指松开, 选择的位置预选case MotionEvent.ACTION_UP:// 1.先恢复之前选择的预选位置。,这个只需指定是哪一个ij就行if(!EditMapDataUtil.isOverLine(lasti, lastj)){EditMapDataUtil.recoverDataFromYuanByIJ(lasti, lastj);}// 2.当前位置变为预选,前提不是边界if(!EditMapDataUtil.isOverLine(mychoosei, mychoosej)){EditMapDataUtil.setIjBeYu(mychoosei, mychoosej);// 得放这里lasti = mychoosei;lastj = mychoosej;}// 更新绘图invalidate();break;}//    return super.onTouchEvent(event);return true;}// 设为预选位置为选座,需要判断是否座位// 1.判断是否座位// 2.判断是否是不可用座位// 2.判断这个座位是否被其它人占了,是不能选// 3.判断这个时间段,这天,我是否有其它座位,询问是否取消之前座位。是:修改原来座位,如果是同一层更新view// 返回bean 为了通信public void MapDatayuToMySeat(){if(!EditMapDataUtil.isOverLine(mychoosei, mychoosej)){// 1int zhi = EditMapDataUtil.yuanMapData[mychoosei][mychoosej];//2if(zhi == MapConstant.SEATNO){Constant.commonToast(supercon, "此座位不可用");return;}if(zhi == MapConstant.SEAT){// 2boolean isoccur = thiseatIsOccur(mychoosei, mychoosej);if(!isoccur){// 3if(!isThisTimeIhadSeat(mychoosei, mychoosej)){//                 SeatInfoBean seat = new SeatInfoBean();//                 // 添加到数据库中,当前i,j,fid,sday,stime,等//                 seat.setSnumber(mychoosei+""+mychoosej);//                 seat.setSx(mychoosej);//                 seat.setSy(mychoosei);// 将预选的位置数组恢复if(!EditMapDataUtil.isOverLine(mychoosei, mychoosej)){EditMapDataUtil.recoverDataFromYuanByIJ(mychoosei, mychoosej);}chooseactivity.insertOneSeatToSqiteAndList(mychoosei, mychoosej);}}else{Constant.commonToast(supercon, "此座位已被占用,请选择其它");}}else{Constant.commonToast(supercon, "请选择座位");}}else{Constant.commonToast(supercon, "请先选择座位");}//    invalidate();}// 判断这个座位是否被占public boolean thiseatIsOccur(int i, int j){for(int z = 0; z < MapConstant.curallseatlist.size(); z++){SeatInfoBean seat = MapConstant.curallseatlist.get(z);// x, jint m = seat.getSx();int n = seat.getSy();if(m == j && n == i){return true;}}return false;}// 判断我这个时间段是否有了座位public boolean isThisTimeIhadSeat(int i, int j){// 一般只有一条for(int z = 0; z < MapConstant.myseatlist.size(); z++){SeatInfoBean oldseat = MapConstant.myseatlist.get(z);// 弹框SeatInfoBean newseat = new SeatInfoBean();newseat.setSy(i);newseat.setSx(j);newseat.setSnumber(i+""+j);// 放入新楼层的fidnewseat.setFid(MapConstant.getCurLayerZhujian());chooseactivity.generateHadSeatDialog(oldseat, newseat);//       chooseactivity.generateHadSeatDialog(seat.getSid(), seat.getSy(), seat.getSx(), MapConstant.getLayerNumberByFid(seat.getFid()), i, j, MapConstant.getLayerNumber());return true;}return false;}// 绘画函数@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// i是行,j是列for(int i = 0; i < MapConstant.i; i++){for(int j = 0; j < MapConstant.j; j++){int leftj = j * MapConstant.MapPiexl;int lefti = i * MapConstant.MapPiexl;int righti = j * MapConstant.MapPiexl + MapConstant.MapPiexl;int rightj = i * MapConstant.MapPiexl + MapConstant.MapPiexl;// 实时目标位置要计算的。Rect rc = new Rect(leftj, lefti, righti, rightj);// 如果是墙if(EditMapDataUtil.currMapData[i][j] == MapConstant.BAR){//              canvas.drawBitmap(MapConstant.bigwallbitmap, leftj, lefti, null);canvas.drawBitmap(MapConstant.bigwallbitmap, mSrcRect, rc, null);}// 如果是预选地图else if(EditMapDataUtil.currMapData[i][j] == MapConstant.YU){canvas.drawRect(rc, yuxuanpaint);}// 如果是座位else if(EditMapDataUtil.currMapData[i][j] == MapConstant.SEAT){//              canvas.drawBitmap(MapConstant.bigseatbitmap, leftj, lefti, null);canvas.drawBitmap(MapConstant.bigseatbitmap, mSrcRect, rc, null);}// 如果是地板else if(EditMapDataUtil.currMapData[i][j] == MapConstant.FIELD){//              canvas.drawBitmap(MapConstant.bigfloorbitmap, leftj, lefti, null);canvas.drawBitmap(MapConstant.bigfloorbitmap, mSrcRect, rc, null);}// 如果是书架else if(EditMapDataUtil.currMapData[i][j] == MapConstant.SHUJIA){//              canvas.drawBitmap(MapConstant.bigshujiabitmap, leftj, lefti, null);canvas.drawBitmap(MapConstant.bigshujiabitmap, mSrcRect, rc, null);}// 如果是不可用座位else if(EditMapDataUtil.currMapData[i][j] == MapConstant.SEATNO){//              canvas.drawBitmap(MapConstant.bigseatnobitmap, leftj, lefti, null);canvas.drawBitmap(MapConstant.bigseatnobitmap, mSrcRect, rc, null);}}}// 绘制被学生选座的地图,循环// 直接根据ij将指定位置绘制, 需要判断楼层是否对应Paint curp = new Paint();for(int z = 0; z < MapConstant.curallseatlist.size(); z++){SeatInfoBean seat = MapConstant.curallseatlist.get(z);if(seat.getFid() == MapConstant.getCurLayerZhujian()){// 如果这个座位是我订的,换Paintif(seat.getUid() == MyApplication.user.getUid()){curp = myseatpaint;}else{curp = beichooseseatpaint;}// x, jint j = seat.getSx();int i = seat.getSy();int leftj = j * MapConstant.MapPiexl;int lefti = i * MapConstant.MapPiexl;int righti = j * MapConstant.MapPiexl + MapConstant.MapPiexl;int rightj = i * MapConstant.MapPiexl + MapConstant.MapPiexl;Rect rc = new Rect(leftj, lefti, righti, rightj);canvas.drawRect(rc, curp);}}}}

主要是继承View类,然后重写onDraw绘图函数,进行绘图。

其它:编辑地图是一块比较难的地方,只要做好了这块其它功能就可以相对简单了。

五、收获与体会

5.1 项目总结

1. 完成度80%,大体完善

2. 有许多改进和增加功能方向,比如用户可以取消预选地图、用户查看我的座位可以跳转到相应的地图界面、管理员可以拖动楼层更改楼层顺序等细节问题

3. 充分利用Canvas绘图,完成编辑地图、显示地图这难点,并适用于不同手机

4. 利用面向对象思想 使类划分细明,更容易实现效果

5. 采用了一点点mvc模式,bean代表model模型

6. 使用Sqlite表保存地图数据

5.2 收获与体会

  1. 开发程序必须要有设计,设计项目中存在的对象,提取出属性和行为,再关联各个类之间的关系,才能写出高效和可扩展的代码
  2. 知识面太窄,需要多学习,才能扩展思维,实现更好的程序
  3. 算法以及数据结构很重要
  4. 提高写代码的效率,不能写代码10分钟,找bug1小时,太耗时间,应该先有思路再写,可在本子上先验算下
  5. 特别注意数组是引用类型的问题
  6. 提高找bug的精确性,先要理清思路,逐步跟踪,特别是可以利用调试功能 一步一步下去。

Android图书馆选座系统课程设计相关推荐

  1. 基于微信小程序的图书馆选座系统源码

    开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具 技术说明: springboot mybatis 小程序 代码注释齐全,没有多余代码,适合学习( ...

  2. python+django+vue图书馆选座系统pycharm源码lw

    通过与图书馆相关人员的讨论,了解到我校图书馆的座位管理存在以下问题: (1)实行先到先坐的制度,所有的图书馆座位使用人员(以下简称用户)在图书馆开馆的情况下,到图书馆寻找座位,先到达图书馆指定座位的人 ...

  3. 毕业设计-基于微信小程序的图书馆选座系统

    目录 前言 课题背景与简介 实现设计思路 一.系统分析及功能设计 二.学生端系统详细设计 三.系统测试与结构分析 四.总结 实现效果样例 更多帮助 前言

  4. android点餐课程设计,点餐系统课程设计报告

    点餐系统课程设计报告 目 录 一.系统说明3 二.系统功能3 三.系统结构流程图3 四.数据表结构4 五.主要表单功能4 六.所参与的功能模块及代码7 七.课程设计总结9 一.系统说明 酒店点餐管理系 ...

  5. 基于SSM框架的杰森摄影工作室选片系统的设计和开发论文

    基于SSM框架的杰森摄影工作室选片系统的设计和开发 摘 要 面对巨大的市场和激烈的竞争,摄影/照相馆行业商家必须紧跟行业发展的步伐,导入新的经营理念和推广方式,才不至于在激烈的市场竞争中被淘汰出局.信 ...

  6. 基于微信小程序的图书馆座位预约系统的设计与实现

    1. 系统开发背景 图书馆因有良好的学习氛围.大量的学习资源吸引大家前来学习,图书馆还未开馆就有大量的同学在门口排队等待,有限的座位与日益增加的自主学习者之间形成了供不应求的现象,再加上不了解图书馆的 ...

  7. 火车站售票系统课程设计

    火车站售票系统课程设计 一.课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现.对该系统的要求如下: (1) 需求描述: 一.系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基 ...

  8. 基于微信小程序的电影院订票选座系统

    随着数据库技术和无线互联网的发展,各行业的数据信息量快速增多.正是由于这种发展形势,数据量变得非常杂乱无序,必须通过信息系统来选择用户需要的信息.本文通过微信小程序平台上研发电影院订票选座系统,解决部 ...

  9. 单片机c语言 课程设计报告,C语言编写单片机万年历系统课程设计报告98分

    <C语言编写单片机万年历系统课程设计报告98分>由会员分享,可在线阅读,更多相关<C语言编写单片机万年历系统课程设计报告98分(30页珍藏版)>请在人人文库网上搜索. 1.多功 ...

  10. swing 实现电影选座系统

    该系统使用swing+数据库 实现一个电影选座系统,相关系统的截图如下 使用三层架构实现电影购票系统,分用户和管理员,用户功能:展示电影,查找电影(模糊查询),查看电影详情,查找场次,购买影票,订制座 ...

最新文章

  1. IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选
  2. iOS 获取当前设备型号iPhone7/iPhone7P
  3. munin监控windos机子
  4. ERP云端争霸 甲骨文和SAP打对攻 金蝶忙转身用友原地等待
  5. Scala特质trait具备Java中类和接口的功能
  6. C和汇编混合编程----实现浮点数的加减乘除
  7. 晓庄学院计算机科学分数,南京晓庄学院计算机单招分数
  8. 谜题39:您好,再见!
  9. iOS推送群发的问题,PushSharp作者的这篇讲得最详细了
  10. netif_receive_skb 函数解析
  11. 司机秘书:让司机省心的违章查询助手
  12. nRF51 SDK 例程分析——Blinky Example
  13. VC删除IE缓存、COOKIE及浏览记录
  14. 爬虫实战(一)-新版知乎网页分析获取登录url
  15. 微信广告转化归因几个坑 gdt_vid和clickid
  16. 惠普暗影精灵Plus 3代 (OMEN 17-an014TX)参数
  17. 7-97 约会成功了吗
  18. Waves.Exchange福利大放送: 投资赢Lambo Huracan或240,000 USDN
  19. 【哈佛公开课】积极心理学笔记-06乐观主义(下)
  20. AQS是什么?都是怎么用的?

热门文章

  1. c语言结构体的实例使用
  2. java 加密压缩文件
  3. android ui设计最新字体,手机ui设计常用字体一般有哪些,UI设计中的字体有什么规范要求...
  4. android 物业管理系统,基于Android的物业管理系统
  5. IEC60870-5-103规约通讯过程
  6. 利用计算机模拟体现了网络的,毕业论文_Packet tracer模拟器在计算机网络中的应用6喜欢就下吧(样例3)...
  7. Matlab读取TXT文本文件通用程序
  8. 计算机字体库位置,win7电脑的字体库在哪里?
  9. JDK 11 API中文帮助文档
  10. win10无法安装.net framework 3.5 解决方案/无法安装NetFx3解决方案