基于Android的手势加密软件的设计与实现_第1页
基于Android的手势加密软件的设计与实现_第2页
基于Android的手势加密软件的设计与实现_第3页
基于Android的手势加密软件的设计与实现_第4页
基于Android的手势加密软件的设计与实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、 基于Android的手势加密软件的设计与实现摘 要智能终端的不断发展为人们的工作和生活提供了更多的便利,人们正逐步的走向移动办公,移动生活和移动计算,而众多的手机APP正在为我们提供着各种各样的服务。但是众多手机APP中都存入了我们大量的个人私密信息,信息安全成为一项重要的事情。信息的泄露会对我们的人生和财产安全都造成极大的损害,垃圾短信、骚扰电话、不法分子诈骗等等。所以,信息加密就显得尤为重要。因此,设计开发一款为手机加密的软件是十分符合用户需求的,有良好的市场前景。而作为市场份额占据量最大的手机操作系统Android操作系统自然也是有着大量的服务需求,而本系统是基于Android操作系统

2、的手势加密软件,本软件是在Eclipse开发环境下,使用Java语言进行开发的,实现了良好的手机软件加密和解锁功能,实现了对APP信息安全的保护,有着重大的意义。关键词:Android;手势加密;SQLite;信息安全Design and Implementation of Gesture Encryption Software Based on AndroidABSTRACTThe continuous development of intelligent terminal for people's wo

3、rk and life more convenient, people are gradually towards mobile office, mobile life and mobile computing, and many mobile phone APP is to provide us with the variou

4、s services.But many in the phone APP in the us a lot of personal private information, information security becomes an important thing.Information disclosure will for our 

5、life and property security caused great damage, spam messages and harassing phone calls, criminals, fraud, etc.Therefore, information encryption is particularly important.Therefore, design a

6、nd develop a software for mobile encryption is very conform to user requirements, has the good market prospect.As market share to occupy the largest amount of mobile 

7、;phone operating system Android operating system is also there are a large number of service requirements, but this system is based on the Android operating system signal

8、 encryption software, this software is in the Eclipse development environment, using the Java language, realizes the good phone software encryption and unlock function, realized

9、60;to the APP information security protection, is of great significance.Keywords: Android;gestures encryption;SQLite; Information Security1 绪论1.1 本课题的研究背景 Android系统是Google以开源的定位来发布的一套系统,所以Android秉承了开源技术的基本特征:免费,安全,易于开发,并且系统的移植性很强。在Google发布时,宣称是第一个为移动终端打造的

10、真正开放和完整的移动软件。所以,Android具有很强的竞争优势。主流的手机操作系统:Android(谷歌)、iOS(苹果)、windows phone(微软)、Symbian(诺基亚)、BlackBerry OS(黑莓)、windows mobile(微软)等。1.2 国内Android研究现状开发者一般身处规模较大的公司,这些公司主要为自有品牌或者其他品牌设计手机或者平板电脑的总体方案。除了根据需求对系统进行定制外,更多的工作在于为这些系统编写定制的应用。开发者一般处于创业型公司或者是独立开发者,他们的盈利方式主要是2种:为国外公司进行外包开发,或者通过Google的移动广告(AdMob)

11、通过广告点击分成。1.2.1 Android的发展前景Android这个技术比较新,不管是相关的书籍还是学校的教育,都是在初级的阶段,正因为如此,Android的人才需求会在一段时间里供不应求。Android人才的就业前景非常广泛。1.2.2 Android系统的发展趋势伴随着Android的市场不断扩大,国内的Android市场会大概有五大发展趋势:多媒体和移动应用需求的上升,将成为市场发展的主要动力;PDA功能类和开放程度高的操作系统产品,将是手机产品发展的赵势;产品持续大幅度降价和价格竞争趋于激烈,将是产品价格的发展趋势;渠道形式多样化和手机渠道仍占主流,将是产品渠道主要的发展趋势;差异

12、化售后服务和个性化增值服务,将成为产品服务发展的趋势。  总而言之,Android智能手机操作系统凭借着它超前并多种多样的功能为人们的生活带来了重大变化。可是,Android手机操作系统在给我们带来方便的同时,也伴随着一些无法避免的负面的作用。所以,我们应当理性的面对,不能沉溺于此,更不能仰仗着它的功能任意妄为。我们应该正确面对Android,让它随着时代与科技的发展,给人类带来更多的福利。如此一来,安卓手机的发展前景也是一片光明的。1.3 本课题的工作本软件要完成基于Android的手势加密软甲的设计与实现,要完成这些,首先必须要有非常扎实的专业知识的积累,同时要对Android开

