Android图书馆选座系统课程设计
项目地址: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博客
简介
- 项目时间:2020年6月大专二年级的安卓课程设计
- 项目亮点:2D可视化的编辑地图,灵感和代码来源于贪吃蛇项目的编辑地图,曾有一家互联网公司借鉴了本小项目的编辑地图的页面功能
- 项目简要:
管理员编辑图书馆楼层的2D地图,学生在图书馆2D地图上选座。
用户管理:登录、注册、修改个人信息、更改头像 。
楼层管理:添加、修改、编辑、删除楼层地图、保存为模板 。
模板管理:修改、删除、生成为楼层地图 。
选座管理:查询座位、我的座位、修改座位、预约座位(当时没写取消预约功能) 。
知识点:application+sqlite+canvas+碎片+recycleviw。 - 视频链接:基于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.用户管理
- 用户登录
- 用户注册
- 用户找回密码
- 用户修改个人信息
2.选座功能
- 查看每个楼层的地图
- 查询座位根据不同时间段剩余的座位信息
- 选座要选的座位
- 取消原先座位
- 选择坐多久:上午、下午、晚上
- 我的座位信息
3.管理员
- 设置楼层数目
- 设置一层的2D地图
- 编辑一层的2D地图
- 删除一层的2D地图
- 设置为第几层的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 收获与体会
- 开发程序必须要有设计,设计项目中存在的对象,提取出属性和行为,再关联各个类之间的关系,才能写出高效和可扩展的代码
- 知识面太窄,需要多学习,才能扩展思维,实现更好的程序
- 算法以及数据结构很重要
- 提高写代码的效率,不能写代码10分钟,找bug1小时,太耗时间,应该先有思路再写,可在本子上先验算下
- 特别注意数组是引用类型的问题
- 提高找bug的精确性,先要理清思路,逐步跟踪,特别是可以利用调试功能 一步一步下去。
Android图书馆选座系统课程设计相关推荐
- 基于微信小程序的图书馆选座系统源码
开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具 技术说明: springboot mybatis 小程序 代码注释齐全,没有多余代码,适合学习( ...
- python+django+vue图书馆选座系统pycharm源码lw
通过与图书馆相关人员的讨论,了解到我校图书馆的座位管理存在以下问题: (1)实行先到先坐的制度,所有的图书馆座位使用人员(以下简称用户)在图书馆开馆的情况下,到图书馆寻找座位,先到达图书馆指定座位的人 ...
- 毕业设计-基于微信小程序的图书馆选座系统
目录 前言 课题背景与简介 实现设计思路 一.系统分析及功能设计 二.学生端系统详细设计 三.系统测试与结构分析 四.总结 实现效果样例 更多帮助 前言
- android点餐课程设计,点餐系统课程设计报告
点餐系统课程设计报告 目 录 一.系统说明3 二.系统功能3 三.系统结构流程图3 四.数据表结构4 五.主要表单功能4 六.所参与的功能模块及代码7 七.课程设计总结9 一.系统说明 酒店点餐管理系 ...
- 基于SSM框架的杰森摄影工作室选片系统的设计和开发论文
基于SSM框架的杰森摄影工作室选片系统的设计和开发 摘 要 面对巨大的市场和激烈的竞争,摄影/照相馆行业商家必须紧跟行业发展的步伐,导入新的经营理念和推广方式,才不至于在激烈的市场竞争中被淘汰出局.信 ...
- 基于微信小程序的图书馆座位预约系统的设计与实现
1. 系统开发背景 图书馆因有良好的学习氛围.大量的学习资源吸引大家前来学习,图书馆还未开馆就有大量的同学在门口排队等待,有限的座位与日益增加的自主学习者之间形成了供不应求的现象,再加上不了解图书馆的 ...
- 火车站售票系统课程设计
火车站售票系统课程设计 一.课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现.对该系统的要求如下: (1) 需求描述: 一.系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基 ...
- 基于微信小程序的电影院订票选座系统
随着数据库技术和无线互联网的发展,各行业的数据信息量快速增多.正是由于这种发展形势,数据量变得非常杂乱无序,必须通过信息系统来选择用户需要的信息.本文通过微信小程序平台上研发电影院订票选座系统,解决部 ...
- 单片机c语言 课程设计报告,C语言编写单片机万年历系统课程设计报告98分
<C语言编写单片机万年历系统课程设计报告98分>由会员分享,可在线阅读,更多相关<C语言编写单片机万年历系统课程设计报告98分(30页珍藏版)>请在人人文库网上搜索. 1.多功 ...
- swing 实现电影选座系统
该系统使用swing+数据库 实现一个电影选座系统,相关系统的截图如下 使用三层架构实现电影购票系统,分用户和管理员,用户功能:展示电影,查找电影(模糊查询),查看电影详情,查找场次,购买影票,订制座 ...
最新文章
- IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选
- iOS 获取当前设备型号iPhone7/iPhone7P
- munin监控windos机子
- ERP云端争霸 甲骨文和SAP打对攻 金蝶忙转身用友原地等待
- Scala特质trait具备Java中类和接口的功能
- C和汇编混合编程----实现浮点数的加减乘除
- 晓庄学院计算机科学分数,南京晓庄学院计算机单招分数
- 谜题39:您好,再见!
- iOS推送群发的问题,PushSharp作者的这篇讲得最详细了
- netif_receive_skb 函数解析
- 司机秘书:让司机省心的违章查询助手
- nRF51 SDK 例程分析——Blinky Example
- VC删除IE缓存、COOKIE及浏览记录
- 爬虫实战(一)-新版知乎网页分析获取登录url
- 微信广告转化归因几个坑 gdt_vid和clickid
- 惠普暗影精灵Plus 3代 (OMEN 17-an014TX)参数
- 7-97 约会成功了吗
- Waves.Exchange福利大放送: 投资赢Lambo Huracan或240,000 USDN
- 【哈佛公开课】积极心理学笔记-06乐观主义(下)
- AQS是什么?都是怎么用的?
热门文章
- c语言结构体的实例使用
- java 加密压缩文件
- android ui设计最新字体,手机ui设计常用字体一般有哪些,UI设计中的字体有什么规范要求...
- android 物业管理系统,基于Android的物业管理系统
- IEC60870-5-103规约通讯过程
- 利用计算机模拟体现了网络的,毕业论文_Packet tracer模拟器在计算机网络中的应用6喜欢就下吧(样例3)...
- Matlab读取TXT文本文件通用程序
- 计算机字体库位置,win7电脑的字体库在哪里?
- JDK 11 API中文帮助文档
- win10无法安装.net framework 3.5 解决方案/无法安装NetFx3解决方案