网站首页 文秘写作 工作范文 文秘知识 条据书信 行政公文 求职离职 名人名言 党团范文 励志 优秀作文 思想汇报 经营营销 汇报总结
  • 名言警句
  • 爱情名言
  • 经典名言
  • 名言名句
  • 英语名言
  • 爱国
  • 小小文档网 > 名人名言 > 爱国 > 基于蓝牙的考勤系统

    基于蓝牙的考勤系统

    时间:2022-01-19 15:05:50来源:小小文档网本文已影响

    基于蓝牙的考勤系统-用户界面设计 基于蓝牙的考勤系统 摘 要 随着教育的普及,大学生的数量也越来越多。不同于初高中的管理,大学更偏向于自主学习。且高校流行选分制度班级流动性增强,因此大学生获得了更多课程选择上的自由度,班级概念弱化,因此学生有着充裕的时间可以去做自己喜欢的项目,从而在自己喜欢的项目上大放异彩,但是在这种情况下,学院管理难度变大。有些学生过于放纵导致对上课产生厌倦情绪,因此产生了逃课,代名互相顶替等行为。而且有些老师淡化管理,进一步纵容了这种行为。在传统的考勤方式比如口头点名,在学生人数太多情况下很难有效检测这些行为。因此,为了杜绝这种行为,基于蓝牙的考勤系统被广泛的应用起来。

    本设计虽然叫基于蓝牙的考勤系统,但蓝牙只负责签到,连接信息交互这方面的功能,其他数据的交互只要靠app和服务端完成。本文主要描述在设计的工作原理和各个模块的内容。本设计以数据库和服务端的交互和作为核心,让学生的蓝牙名称改为自己学号,让设备自己进行搜寻和定位,从而确定学生状态。mysql是服务端的数据库主要用来处理登录、注册、收发通知sqlite为本地数据库,主要用来存储蓝牙通讯的签到以及请假的数据。对于缺勤的学生做出特殊标记且显示出勤率,事后打包信息传送给相关管理人员。这种方法能提高学生出勤率,也能改善教学质量。而且比口头点名更加现代 化. 。

    关键词:蓝牙考勤;
    数据库;
    服务端;

    Bluetooth Management System Based on - User Interface Design Abstract With the popularization of education, the number of college students is increasing. Different from the management of junior and senior high schools, universities prefer autonomous learning. In addition, the class mobility of the popular selection and scoring system in colleges is enhanced, so college students have more freedom in course selection and class concept is weakened. Although there is plenty of time to do the projects they like, so as to shine in the projects they like, in this case, the school management becomes more difficult. Some students are so indulgent that they get bored of classes, so they skip classes and substitute for each other. And some teachers downplay the management, further condoning this kind of behavior. In traditional attendance methods such as oral roll call, it is difficult to detect these behaviors effectively when there are too many students. Therefore, in order to eliminate this kind of behavior, bluetooth based attendance system is widely used.Although this design is called a bluetooth-based attendance system, bluetooth is only responsible for check-in, connection information interaction, other data interaction as long as the app and the server to complete. This paper mainly describes the working principle in the design and the content of each module. The design of the database and server side of the interaction and as the core, let the students' bluetooth name changed to their student number, let the device to search and locate, so as to determine the status of students. Mysql is a server-side database mainly used to handle login, registration, send and receive notification sqlite is a local database, mainly used to store the bluetooth communication check-in and leave data. Students who are absent from school are specially marked and their attendance is displayed. The information is then packaged and sent to the relevant management. This method can improve student attendance and the quality of teaching. And it's more modern than a verbal roll callKeywords: Database;
    Bluetooth Managerment System;
    Clinet-side System 目 录 1前言 1 1.1本设计的目的、意义及应达到的技术要求 1 1.2本设计在国内外的发展概况及存在的问题 1 1.3本设计应解决的主要问题 2 2搭建环境及工具 2 2.1关于Android Studio 2 2.1.1介绍 2 2.1.2环境搭建 2 2.2 关于MyEclipse 2 2.2.1 介绍 2 2.3关于Mysql 2 2.3.1介绍 2 2.3.2环境搭建 3 2.4操作系统选择 3 2.4.1关于Android 3 2.4.2Android架构 3 2.4.3Andr应用程序oid开发的四个主要模块 4 2.5语言JAVA 4 3设计原理 5 4用户界面设计 5 4.1用户界面设计的原则 5 4.1.1界面整洁 5 4.1.2通用性 5 4.1.3合理的界面布局 5 4.14界面设计使用到的布局属性 6 5教师学生界面设计 10 5.1注册界面 10 5.2欢迎界面 10 5.3查询请假界面 10 5.4工具栏界面 11 5.5 登录界面 11 5.6关于系统界面 11 5.7左滑小菜单 11 5.8教师功能界面 11 5.9学生功能界面 12 6接口设计 12 7考勤签到设计原理 13 8总结工作与展望 13 参考文献 14 谢 辞 16 1 前言 在现代化信息管理的时代下 ,教育工作者可用蓝牙考勤系统进行签到。学生可以进行请假,进而更好安排自己的学习计划。老师端不仅可以通过考勤检查学生到勤状况,还可以发布群消息。不仅节省了人工成本,还提高了效率。本设计的基于蓝牙的考勤系统是基于app和服务端交互,蓝牙之间连接。课题针对用户界面设计,意在做出互动性强的界面。[1] 1.1本设计的目的、意义及应达到的技术要求 目前,考勤签到多采占用时间长效率的口头签到,这样易造成课堂学生学习时间减少,时间花在考勤。为了造就一个良好的教学环境,本设计易在完成一个先进高效的蓝牙考勤系统,并使用Android设计一个一致性高,受众广,易上手,界面切换迅速,字体颜色分布看着舒适的界面。选择一个主要色调作为APP的主题色。让操作达到简单舒适的范畴,合理传达视觉元素,达到信息对于用户来说一目了然。

    1.2本设计在国内外的发展概况及存在的问题 近年来随着大学生数量增多,考勤任务变得越来越兼巨,拖延时间也长。教师也不可能每节必点名,这样引起学生的侥幸心理,对学生的学习和发展无疑是种巨大的影响。而改变机制使得点名时间大幅度减少,效率变高。而用户界面设计也是不可或缺的一环,因为考勤的顺利与否会影响积极性(用户体验),所以优化用户使用感受,尽量使用户感受傻瓜式体验。因为企业学习都是追求效率,时间就是金钱,在这种基础上蓝牙考勤系统越来越普及。无论国内还是国外,在不久的将来,口头点名这类地效率低下的方式最终将被淘汰。[4] 在国外,app的设计更加人性化,他们把用户体验作为最终目标,打造了许多让人爱不释手的app。那些app下载率都高居不下,见到有趣十分减压,它由许多元素组成,譬如俏皮的文字,适宜的画面,完美的组合成了这个app,多次使用视觉手法,引发人们的共鸣。

    所以一个好的用户体验是用户对这个app的直观感受,不夸张地说一个良好的互动的的确确能影响到用户对其的使用积极性,从而引发一系列相关连锁问题。本设计以安卓为平台,以点名app为媒介,找到符合大众视觉需求的界面样式。以舒适简洁好用出发。

    但是受限于某些限制,国内设计的操作系统在经验和性能上与国外还有一定差距,手机用户界面没有国外那么人性化,缺少良性互动,缺少实用性。所以应该想方设法增加客户粘。

    1.3本设计应解决的主要问题 打造用户喜欢的用户界面,根据用户的使用习惯设计界面,如阅读习惯,信息语言使用是否恰当,数据对齐排列,屏幕各类图标摆放适宜。减少app中广告植入,过多的广告植入不在用户的享受范围内,而且app应该简单好用,减少复杂的操作和过多的页数。拉近app与客户的距离,应该为了针对该app的专用人群添加该人群熟悉的元素。

    2.1关于Android Studio 2.1.1介绍 Android Studio是Google这家技术公司推出的,用于给Android这个需要合适工作环境的工具用于开发应用和调试的集成工具。

    2.1.2环境搭建 下载安装Android Studio。(可不选择安装Virtual Device)。设定使用Custom,可按照自己的喜好设置。安装路径不能出现中文,因为Android Studio的默认语言中没有中文。根据自己喜好选择内存。第一次安装会自动配置gradle。

    2.2 关于MyEclipse 2.2.1介绍 MyEclipse是一个包含几乎所有Java所学特殊功能于一体开发环境。是高效开发的选择,从Java Spring到REST Web服务再到Maven均可在MyEclipse中统一开发。它有着强大的Java EE优势,也可在WebSphere、WebLogic、Tomcat、Glassfish这种使用各种应用系列服务器。

    该软件没有什么特殊之处。但自带的tomcat并没有那么好用,需自己安装一个7x的,导入路即可。再启动服务器, 下方Console可显示内容与相关信息。

    2.3关于Mysql 2.3.1介绍 MYsql是一个数据存放的仓库。为了方便管理和使用数据库中的数据,数据被按照早就编写好的规律存放。在数据库对数据的管理下,用户日常的操作将更加有效且组织化,也更加易于管理。它由5部分组合成。数据库服务器。数据库,数据表,字段和行。SQL,结构化查询与程序的应用设计语言,是一种有着不寻常目的编程语言,用于存取查询,更新,管理数据库系统。

    2.3.2环境搭建 将Mysql的安装路径配置到Path环境变量中。安装的时候避免中文路径。设置端口为3306.。将字符集设置值为默认的字符其集。

    2.4操作系统选择 2.4.1关于Android 2007年刚成立才22个月的Android公司被Google收购并在11月份被Google纳入OHA(Open Handest Ailance),即是所谓的手机开放联盟。它是在Linux系统上建立的,从开发到现在,Android操作系统一直保持着不可思议的进步速率,而它相对于其他操作系统的优势便是其完全开放的代码。在2008年,第一台基于Android的智能手机面向世人。在此次事件之后,Android以凭借着它的优势势不可挡地进入了其他电子设备地开发领域,并在2011年地第一季度成为全球使用最多地操作系统。在2013年,Android成为了这领域当之无愧的霸主。

    2.4.2Android架构 Android的架构可具体分为4部分。因为Android操作系统是基于Linux内核的基底上开发的,所以这层为Linux Kernel。在这一层中使用的是C语言开发的,都是一些设备的驱动程序,这些驱动程序均为最基础且核心的功能,功能相对比较简答。其进程和内存管理还有服务功能都需要linux来驱动,如显示蓝牙照相机音频驱动。而在这层上面为LIibararies和虚拟机所构成。Library包含一些C++和C语言的程序包。有了这些程序包,许多功能各异的组件就可以被利用到,使开发者在开发过程中更加便捷方便。如因为大多程序要用到图片和视频,所以录制功能和解码有媒体文件功能要用到媒体库。以及标准的系统都要用到的C语言库。又因为Android使用Java编程语言,所以其拥有一个安卓核心系统运行库。有对2D底层图像处理的库SGL。不同于SGL,Surface是用于子系统管理且对图像处理上更有建树。

    Dalvik虚拟机也是这部分的重要组成鹅部分之一,它对于移动的电子设备如平板和智能手机有着与其他设备得天独厚的优势,比如说在有限的组装空间里的芯片储存空间和能快速响应的能力。在这些的上层是应用程序框架(Application Framework),它作为连接程序和linux驱动层能在此基础上开发应用程序,也就是说一个开发人员想要开发应用程序都必须基于开发应用程序框架。在Android程序框架中,而且这必须建立在保证框架是对整个结构没有不良的影响下,为了方便开发人员对程序的访问,一大部分核心重要代码是开放的。因此开发人员在开发不同的应用程序时可以很便捷地互相使用或提供给其他人思路。重复的组件使用减少了,想要替换模块中的组件也更加简单。如内容提供器、通知管理器。

    最上层即为用户直接接触的程序层(Application),在我们的日常生活中有丰富且功能各异的应用程序。如最基础的电话和短信功,备忘录时间网页浏览功能。或可从Google play上下载应用程序其中包括许多开发人员自己开发的程序。使用的语言为JAVA,程序比较灵活不会死板。着这很大程度上归因于用户个人开发和Android本身的核心为同一层次,即构建于安卓系统上的应用程序接口。

    2.4.3Android应用程序开发的四个主要模块 Activity屏幕组件Service服务组件Broadcast Receiver广播接受组件Content Receiver内容提供者。

    Activity 它时一种包含用户界面的组件,这是用户唯一能看到的,也是进行交互的界面。一个应用程序包含着零个或以上的组件。而在活动组件内又包含多个控件。Textview是用来显示文本的EditText顾名思义就是一个可给用户在程序上编辑信息的组件。Button则用来给予用户监听事件活动的功能。具体点理解Activity就是一个程序上的屏幕之一。Activity有四种活动模式,本设计采用默认standard模式。

    Service 它不属于一个独立进程,属于用户看不见的界面,它让Android实现了后台运行的方案,比较适用于那些一直长时间运行但又不用用户进行交互的任务。有点类似于电脑的后台进程。它不需要任何用户界面的帮助,且当用户打开或切换应用程序时并不会对它造成影响。

    Broadcaster Receiver 用来接收系统或者自身应用程序的广播。比如注册软件时的短信提醒,来电提醒功能,闹铃提醒功能等。在Android的广泛选择中你可以选择自己更加感兴趣的程序进行广播。广播分为有序广播和标准广播。标准广播为完全异步,所有接收器几乎同时接收,效率高,但是不能被拦截。有序广播只有等逻辑执行完才有下一步,有先后顺序,优先级高的先接受且它可拦截广播。

    Content Provider 应用程序通常只能访问应用内储存的数据,共享的数据则不能对外提供。内容提供者则实现了跨程序间的数据共享。它有一整套完健全的机制去给权限一个程序去访问另一个程序中的属数据,与此同时还能保证数据在操创建一个供给于数据的访问接口 2.5语言JAVA 目前Java主要应用于中间件的开发 -- 明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发. Java的语法与C++语法类似 ,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage Collector)垃圾处理机制,防止内存溢出。

    优点:JAVA语言健壮且安全,使用servlet机制使得编程更加高效不易崩溃。它时多线程工作模式且可移植性好。

    3设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。

    4用户界面设计 本设计研究内容基于Android这个比较方便使用的系统。设计出来界面内容以XML的格式存储。在研发过程中只需解析这些XML文件,然后再将其中信息补充进相对的界面中。由于本人负责的是用户使用各项功能的见界面设计和界面接口设计。所以本位会着重讲Activity及相关组件。

    4.1用户界面设计的原则 它存在的意义在于它是人与机器交互如进行信息交互对话的中间体。随着高科技的发展,人机交互的方式方法也更加多样化。它有很多种元素构成,比如视觉上和听觉上的交互,用户使用时的操作逻辑。因此界面设计可以说时是一款软件的门面。一个好的人性化设计应该涵盖一下几个方面。[1] 4.1.1界面整洁 保持界面整齐简洁,一个好的界面一定能让用户轻松地掌握它地使用方法,尽量达到用户感觉不到很复杂地界面存在但能快速区分信息地重要性。

    4.1.2通用性 无论是在此应用内还是与其他app比较起来,大体地布局都应该相似。在整体的界面中应该高度一致,特别是在字体的应用上还有对方块的颜色和放置的位置。这样用户的使用才会更加的舒适整洁。用户熟悉界面后能效率更高的工作或转战于其他app。

    4.1.3合理的界面布局 Android中的各种组件位置的放置是非常有讲究的。为了让的界面看起来舒适,排版应均匀,元素放置不应该全聚集于一处或又过于稀疏。可以合理运用颜色,纹理,对比度和光效来制造美感或引导用户的注意力到重点的事物上。文字在某种意义上是传达文化符号的一种信息,所以可对文字进行艺术效果处理,增强联系结构。在重点想描述部分可是用加粗或者黑体下划线来特别说明。应认真思考重点文字的字体和所放置位置,提高可读性和舒适性。除非想打造一种别样的风格,增加视觉感,不然还是以阅读舒适性为主。为了主流大众符合阅读习惯,大多使用左对齐,也可使文字和图片搭配使用,但是还是要以文字为主图片为辅。图形是比较多用到的一种素材。常用于传达信息的用户头像,代表方向的箭头。在一定程度上减少文字的表达,使得app更加多样化且有趣。同时还要注意对应分辨率的大小。在不同情况下,app要按照严格的设计规定。有时候空间有限,应适当剪裁留下重要部分。颜色选用高辨识度。[2] 在进行排版设计中,不仅要靠虑到用户的实际需求还要将想表达的主题信息和视觉要素以适合融洽的方法联系到一起。来自巴塞卢罗那庞培法布拉大学的心理学教授葛思达在研究人类的视觉规律时曾经提到过“最佳视域”这个概念。在一个版面中,它的左和上部分是让人最轻松且容易接收信息的部分,所以设计的时候要注意这两部分的构造。要强调重复性,因为重复的元素不仅可以吸引用户的注意力还能着重强调某种特殊的信息,一般是在用类似和或近似的图片来搭建,可以在律动和放置的位置或者方位上有细微的调整,比只是单一枯燥的重复要好。在构建界面时要注意平衡性,两个有联系的元素上保持视觉的平衡,平衡不一定要完全一样,而是在某些微小特真上改动,大体还是要保持平衡联系性。

    因为用户对色彩是十分敏感的,选择正确的颜色能影响客户的心理程序,比如本设计为与学习相关的app,所以使用让人冷静的墨绿色。而如,消防栓,和灭火器这种能让用户十分敏感,刺激视觉能让人马上注意啊到的颜色。文化的不同对颜色和文字使用不一样,如西方13被代表恶魔,和中国 忌讳谐音。色调统一,能代表开发者对本app的主旨,符合设计心灵学。[5] 4.14界面设计使用到的布局属性 线性布局:Android操作系统布局中比较常用到且简易的布局方式。在这种布局里,它的子布局按照横线或者竖线排布。并可分配权重。

    1其中可用orientation设置为水平或者竖直的排列方式。

    2 gravity里面的控件或者字体的对齐方式,子容器相对于父容器的布局,如左对齐或者底部对齐。而layout_gravity指的是该元素本身的布局。同理width控制控件内文本宽度,layout_width控制控制该元素本身的宽度。height和layout_height一样。layout_weight指布局所占比重,可通过更改属性调整屏幕占比。

    3 在Android中有些组件需要一个int值,表示只接收int该类型的值,按照格式必须以@开头。而如果s是@+则表示修改完某些布局后要在文件中生成相应int值,例@+id/bzzb。变量名为/后面的值。但如果文件中已经存在相同名字的变量则会直接使用已经存在的值。常用在一些输入文本上,比如输入id或者密码。

    4 background,为你的组件生成一个背景图也可以全用别的颜色。

    5 divider,分割线。可以用drawable中的图片,也可以shape定义一个。也可以用showDividers来设置分割线所在位置,有none(无分割线)middle(在两控件中间设置分割线)begining(在顶端设置)end(在末端设置分割线)。

    6 fill_parent,wrap_content,match_parent,这三个属性都是用来将视图内容或尺寸的大小及布局作调整的。fill_parent用来强制性的使组件的尺寸填满该布局内的空间.wrap_content用来完整显示整个布局。match_parent与fill_parent一样。

    7 drawable图片资源,通过@drawable可获取已放置在里面的图片资源。许多app自定义的图标和背景图及其开发者要使用的图片转为xml文件里放在drawable中储存。

    8 values。values存放了colors常用默认的颜色值,使用时可调用,每个颜色有专用的代码。Dimen是屏幕中像素的大小,本设计主要用到的是dp。Strings是字符串,提前写好,使用使直接调用即可。Stylenames是本设计的某些控件主要风格。总的来说就是一个已经整合好的资源库随时可以拿出来调用。

    9 layout_margin,指距离父控件的各距离。Padding控制的内容距离四 边界的距离。Visibility可设置控件是否可见,可设置为不可见及可见,但不可见仍占据布局。Scrollbar用来设置滚动条,用法很多,可设置为是否可见,滚动方向,背景色,是否有轨道,褪色方向。

    10 Edittext文本编辑。Hint可输入提示信息。在输入账号或者密码的时候经常用到。numeric=integer/decimal当有特殊需求只能输入整数或者小数的时候用到。singleLine=true则为设置只能输入单行。TextColour字体颜色。Textstyle字体。TextColourHint默认字体颜色。Typeface=monospace字体间距。Background背景,可设置为null默认没有。MaxLengtht限制文本长度。CusorVisivle设置光标是否可见。Capitalize设置英文字母大小写类型。可设置为AutoText自动纠正文本错误。Editable是否可编辑。Elipise,TextScaleX=1.5控制字与字之间距离。设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)。

    11 Textview:android:text设置显示文本。android:textappearan设置文字外观。android:textcolor设置文本颜色。android:textcolorhighligh被选中文字的底色,默认为蓝色。android:textcolorhint 设置提示信息文字的颜色,默认为灰色。android:textcolorlink文字链接的颜色 textscalex设置文字之间间隔,默认为1.0f。android:textsize 设置文字大小,推荐度量单位”。textstyle设置字形。android:autolin设置是否当文本为:url链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)android:autotext设置,将自动执行输入值的拼写纠正。此时是无效果的,只在显示输入法并输入的时候起作用。android:buffertyp指定gettext()方式取得的文本类别。android:capitalize设置英文字母大写类型。需要弹出输入法才能看得到。android:cursorvisible设定光标为显示/隐藏,默认显示。android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”android:drawablebottom 在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。android:drawableleft在text的左边输出一个drawable。android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)android:freezestext 设置保存文本的内容以及光标的位置。android:gravity 设置文本位置,如设置成“center”,文本将居中显示。android:hinttex为空时显示的文字提示信息,可通过textcolorhint设置提示信息的颜色。android:impositions附加功能,设置右下角ime动作与编辑框相关的动作,如actiondone右下角将显示一个“完成”,而不设置默认是一个回车符号。android:includefontpadding设置文本是否包含顶部和底部额外空白。inputmethod为文本指定输入法,需要完全限定名(完整的包名)。android:inputtype设置文本的类型,用于帮助输入法显示合适的键盘类型。android:linksclickable 设置链接是否点击连接,即使设置了autolink。android:ems设置textview的宽度为n个字符的宽度。这里测试为一个汉字字符宽度。

    12ListView是一个能将数据集合起来以动态滚动方式展示到用户界面View。将具体内容 以列表的形式展示并且能够自适应数据内容,然后通过适配器加载到屏幕。如此说来Adapter是用来在View和数据之间传递的。

    13Button普通按钮ImageButton为图像按钮,为Textview字类,所以它的很多属性可以应用到Button上,通过drawable里的资源StateListDrawable可以将按钮设置成按下去为一个颜色弹起来又为一个颜色。drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态 。state_focused:是否获得焦点。state_window_focused:是否获得窗口焦。state_enabled:控件是否可用。state_checkable:控件可否被勾选,state_checked:控件是否被勾选,state_selected:控件是否被选择,针对有滚轮的情况,state_pressed:控件是否被按下,state_active:控件是否处于活动状态 。state_single:控件包含多个子控件时,确定是否只显示一个子控件。state_first:控件包含多个子控件时,确定第一个子控件是否处于显示状态。state_middle:控件包含多个子控件时,确定中间一个子控件是否处于显示状态。state_last:控件包含多个子控件时,确定最后一个子控件是否处于显示状态。

    14 ImageView为图像视图,就是用来显示图像的一个组件。值得注意的是background背景通常是为了填充屏幕而进行拉伸。而图像试图属于内容,不会进行拉伸而是按照原图片直接进行填充。且在调整缩放的时候要配合maxWIdth最大宽度和maxHeight最大长度这两个属性一起使用,它才会成功调整。fitXY:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变。fitStart:保持纵横比缩放图片,知道较长的边与Image的编程相等,缩放完成后将图片放在ImageView的左上角。fitCenter:同上,缩放后放于中间;fitEnd:同上,缩放后放于右下角。center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。centerCrop:保持横纵比缩放图片,知道完全覆盖ImageView,可能会出现图片的显示不完全。centerInside:保持横纵比缩放图片,直到ImageView能够完全地显示图片matrix:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理 15 fragment可看作一个小型Activity,组件多管理过于麻烦,此时就要用到fragment进行模块化管理,但fragment不可单独使用,会收到宿主Activity的生命周期影响。Fragment的生命周期和Activity有点类似:三种状态:Resumed:在允许中的Fragment可见,Paused:所在Activity可见,但是得不到焦点,Stoped: ①调用addToBackStack(),Fragment被添加到Bcak栈 ②该Activity转向后台,或者该Fragment被替换/删除,但是停止状态的fragment仍然活着 不过对用户不可见。

    16 progressbar是安卓下的进度条,当使用到加载画面的时候或者在看视频的时候进场用到。

    相对布局:也是Android界面设计里常用到的一种布局。顾名思义就是相对父元素或者兄弟组件来有参照的布置子元素。

    5教师学生界面设计 这次设计的教师主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、查看考勤、查看请假、发布通知以及打开校园官网、关于和退出系统。

    本次设计学生主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、蓝牙签到、蓝牙请假、吊起qq联系老师、接收通知、关于系统、退出系统。

    本设计建立的Activity 主要有介绍本APP应用,添加通知界面,登录界面,查看请假和查看签到界面,注册和加载界面。学生老师操作的界面则为了方便管理使用fragment。

    5.1注册界面 当学生或者老师使用本app时首先应注册一个账号,那么就来到了RegisteActivity。采用了线性布局,界面垂直排布,界面占满整个屏幕,调用了drawable里的背景图作为背景,调用了放在layout里面的考勤签到注册布局.整体让这个小长方形里的元素采用竖直线性结构,具体里面采用相关布局因为元素比较多。包含了工具栏toolbar。使用显目大框和bold字体还有符合主题的颜色作为题目。为了能让用户分清哪个框是填对应什么的,使用了hint提示文字并配上对应图标使左对齐。为了能更清晰的让用户看清填的东西将背景色设置为null。并所有文本左对齐layout_marginLeft。使各布局central_vertical垂直居中。服务器地址需要限制输入文本Digits =0,1,2,3,4,5,6,7,8,9,0,.。最下方是提交BUTTON,button放块设置为比其他输入按键稍大。

    5.2欢迎界面 背景布局为全绿色。有开场动画,先弹出string里面第一串字符串考勤签到app然后再弹出第二串字符串毕设作品。然后就进入主界面。

    5.3查询请假界面 先设置好每个item即每个小项目的的规格。比如查询请假时每个学生的请假信息。然后用ListView加载。如果没有项目将用TestView显示暂无数据记录。

    查询签到界面 项目界面与查询签到界面一样。

    5.4工具栏界面 Toolbar在界面的最上端,为了方便用户使用,存在于每一个界面最上端。采用了相对布局,在每一个界面的最上方都存在工具栏。

    5.5 登录界面 将整体设置为好打理的相对布局。在主要界面的上方有加载图标ImageView,在用户填写完账户后弹出。在左上方设置了一个半圆的图标提示用户现在使用的是学生端或教师端。在最下方用Textview设置2020 毕业设计作品提示字样。然后include登录表格布局与注册中一样。不过在最下方添加了注册和登录的Button。

    发布通知界面:最上方是背景图为学校缩略图。往下为三个EditText,分别为发布内容姓名时间。其中发布内容占据板块较大并且都带有hint提示字符。最下方为发布提交Button。

    5.6关于系统界面 有关于系统的介绍和使用的工具,app所拥有功能,开发团队及版本号均使用TextView展示。

    5.7左滑小菜单 在学生或老师主要功能界面有fragment展示学校背景和两个TextView,分别是学校官网和退出系统。在现有的移动用户端中,大多都采用这种形式,不仅与大众群体的习惯有关,这还能整个操作过程变的更加平滑,让用户的操作更加具有流畅性。而且还能再拥挤的屏幕上节省了时间,用户整洁度提高。

    5.8教师功能界面 使用fragment.在登陆界面左上角有可切换为学生端按键。中间有深色底白色字体显示界面的标题。从上到下为符合行业标准的蓝牙地址,账号,密码。并且每个图标必须有特色,不需要字体也可快速分辨出对应图标。登录成功过后下次可记忆最近一次的账号密码。最下面两个功能为注册和登录。最下方字体标明产品来源。登录界面的背景图选用跟app主题颜色相互搭配的图片。

    在点击登录之后,在教师端打开蓝牙期间可现实加载图案。最上方像许多常规app一样显示当前界面,方便用户查明所在界面。下方为教师可发布的公告。公告需放置于仅大标题下,但字体放小可滚动的提醒作用。显示蓝牙状态,因为此为重要状态显示功能,用生活种红色代表失去连接,绿色代表已连接的状态显示,并且消息窗口可现实与哪位学生连接,并且显示蓝牙地址,连接成功后有灰底黑字小框提示。登陆界面的切换学生端改为显示教师名字。并且可发布Tips。由于该页面功能较多,有蓝牙设置,考勤签到,查看签到,查看请假,发布通知,及关于系统的介绍。所以排版不可过于紧凑,流出舒适空间。因此,功能均采用圆形图标。图标要符合审美比例,字体要与界面大小和相应功能图标和界面比例要符合用审美。在做到这些的基础上尽量简洁。一个良好的用户界面设计应与用户的显示世界感官相贴近。

    在学生进行请假时,会有白底黑字弹窗提示,下方可选择拒绝或同意。同时操作后会有通知更新。关于系统介绍北京采用北理珠图片。有作品介绍及使用了哪些工具。下方为主要涵盖功能,如教师学生端均有的登陆注册,蓝牙设置,蓝牙连接,分享至第三方,查看考勤,查看请加发通知,校园官网,关于系统,通出系统。而学生端有蓝牙签到请假,接收通知。主要开发工具为AndroidStudio,MyEclipse,My'Sql,Tomcat,Navicat for MySQL等开发工具,还有开发人员和版本号。这些都是为了使用者能更好了解本功能。并且在此界面右上角为第三方分享,方便使用。

    5.9学生功能界面 同样使用fragment除了开启考勤换成了学生的开连接。

    除了学生端界面改了上面的注释标,发布通知换成了联系老师,查看签到和查到请假换成对应的查看和请假,其他均与教师端基本相同。

    提示界面:因为提示界面转瞬即逝,所以通常使用fragment。加载界面由TextView显示正在加载和Progressbar进度条即可。分别显示的是在有网络延迟正在加载的“正在玩命加载”界面来提示用户现在的情况和“没有更多了”来提示用户浏览界面已经到头了还有最后出现错误的“出错了”界面,后面还加上猫表情拉近开发者与用户的距离。

    6接口设计 界面接口设计指的就是人机的交互形式。因为虽然我们可以用控件做一个精美的界面,但它仅仅只是界面而已,无法与用户进行互动。所以就要用到Android使用最频繁的监听机制。比如用户填写完了基本信之后点击注册按钮,这时候开始向服务器发送登录请求。其实就是在屏幕的后面,当用户交互时看不见的一些动作。

    流程:一开始先为事件源注册监听器,一般是组件。然后用户外部的动作触发然后触发事件源的事件。事件源受到影响后会生成对应事件,此时事件监听器将会把事件的参数记录下来,从而对不同的数据进行数据分析,分析后得到事件的处理方法。事件源,事件,事件监听器。

    主要方法:
    1 直接使用匿名内部类,通常只是用一次,复用性不高,是本设计使用最多的监听方法。

    2 使用内部类,好处是可在该类中进行复用并可直接访问所有界面的组件。

    3使用外部类,这种形式比较少见,即为创建另一个JAVA文件,但通常会导致代码不够简洁好用。

    4 将Activity作为事件的监听器。

    5 直接绑定到标签,即为在layout布局的文件中将对应的Activity中可以定义一个事件的处理方法 ,相对应组件触发事件的组件即可。

    7考勤签到设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。

    8总结工作与展望 本文主要针对设计的考勤签到系统和交互界面设计的优点和一些不足进行总结。

    优点:必要功能健全,使用操作方便,Android系统比较灵活。人和UI界面互动良好,教师可从发布通知,查看考勤情况,也可与学生进行互动。

    缺点:虽然手机端操作方便,但电脑端还要打开服务器,用户界面比较拥挤,而且接口项目有限,多个学生同时连接可能存在丢失情况, 展望:可以拓展更多功能,如签到排名,学生可发弹幕,增加学生与学生及学生和老师之间的良性互动。蓝牙考勤的系统普及关系一定越来越高,app已经广为社会使用。随着技术的更新换代,人机交互的形式也必然更加让用户感同身受。

    参考文献 [1] 王鹏飞,移动设备应用软件交互界面设计[D].工业设计工程,2013 [2] 王延盼,基于安卓的App界面视觉艺术元素的分析与探究[D].艺术与设计学院,2013 [3] 葛会会,基于蓝牙考勤系统的设计与实现[D].电子与通信工程,2016 [4] 向小琼,李敏,蒲昱霖,刘海燕,基于蓝牙通信的高校课堂手机考勤管理系统[R],长沙医学院,2018 [5] 王曦,有关软件中用户界面设计的探讨[N].山东工业技术,2018-10-25(10). 附 录 MyEclipse所用到代码:
    //Food.java package com.bs.bean;

    //功能说明:
    public class Food { public String id; public String uuid; public String name; public String state; public String time; } //Like.java package com.bs.bean; public class Like { public String id;// public String num;// public String name;// public String like;// } //NotifyInfo.java package com.bs.bean; public class NotifyInfo { // 通知 public String id;// public String name;// 姓名 public String content;// 内空 public String type;// 类型 public String time;// 时间 public NotifyInfo(String name, String content) { super(); this.name = name; this.content = content; } } //RatingBar.java package com.bs.bean; /** * * 功能说明:
    * */ public class RatingBar { public String id; public String uuid; public String name; public String state; public String time; } //Suggestion.java package com.bs.bean; /** * * 功能说明:
    * */ public class Suggestion { public String id; public String uuid; public String name; public String state; public String time; } //User.java package com.bs.bean; public class User { public String uuid;// public String name;// public String psd;// public String type;// public String logourl;// public String chineseName;// 中文名字 } //=============================== //FunctionServlet.java package com.bs.servlet; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.bs.bean.NotifyInfo; import com.bs.util.DBUtil; import com.bs.util.ReqType; import com.bs.util.RspType; import com.bs.util.T; /** * 项目名称:bs002 功能说明:多功能管理类 */ @SuppressWarnings(“serial“) public class FunctionServlet extends HttpServlet { private String tag = “FunctionServlet:“; private HttpServletResponse response; private boolean result; private List datalist; private String requestType;// 请求参数集 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.response = response; request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); requestType = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); if (!requestType.contains(“QueryNotify“)) { System.out.println(T.getDateTime() + “=====“ + tag + “======正在请求获取:“ + requestType); } if (requestType.startsWith(“Add“) || requestType.startsWith(“Remove“)) { addTypeRequest(requestType); } else if (requestType.startsWith(“Query“)) { queryTypeRequest(requestType); } else if (requestType.startsWith(“Delete“)) { deleteTypeRequest(requestType); } } /** * 新增数据接口 */ private void addTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Add_Notify)) {// 发布通知 String[] params = requestType.split(“:“); NotifyInfo notify = new NotifyInfo(params[1], params[2]); result = DBUtil.addNotify(notify); } else { return; } if (result) { returnResponseStringData(RspType.SUCC); } else { returnResponseStringData(RspType.FAIL); } System.out.println(“add result:“ + result); } /** * 查询数据接口 */ private void queryTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Query_Notify)) { List<NotifyInfo> notify = DBUtil.getFirstNotify(); returnResponseListData(notify, “notify“); } } /** * 删除数据接口 */ private void deleteTypeRequest(String requestType) { } private void returnResponseStringData(String result) { PrintWriter out; try { out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } private void returnResponseListData(List datalist, String type) { try { JSONObject object = new JSONObject(); JSONArray array = new JSONArray(datalist); object.put(type, array); OutputStream os; os = response.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, “utf-8“); BufferedWriter bw = new BufferedWriter(osw); bw.write(new String(object.toJSONString().getBytes())); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } } //LoginServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:登录校验 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class LoginServlet extends HttpServlet { private String Tag = “LoginServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; String result = DBUtil.checkUser(user); String[] reStrings = result.split(“:“); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); switch (Integer.parseInt(reStrings[0])) { case -1: // 用户名不存在 response.getWriter().print(“用户名不存在“); System.out.println(Tag + “用户名不存在:“ + user.name); break; case 0:// 登录成功 response.getWriter().print(“登录成功“); System.out.println(Tag + “登录成功:“ + user.name); break; case 1:// 密码错误 response.getWriter().print(“密码错误“); System.out.println(Tag + “密码错误:“ + user.name); break; case 2:// 查询异常 response.getWriter().print(“查询异常“); System.out.println(Tag + “查询异常:“ + user.name); break; } } } //RegisteServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:注册 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class RegisteServlet extends HttpServlet { private String Tag = “RegisteServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); System.out.println(Tag + “收到请求:“ + param); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; user.chineseName = reqArray[2]; boolean result = DBUtil.addUser(user); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); if (result) { System.out.println(Tag + “注册成功:“ + user.name); out.print(“0:“ + user.chineseName); } else { System.out.println(Tag + “用户名已存在:“ + user.name); out.print(“-1“); } out.flush(); out.close(); } } //DBUtil.java package com.bs.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.bs.bean.NotifyInfo; import com.bs.bean.User; /** * * 数据库连接工具 */ public class DBUtil { private static Connection con; private static PreparedStatement ps; private static ResultSet rs; static { try { Class.forName(“com.mysql.jdbc.Driver“); con = DriverManager .getConnection( “jdbc:mysql://localhost:3306/bs002elm?characterEncoding=utf-8“, “root“, “123“); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /** * 用户注册 * * @param name * @param psd * @return */ public static Boolean addUser(User u) {// TODO Boolean result = null; List<User> list = DBUtil.getAllUsers(); for (User user : list) { if (u.name.equals(user.name)) { return false; } } String sql = “insert into user(uuid,name,psd,chinese_name) values(?,?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, UUID.randomUUID().toString()); ps.setString(2, u.name); ps.setString(3, u.psd); ps.setString(4, u.chineseName); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addUser Exception]“ + e.toString()); } return !result; } /** * 用户登录校验 * * @param uu * @return */ public static String checkUser(User user) { String result = “-1“; String sql = “select * from user where name=?“; try { ps = con.prepareStatement(sql); ps.setString(1, user.name); rs = ps.executeQuery(); while (rs.next()) { if (user.psd.equals(rs.getString(4))) { result = 0 + “:“ + rs.getString(6);// 返回移动端 中文名字 } else { result = “1“; } } } catch (SQLException e) { e.printStackTrace(); result = “2“; } return result; } /** * 添加通知 * * @param name * @param psd * @return */ public static Boolean addNotify(NotifyInfo notify) { Boolean result = null; String sql = “insert into notify(content,name,time) values(?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, notify.content); ps.setString(2, notify.name); ps.setString(3, T.getCurrentTimeMillis()); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addNotify Exception]“ + e.toString()); } return !result; } /** * 获取通知 * * @return */ public static List<NotifyInfo> getFirstNotify() { List<NotifyInfo> list = null; NotifyInfo m = null; String sql = “select * from notify order By id desc limit 1“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<NotifyInfo>(); } m = new NotifyInfo( rs.getString(“name“),rs.getString(“content“)); list.add(m); } } catch (SQLException e) { System.out.println(“[getNotifyInfo Exception]“ + e.toString()); } return list; } /** * 修改密码 */ public static Boolean updatePsd(String uuid, String psd) { Boolean result = false; String sql = “update user set password=? where id =?“; try { ps = con.prepareStatement(sql); ps.setString(1, psd); ps.setString(2, uuid); result = ps.execute(); result = true; } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 获取注册用户列表 * * @return */ public static List<User> getAllUsers() {// TODO User user; List<User> list = null; String sql = “select * from user“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<User>(); } user = new User(); user.uuid = rs.getString(“uuid“); user.name = rs.getString(“name“); user.psd = rs.getString(“psd“); user.chineseName = rs.getString(“chinese_name“); list.add(user); } } catch (SQLException e) { System.out.println(“[getAllUsers Exception]“ + e.toString()); } return list; } } //JsonUtils.java package com.bs.util; import com.sun.org.apache.bcel.internal.generic.NEW; import test.Student; public class JsonUtils { public static void main(String[] args) { } // public static String toJson(RspType r) { // // 1、使用JSONObject // // JSONObject json = JSONObject.fromObject(r); // // String result = json.toString(); // return result; // } public static String toJson2() { Student stu = new Student(); stu.setName(“JSON“); stu.setAge(“23“); stu.setAddress(“北京市西城区“); // // 1、使用JSONObject // JSONObject json = JSONObject.fromObject(stu); // // 2、使用JSONArray // JSONArray array = JSONArray.fromObject(stu); // String jsonString = com.alibaba.fastjson.JSONObject.toJSONString(stu); System.out.println(jsonString); // String strJson = json.toString(); // String strArray = array.toString(); // // System.out.println(“strJson:“ + strJson); // System.out.println(“strArray:“ + strArray); // strJson:{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“} // strArray:[{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“}] return jsonString; } public void test2() { } public void test3() { } } //ReqType.java package com.bs.util; public class ReqType { public static final String Query_RatingBar = “QueryRatingBar“; public static final String Query_Suggestion = “QuerySuggestion“; public static final String Query_FoodOrder = “QueryFoodOrder“; public static final String Query_Notify = “QueryNotify“; public static String Add_RatingBar = “AddRatingBar“; public static String Add_Suggestion = “AddSuggestion“; public static String Add_FoodOrder = “AddFoodOrder“; public static String Add_Like = “AddLike“; public static String Add_Notify = “AddNotify“; public static String Remove_Like = “RemoveLike“; public static String Query_Favorite = “QueryFavorite“; } //RspType.java package com.bs.util; public class RspType { // 返回给移动端的状态值 public static String SUCC = “true“; public static String FAIL = “false“; private int code; public RspType(int code) { this.code = code; } @Override public String toString() { return “ResponseCode{“ + “code:“ + code + '}'; } } //T.java /* */ package com.bs.util; import java.io.ByteArrayInputStream; import java.text.SimpleDateFormat; import java.util.Date; /** * 功能介绍:多功能工具类 * * @author JianRong * @date2016-12-30上午11:09:00 */ public class T { public static String getDateTime() { SimpleDateFormat farmatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“);// 获取日期时间 return farmatter.format(System.currentTimeMillis()); } public static String getCurrentTimeMillis() { return String.valueOf(System.currentTimeMillis()); } public static void log(String log) { System.out.println(“===========“ + log); } public static boolean strIsNumber(String str) { String reg = “-?[0-9]+(.[0-9]+)?$“; return str.matches(reg); } } //test //Student.java package test; public class Student { // 姓名 private String name; // 年龄 private String age; // 住址 private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return “Student [name=“ + name + “, age=“ + age + “, address=“ + address + “]“; } } 发送蓝牙连接 package com.app.bs.kqqd.bluetooth.api.request; import org.json.JSONException; import org.json.JSONObject; public class RequestMessage extends com.app.bs.kqqd.bluetooth.api.Request { public RequestMessage() { super(REQ_MSG); } public RequestMessage(int cmd, String msg) { super(REQ_MSG); this.cmdId = cmd; this.msg = msg; } @Override public RequestMessage newInstance() { return new RequestMessage(); } @Override public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(MSG, msg); return jsonObject; } @Override public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getString(MSG); } } //适配器 package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class GanHuoAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public GanHuoAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new GanHuoViewHolder(parent); } } //-------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.widget.TextView; import com.app.bs.kqqd.R; import com.app.bs.kqqd.model.GanHuo; import com.app.bs.kqqd.util.TimeUtil; import com.jude.easyrecyclerview.adapter.BaseViewHolder; /** * */ public class GanHuoViewHolder extends BaseViewHolder<GanHuo.Result> { private TextView title; private TextView type; private TextView who; private TextView time; public GanHuoViewHolder(ViewGroup parent) { super(parent, R.layout.ganhuo_item); title = $(R.id.title); type = $(R.id.type); who = $(R.id.who); time = $(R.id.time); } @Override public void setData(GanHuo.Result data) { super.setData(data); //标题 title.setText(data.getDesc()); //干货类型 type.setText(data.getType()); //根据干货类型动态替换干货图标 if (data.getType().equals(“Android“)){ setDrawableLeft(R.drawable.ic_android_black_24dp); }else if (data.getType().equals(“iOS“)){ setDrawableLeft(R.drawable.ic_whatshot_black_24dp); }else { setDrawableLeft(R.drawable.ic_play_circle_filled_black_24dp); } //干货贡献者 who.setText(data.getWho()); //干货提交时间 time.setText(TimeUtil.getFormatTime(data.getPublishedAt())); } public void setDrawableLeft(int imageId){ Drawable drawable = getContext().getResources().getDrawable(imageId); drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); type.setCompoundDrawables(drawable,null,null,null); } } //----------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } //----------------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } App注册响应和请求 package com.app.bs.kqqd.bluetooth.api; import com.app.bs.kqqd.bluetooth.api.request.RequestMessage; import com.app.bs.kqqd.bluetooth.api.request.ResponseMessage; import com.app.bs.kqqd.bluetooth.api.request.UnknownReq; import java.util.HashMap; import java.util.Map; public class CmdFactory { private static CmdFactory instance; private Map<Integer, Request> requestMap = new HashMap<>(); private Map<Integer, Response> responseMap = new HashMap<>(); private CmdFactory() { register(new RequestMessage()); register(new ResponseMessage()); } public static CmdFactory getInstance() { if (null == instance) { synchronized (CmdFactory.class) { if (null == instance) { instance = new CmdFactory(); } } } return instance; } public void register(Request req) { requestMap.put(req.getCmdId(), req); } public void register(Response rsp) { responseMap.put(rsp.getCmdId(), rsp); } public Request createRequest(int cmd) { Request request = requestMap.get(cmd); if (null != request) { return request.newInstance(); } return new UnknownReq(); } public Response createResponse(int cmd) { Response response = responseMap.get(cmd); if (null != response) { return response.newInstance(); } return new Response(Request.REQ_UNKNOWN); } } 对app请求响应和处理 package com.app.bs.kqqd.bluetooth.api; import org.json.JSONException; import org.json.JSONObject; public class Response { public static final int SUCCESS_CODE = 0; public static final String CMD = “cmd“; public static final String CODE = “code“; public static final String MSG = “msg“; public int cmdId; public int code; public String msg = ““; public Response(int cmdId) { this.cmdId = cmdId; } public int getCmdId() { return cmdId; } public boolean isOK() { return code == SUCCESS_CODE; } public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(CODE, code); jsonObject.put(MSG, msg); return jsonObject; } public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getInt(CODE); jsonObject.getString(MSG); } public Response newInstance() { return new Response(cmdId); } } 蓝牙连接 package com.app.bs.kqqd.bluetooth.api; import java.io.IOException; import java.util.concurrent.TimeoutException; public interface Connector { void startServer(); void stopServer(); boolean isServerOK(); void connect() throws TimeoutException, IOException; boolean isConnected(); void send(byte[] b) throws IOException; int recv(byte[] b) throws IOException; int recv(byte[] b, int offset, int count) throws IOException; void disconnect(); } 未知请求信息 package com.app.bs.kqqd.bluetooth.api.request; import com.app.bs.kqqd.bluetooth.api.Request; public class UnknownReq extends Request { public UnknownReq() { super(Request.REQ_UNKNOWN); } @Override public UnknownReq newInstance() { return new UnknownReq(); } } 调用蓝牙进行匹配连接 package com.app.bs.kqqd.bluetooth.api; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class BluetoothConnector implements Connector { public final static String MOS_UUID = “6c12a327-0e0b-4344-8137-c41e2a79a50d“; private String deviceAddress; BluetoothServerSocket serverSocket; private boolean stopServerFlag; private BluetoothSocket localSocket; private BluetoothSocket remoteSocket; private BluetoothSocket connectedSocket; private InputStream inputStream; private OutputStream outputStream; public BluetoothConnector() { } public BluetoothConnector remoteDeviceAddress(String deviceAddress) { this.deviceAddress = deviceAddress; return this; } public void startServer() { new Thread(new Runnable() { @Override public void run() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (null == bluetoothAdapter) { return; } try { serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(“MOS_SERVICE“, UUID.fromString(MOS_UUID)); } catch (IOException e) { serverSocket = null; return; } stopServerFlag = false; while (!stopServerFlag) { try { remoteSocket = serverSocket.accept(); connectedSocket = remoteSocket; inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } catch (IOException e) { } } stopServer(); } }, “Bluetooth Server“).start(); } public void stopServer() { disconnect(); stopServerFlag = true; if (null != serverSocket) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } serverSocket = null; } } @Override public boolean isServerOK() { if (null == serverSocket) { return false; } return true; } @Override public void connect() throws IOException { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); boolean deviceFound = false; for (BluetoothDevice device : bondedDevices) { if (device.getAddress().equals(deviceAddress)) { deviceFound = true; localSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(MOS_UUID)); localSocket.connect(); connectedSocket = localSocket; if (null != connectedSocket) { inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } break; } } if (!deviceFound) { throw new IOException(“bluetooth device not found“); } } @Override public boolean isConnected() { if (null == connectedSocket) { return false; } return connectedSocket.isConnected(); } @Override public void send(byte[] b) throws IOException { if (null != outputStream) { outputStream.write(b); } } @Override public int recv(byte[] b) throws IOException { return recv(b, 0, b.length); } @Override public int recv(byte[] b, int offset, int count) throws IOException { if (null != inputStream) { return inputStream.read(b, offset, count); } return 0; } @Override public void disconnect() { if (null != connectedSocket) { try { inputStream = null; outputStream = null; connectedSocket.close(); connectedSocket = null; } catch (IOException e) { e.printStackTrace(); } } } }

    推荐访问:

    • 文秘
    • 范文
    • 文秘知识
    • 书信条据
    • 行政
    • 求职离职
    • 名人名言

    推荐访问