13、发的设计流程及思路有一定的了解。作为手机加密的软件,最主要的是要让用户体验到本系统的加密效果,给用户一个非常好的加密解密效果。通过开发一个项目,了解Android平台的设计思路和开发的流程。具体来讲:1.通过分析当下阶段的各种人群的需求和对事物的关注程度来选择研究的项目,即手势加密软件;2.通过独立设计UI来了解Android甚至是移动平台开发的UI的设计流程;3.通过选取不同的数据存储来方式存储用户手势密码及较私密的数据,来了解Android平台的数据化持久操作;4.通过设计各个功能点,大致接触Android平台开发过程中所需要注意的问题,体会怎样获得才能实现更好的人机交互体验;5.通过测试

14、来完善程序,使逻辑不合理的地方和Bug最小化,并进一步了解Android平台的相关先进的特点和人性化的设计,并且熟习在软件开发的过程中的相关流程并深切了解在编代码的时候,了解一些注意事项的重要性;2 关键技术介绍2.1 Android平台相关概念2.1.1 Android系统的特点1.开放性。Google 与开放手机联盟合作开发了 Android,Google 公司通过与运行商、开发商、设备制造商和其他有关各方面的商家结成牢固的合作的关系,并且希望通过建立开放、标准化的软件平台的方式,在移动产业中构建一个开放的生态系统。2.应用程序无界限。Android 上的应用可以通过标准 API(Appl

15、ication Programming Interface,应用程序编程接口)访问核心功能。通过访问互联网,应用程序可以发布它们的各种功能来供互联网上的其他的应用程序使用。3.Google应用。在互联网上的Google公司已经有10年的悠久的历史,从搜索巨人到全面渗透互联网的工程中,Google服务,如邮件、地图、搜索等服务俨然成为衔接用户与互联网的重要枢纽,而Android手机操作系统将完美的应用这些优秀的Google服务。2.1.2 Android 移动平台开发研究过程作为 21 世纪新的 Android 移动开发平台,并获得更多开发商青睐,并逐渐形成了一套具有 Android 开发过程的

16、特点。发展过程如下所示 1.需求分析。一个软件必须要有它存在的价值和意义,他才会被涉及出来。这些必需的价值和意义就是通过需求分析来找到。2.功能分析。软件被为了允许用户使用。怎样让用户拥有一个良好的用户体验是每一程序员必须要考虑的事情,同时要让这个手机软件成功的受欢迎,这是必须要做的一件事。3.界面设计。作为一个手机软件,其只能在极其有限的区域中显示自己的界面。如何在有限的空间里面更完美的展现出软件的独特之处就显得更加尤为重要了。4.系统的开发。系统功能的有效性取决于系统的发展是好还是坏。5.测试。在任何一个软件开发行业中,无论是J2EE、J2SE、J2ME等等其他的开发中,测试是必不可少的一

17、环。在Android 平台开发中,手机的不断使用,硬件上的缺陷,让我们对软件的条件就更加的苛刻,这就要在软件开发结束后,进行严苛的测试。2.2 开发环境介绍2.2.1 Android SDKSDK(software development kit):Android软件开发工具包,谷歌提供的 Android 开发工具包,在开发 Android 程序时,我们需要通过引入该工具包,来使用 Android 相关的 API。 2.2.2 Eclipse相信所有的 Java 开发人员,此工具必须是很熟悉,它的 Java 开发工件,最好的 IDE 工具之一。Eclipse 插件工具支持很多,使它不仅可以用于

18、开发 Java 和可以很容易地支持发展的几乎所有的主要语言,当然,是完美的 Android 开发。Eclipse 是一个开放源码的基于 Java 的可扩展开发平台。就其本身而言,它是一个框架和一组服务插件组件用于生成一个开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Kit,JDK)。 2.2.3 ADT ADT 全称 Android Development Tools,是谷歌提供的一个 Eclipse 插件,用于在 Eclipse 中提供一个强大的、高度集成的 Android 开发环境。2.2.4 SQLiteSQLit

19、e3是一款轻型的数据库,是遵守ACID的关联式数据库管理系统。它占用的资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。2.2.5 本软件的开发环境版本本软件是在windows 10 操作系统中,利用Eclipse Luna Release (4.4.0)开发工具搭载Android SDK工具包,结合Android手机自带的sqlite3数据库进行开发。2.3 Android系统基本框架Android平台的基本框架如图2-1所示。图2-1 Androi

20、d基本框架图1.Linux 内核层Android 系统是基于 Linux 2.6 内核的,这一层为 Android 设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。 2.系统运行库层 这一层通过一些 C/C+库来为 Android 系统提供了主要的特性支持。如 SQLite 库提供了数据库的支持,OpenGL|ES 库提供了 3D 绘图的支持,Webkit 库提供了浏览器内核的支持等。 3. 应用框架层 这一层提供了构建应用程序时可能用到的各种 API(Application Programming Interface,应用程序编程接口

21、),Android 自带的一些核心应用就是使用这些 API 完成的,开发者也可以通过使用这些 API 来构建自己的应用程序。 4. 应用层 全部安装在手机上的应用程序均归于这一层的,例如系统自带的联系人、短信等程序,或者是你自己开发的应用程序。 2.3.1 ApplicationsApplication Android会和一个核心应用程序包一起发布,这个应用程序包包括email客户端,地图,浏览器,SMS短消息程序,日历,联系人管理程序等。所有的应用程序都是用JAVA编程语言编写的。2.3.2 Libraries库Android 包括 C/C+ 库的集合。这个库通过 Android 应用程序框

22、架给作开发的人提供服务。2.3.3 Android RuntimeAndroid系统是以Linux系统为底层构建的,Android系统是开源(源代码公开)的,Android系统势必会适配到不同硬件配置的设备上,因此谷歌为了降低应用的开发难度在Linux底层之上构筑了一个名为“Dalvik”的虚拟机。2.4 Activity简介Android系统中,所有的Activity被保存在Activity栈中,当启动一个新的Activity时,这个Activity就被压入Activity栈顶部,如果用户通过”返回”键回到上一个Activity的界面,栈顶的Activity将会被销毁,位于栈顶的第二个Act

23、ivity就变成为新的Activity,并显示在屏幕上。所以当前显示在用户面前的Activity都是栈顶元素。2.4.1 Activity的生命周期Activity的生命周期是指一个Activity从创建到销毁的过程,期间可能经历多个状态的变化,每次状态的变化都会触发相应的回调方法。Activity创建配置完成之后,至于该Activity何时被实例化,它的方法何时被调用,Activity何时结束等,对开发者来说是完全透明的。而是由android系统决定的。2.5 IntentIntent可以划分为显示意图和隐式意图。显示意图调用Intent。SetClass方法明确制定了组件名的Intent为

24、显示意图,显示意图明确制定了Intent应该传递给那个组件,在同一个应用程序内部使用的。隐式意图是没有清楚标志组件名的Intent。Android系统会依据隐式意图中配置的动作(action)、类别(category)找到最匹配的组件来接纳Intent。 2.6 Handler机制作为开发者,我们需要顾及用户的体验,功能的优化,但是Android的用户界面操作不是线程安全的。这就表示假如有很多个线程同时操作用户界面组件,或许会使线程出现安全问题。为了避免这个现象的出现,Android操作系统指定了一条方便的规则:只允许UI线程修改Activity的UI组件。 如果子线程想要更改用户界

25、面组件的属性值,那么就必须通过Handler的消息机制来做到了。消息机制需要的几个组件:Message Queue,Handler,Looper。Android线程是单线程模式,Android的进程在启动时,会新建一个主线程(UI线程)去管理用户界面的有关操作,因为还有顾及效率的问题,主线程不是线程安全的,而子线程不能直接更换主线程内的控件的属性值,用户界面控件只可由UI线程去改变。通过想要做到线程间的沟通,只能靠Android的消息机制等技术。3 系统分析在本课题中对系统的分析必不可少,为了更好地进行分析需要遵循以下几点原则:在系统设计上要满足面向用户的基本原则;系统设计在结构方面要满足结构

26、化分析原则。3.1 系统可行性系统的可行性分析主要包括经济上的可行性,技术上的可行性,操作上的可行性和法律上的可行性。3.1.1 经济可行性基于Android的手机加密软件的开发经济需求的比较低,加上具有成熟的Android平台以及十分普及的智能移动设备,所以在软硬件的支出上并不是很多。本课题的设计开发具有相当大的经济可行性。3.1.2 技术可行性用Android技术进行开发,从Android出现,发展到现在,Android已经算的上是一个较成熟的平台了,而且,现在有越来越多的企业和技术人员都选择它来作为开发平台。因此,在技术上Android是完全可以胜任这个平台的开发。所以,它的灵活性、安全

27、性和易用性为软件的开发和设计提供了良好的条件。3.1.3 操作可行性要使用这个手势加密软件,用户仅仅需要一台带有Android操作系统的手机,系统的操作习惯都符合人们日常的操作习惯。所有的功能和操作都能够在手机上实现,只需在使用软件的时候提示用户。因此,在软件的使用的角度上,本软件使用起来简单、方便,能够使用户更方便的熟悉软件的操作,所以在操作可行性上是行得通的。3.1.4 法律可行性法律可行性是考虑要开发的系统是否存在有任何侵犯、妨碍和责任问题,现行的管理制度、人员素质、操作知识是否可行。根据实际情况,本软件在法可行性上可行的。3.2 系统开发环境3.2.1 软件环境开发环境:JDK1.7.

28、0_79、Eclipse Luna Release (4.4.0)、ADT数据库:SQLite数据库Android环境:Android SDK3.2.2 硬件环境笔记本电脑(任何一部配置电脑即可)3.3 系统功能需求分析本手势加密软件是基于Android平台的软件,实现了手机上的手势加密和解密功能,以九宫格的样式进行表现,方便用户的手势操作,具有非常高的用户体验。详细的说,本软件总共需要实现下面这些功能:3.3.1 九宫格图案加锁与解锁采用用户体验较好的九宫格的风格来进行加锁与解锁的手势绘制。整个九宫格的风格美感十足,用户仅仅需要滑动手指会绘制加密的手势图案以及解锁的手势图案。3.3.2 错误

29、次数限制为了更好的保护用户的隐私,提高手势加密软件的安全性,如果输入手势密码错误超过3次,软件会自动锁住30秒,用户不能再输入手势密码,九宫格会隐藏,只有等到时间结束,才可以再次输入,同时在界面上提示还剩多少秒,用户可以再次输入手势密码进行操作,如果紧接着再输错,时间会加倍。3.3.3 重置密码在第一次完成手势密码设置后,会让用户完善自己的个人资料,包括手机号及字符串密码,这么做的目的主要是为了防止以后用户忘记了自己的手势密码时,可以根据之前注册的手机号和字符串密码进行重置手势密码3.4 系统总体设计针对这个手势加密软件,我把系统分为初始化密码模块,手势解密模块和错误警告模块和重置密码模块这三

30、个模块,初始化密码模块主要实现对密码的初始化和保存操作,手势解密模块主要实现检验输入手势密码的正确性,而错误警告模块主要负责对解密手势错误的提示以及错误次数的限制功能,整个软件的功能框架如图3-1所示。图3-1 系统功能框架图3.5 系统流程设计系统流程设计是十分重要的一步。程序流程图是很基础的分析方式。本软件的流程可以归纳成从设置密码到解锁的过程,软件开始时,用户第一次打开软件时,会自动让用户设置初始密码,设置成功后会保存在手机上,而后在用户解锁时,软件会把用户通过手势滑动出的密码和之前保存的密码进行对比,如果两个密码一样,那么解锁成功,不然,提示解锁失败,而且还会有解锁次数限制。具体的流程

31、图如下:图3.2 软件流程图4 系统编码实现4.1 九宫格实现在手机软件中,九宫格是十分常见的样式,尤其是在Android平台上,更为常见。在自定义九宫格滑动View之前,我们需要自己定义一个组件,该组件继承自View,然后通过onLayout,onDraw来加载九个可以显示的图片,实现九宫格的初始化。Java 手势密码容器类,即九宫格。下面这一段代码根据Android 里的画布机制,初始化九宫格图案,根据监听用户的手势事件,使用户能够在屏幕上通过滑动在九宫格上画出加锁的手势和解锁的手势。public class GestureContentView extends ViewGroup pri

32、vate int baseNum = 6;/* * 每个点区域的宽度 */private int blockWidth;/* * 通过PointUtil工具类获取到屏幕的分辨率 */private int screenDisplay;/* * 声明一个集合用来封装坐标集合 */private List<Point> list;private Context context;private boolean isVerify;private GestureDrawline gestureDrawline;/* * 包含9个ImageView,初始化数据 * * param contex

33、t * param isVerify * 是否为校验手势密码 * param Password * 用户输入密码 * param callBack * 手势绘制完毕 */public GestureContentView(Context context, boolean isVerify,String Password,GestureCallBack callBack) super(context);screenDisplay = PointUtil.getScreenDisplay(context);blockWidth = screenDisplay0 / 3;list = new Arr

34、ayList<Point>();this.context = context;this.isVerify = isVerify;/ 添加9个图片addChild();/ 初始化一个可以画线的viewgestureDrawline = new GestureDrawline(context, list, isVerify,Password, callBack);private void addChild() for (int i = 0; i < 9; i+) ImageView imageView = new ImageView(context);imageView.setB

35、ackgroundResource(R.drawable.gesture_node_normal);this.addView(imageView);invalidate();/ 刷新View,int row = i / 3;/ 第几行int col = i % 3;/ 第几列/ 将屏幕分成三个部分,每个图片与每个部分的margin是blockWidth/baseNumint leftX = col*blockWidth+blockWidth/baseNum;int topY = row*blockWidth+blockWidth/baseNum;int rightX = col*blockWi

36、dth+blockWidth-blockWidth/baseNum;int bottomY = row*blockWidth+blockWidth-blockWidth/baseNum;Point point = new Point(leftX,rightX,topY,bottomY,imageView,i+1);list.add(point);/* * 完成对childView位置的指定 */Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) / TODO Auto-generated me

37、thod stubfor (int i = 0; i < getChildCount(); i+) int row = i / 3;int col = i % 3;View v = getChildAt(i);v.layout(col * blockWidth + blockWidth / baseNum, row * blockWidth+ blockWidth / baseNum, col * blockWidth + blockWidth- blockWidth / baseNum, row * blockWidth + blockWidth- blockWidth / baseN

38、um);/* * 测量view和子view的宽高度 */Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) / TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);/ 遍历设置每个子View的大小for (int i = 0; i < getChildCount(); i+) View view = getChildAt(i);view.measure(widthMeas

39、ureSpec, heightMeasureSpec);/* * 保留路径delayTime时间长 */public void clearDrawlineState(long delayTime) gestureDrawline.clearDrawlineState(delayTime);/* * 不知道有啥用 * * param parent */public void setParentView(ViewGroup parent) / 得到屏幕的宽度int width = screenDisplay0;LayoutParams layoutParams = new LayoutParams

40、(width, width);this.setLayoutParams(layoutParams);gestureDrawline.setLayoutParams(layoutParams);parent.addView(gestureDrawline);parent.addView(this);4.1.1 手势密码路径绘制类根据OnTouchEvent方法的不同事件,ACTION_DOWN、ACTION_MOVE、ACTION_UP分别处理不同的逻辑。* * 手势密码路径绘制 * * author Administrator * */private Point getPointByNum(i

41、nt num) for (Point point : list) if (point.getNum() = num) return point;return null;Overridepublic boolean onTouchEvent(MotionEvent event) / TODO Auto-generated method stubif (isDrawEnable = false) / 当前不允许绘制return true;paint.setColor(Color.rgb(245, 142, 33);/ 设置默认连线颜色switch (event.getAction() case M

42、otionEvent.ACTION_DOWN:System.out.println("手指按下");System.out.println("linelist.size()=" + lineList.size();if (callback.checking() return true; else mov_x = (int) event.getX();mov_y = (int) event.getY();/ System.out.println("手指坐标:x=" + mov_x + ",y=" + mov_y);cu

43、rrentpPoint = getPointAt(mov_x, mov_y);if (currentpPoint != null) currentpPoint.setPointState(Point.POINT_STATE_SELECTED);passWordSb.append(currentpPoint.getNum();/ System.out.println("currentPoint:x = "/ + currentpPoint.getCenterX() + ",y = "/ + currentpPoint.getCenterY();invali

44、date();break;case MotionEvent.ACTION_MOVE:clearScreenAndDrawList();/ 得到当前移动位置处于那个点内Point pointAt = getPointAt(int) event.getX(), (int) event.getY();/ 代表当前用户手指处于点与点之间if (currentpPoint = null && pointAt = null) return true; else / 用户手指移动到了某个点上if (currentpPoint = null) / 先判断当前的point是不是为null/ 如果

45、为空,那么手指移动到的点复制给currentPointcurrentpPoint = pointAt;/ 吧currentPoint这个点设置选中为truecurrentpPoint.setPointState(Point.POINT_STATE_SELECTED);passWordSb.append(currentpPoint.getNum();if (pointAt = null | currentpPoint.equals(pointAt)| Point.POINT_STATE_SELECTED = pointAt.getPointState() / 点击移动区域不在圆的区域,或者当前点

46、击的点与当前移动到的点的位置相同,或者当前点击的点处于选中状态/ 那么以当前的点中心为起点,以手指移动位置为重点画线canvas.drawLine(currentpPoint.getCenterX(),currentpPoint.getCenterY(), event.getX(), event.getY(),paint);/ 画线 else / 如果当前点击的点与当前移动到的点的位置不同/ 那么以前一个点的中心为起点,以手移动到的点的位置画线canvas.drawLine(currentpPoint.getCenterX(),currentpPoint.getCenterY(), point

47、At.getCenterX(),pointAt.getCenterY(), paint);pointAt.setPointState(Point.POINT_STATE_SELECTED);/ 判断是否中间点需要选中Point betweenPoint = getBetweenCheckPoint(currentpPoint,pointAt);if (betweenPoint != null&& Point.POINT_STATE_SELECTED != betweenPoint.getPointState() / 存在中间点并且没有被选中Pair<Point, Poin

48、t> pair1 = new Pair<Point, Point>(currentpPoint, betweenPoint);lineList.add(pair1);passWordSb.append(betweenPoint.getNum();Pair<Point, Point> pair2 = new Pair<Point, Point>(betweenPoint, pointAt);lineList.add(pair2);passWordSb.append(pointAt.getNum();/ 设置中间点选中betweenPoint.setPoi

49、ntState(Point.POINT_STATE_SELECTED);/ 赋值当前的PointcurrentpPoint = pointAt; else Pair<Point, Point> pair = new Pair<Point, Point>(currentpPoint, pointAt);lineList.add(pair);passWordSb.append(pointAt.getNum();/ 赋值当前的pointcurrentpPoint = pointAt;invalidate();break;case MotionEvent.ACTION_UP:/

50、 手指抬起的时候if (isVerify) / 手势密码校验/ 清掉屏幕上所有的线,只画上集合里面保存的线if (passWord.equals(passWordSb.toString() / 代表用户绘制的密码手势与传入的密码相同callback.checkedSccess(); else / 用户绘制的密码与传入的密码不同callback.checkedFail(); else callback.onGestureCodeInput(passWordSb.toString();break;return true;/* * 校验错误/两次绘制不一致提示 */private void draw

51、ErrorPathTip() canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);paint.setColor(Color.rgb(154, 7, 21);for (Pair<Point, Point> pair : lineList) pair.first.setPointState(Point.POINT_STATE_WRONG);pair.second.setPointState(Point.POINT_STATE_WRONG);canvas.drawLine(pair.first.getCenterX(),

52、pair.first.getCenterY(),pair.second.getCenterX(), pair.second.getCenterY(), paint);invalidate();/* * 清除绘制状态的线程 * * author Administrator * */final class clearStateRunnable implements Runnable Overridepublic void run() / TODO Auto-generated method stub/ 重置passWordSbpassWordSb = new StringBuffer();/ 清空

53、保存点的集合lineList.clear();/ 重新绘制界面clearScreenAndDrawList();for (Point p : list) p.setPointState(Point.POINT_STATE_NORMAL);invalidate();isDrawEnable = true;/* * 通过点的位置去集合中查找这个点包含在哪个Point中 * * param x * param y * return 如果返回null,说明用户当前移动的地方属于点与点之间 */private Point getPointAt(int x, int y) / System.out.pri

54、ntln("list的大小:" + list.size();for (Point point : list) / 先判断xint leftX = point.getLeftX();int rightX = point.getRightX();if (!(x >= leftX && x < rightX) / 如果为假,则调到下一个对比continue;int topY = point.getTopY();int bottomY = point.getBottomY();if (!(y >= topY && y < bo

55、ttomY) / 如果为假,则跳到下一个对比continue;/ 如果执行到这,说明当前点击的点的位置在当前位置/ System.out.println("getPointAt方法返回的点的x = " + point.getCenterX()/ + "y = " + point.getCenterY() + "n" + list.indexOf(point);return point;return null;/* * 清除屏幕上所有的线,然后画出集合里面的线 */private void clearScreenAndDrawList() canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);for (Pair<Point, Point> pair : l

温馨提示

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

最新文档

评论

0/150

提交评论