ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:66.30KB ,
资源ID:9525214      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9525214.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(android上使用贝塞尔曲线.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

android上使用贝塞尔曲线.docx

1、android上使用贝塞尔曲线李华明Himi原创,转载务必在明显处注明:转载自【黑米GameDev街区】原文链接:很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块;请点击下面联系进入阅读:【Android游戏开发十九】(必看篇)SurfaceView运行机制详解剖析Back与Home按键及切入后台等异常处理! 首先对于赛贝尔曲线不是很了解的童鞋,请自觉白度百科、google等等. 为了方便偷懒的童鞋,这里给个贝赛尔曲线百

2、科地址,以及一段话简述贝赛尔曲线: 贝赛尔曲线白度百科快速地址: 贝塞尔曲线又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋; 上面这一段话其实就“线段像可伸缩的皮筋”这一句比较重要,也很容易理解; 至于贝赛尔曲线的实现,在Android中极其的简单,因为它是Android封装的一个方法,这个能不简单么。只不过它隐藏的比较深,它隐藏于Path类中,方法如下: android.graphics.Path.quadTo(float x1, float y1, float x2, float y2) Since:API

3、 Level 1 此方参数解释: 第一个参数:操作点的x坐标 第二个参数:操作点的y坐标 第三个参数:结束点的x坐标 第四个参数:结束点的y坐标 从API中看出,赛贝尔曲线从API1就开始支持了; 熟悉方法后,下面就来实现: SurfaceView框架不多讲,看过我博客的都应该知道的;直接看MySurfaceView类,此类继承SurfaceView ,是游戏的主视图这里为了更清晰的讲解:这里部分代码先不贴出来了,最后会整体贴出,当然源码也是免费在最后提供 首先是定义相关的成员变量: java:showcolumnsview plaincopy1020304050607080901001101

4、201301401501. /贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标)2. privateintstartX,startY,controlX,controlY,endX,endY;3. /Path4. privatePathpath;5. /为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔6. privatePaintpaintQ;7. /随机库(让贝赛尔曲线更明显)8. privateRandomrandom; 本类构造函数: java:showcolumnsview plaincopy1020304050607080901001101201301401501. /

5、*2. *SurfaceView初始化函数3. */4. publicMySurfaceView(Contextcontext)5. super(context);6. .7. /贝赛尔曲线相关初始化8. path=newPath();9. paintQ=newPaint();10. paintQ.setAntiAlias(true);11. paintQ.setStyle(Style.STROKE);12. paintQ.setStrokeWidth(5);13. paintQ.setColor(Color.WHITE);14. random=newRandom();15. .16. 接着我

6、把绘制贝赛尔曲线封装一个方法了,函数如下: java:showcolumnsview plaincopy1020304050607080901001101201301401501. /*2. *绘制贝赛尔曲线3. *4. *paramcanvas主画布5. */6. publicvoiddrawQpath(Canvascanvas)7. path.reset();/重置path8. /贝赛尔曲线的起始点9. path.moveTo(startX,startY);10. /设置贝赛尔曲线的操作点以及终止点11. path.quadTo(controlX,controlY,endX,endY);1

7、2. /绘制贝赛尔曲线(Path)13. canvas.drawPath(path,paintQ);14. 最后是用户触屏监听函数以及逻辑函数: c-sharp:showcolumnsview plaincopy1020304050607080901001101201301401501. /*2. *触屏事件监听3. */4. Override5. publicbooleanonTouchEvent(MotionEventevent)6. endX=(int)event.getX();7. endY=(int)event.getY();8. returntrue;9. 10. /*11. *游

8、戏逻辑12. */13. privatevoidlogic()14. if(endX!=0&endY!=0)15. /设置操作点为线段x/y的一半16. controlX=random.nextInt(endX-startX)/2);17. controlY=random.nextInt(endY-startY)/2);18. 19. 整个代码很easy主要是贝赛尔函数的参数,尤其是操作点,操作点的各种不同可以实现不同的效果,这里我简单的统一的讲操作点设置成用户触屏点的x,y的一半,呵呵偷懒了嘻嘻 我把贝赛尔的操作点写在了逻辑logic()函数中,不断的执行,并且每次利用nextInt函数得到

9、随机的操作点,主要为了让其曲线不断的变化从而形成一个震动的曲线运动轨迹; ok,效果接图如下: 这里可能由于图片是静止的效果看起来不是很明显,大家可以运行源码来观察 ,好了本节就这样吧;下面贴出整个MySurfaceView的源码:(最后有本项目的源码下载地址) java:showcolumnsview plaincopy1020304050607080901001101201301401501. packagecom.qpath;2. importjava.util.Random;3. importandroid.content.Context;4. importandroid.graphi

10、cs.Canvas;5. importandroid.graphics.Color;6. importandroid.graphics.Paint;7. importandroid.graphics.Paint.Style;8. importandroid.graphics.Path;9. importandroid.view.KeyEvent;10. importandroid.view.MotionEvent;11. importandroid.view.SurfaceHolder;12. importandroid.view.SurfaceHolder.Callback;13. impo

11、rtandroid.view.SurfaceView;14. /*15. *赛贝尔曲线16. *authorHimi17. *18. */19. publicclassMySurfaceViewextendsSurfaceViewimplementsCallback,Runnable20. privateSurfaceHoldersfh;21. privatePaintpaint;22. privateThreadth;23. privatebooleanflag;24. privateCanvascanvas;25. publicstaticintscreenW,screenH;26. /-

12、以上是SurfaceView游戏框架27. /贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标)28. privateintstartX,startY,controlX,controlY,endX,endY;29. /Path30. privatePathpath;31. /为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔32. privatePaintpaintQ;33. /随机库(让贝赛尔曲线更明显)34. privateRandomrandom;35. /*36. *SurfaceView初始化函数37. */38. publicMySurfaceView(Context

13、context)39. super(context);40. sfh=this.getHolder();41. sfh.addCallback(this);42. paint=newPaint();43. paint.setColor(Color.WHITE);44. paint.setAntiAlias(true);45. setFocusable(true);46. /-以上是SurfaceView游戏框架47. /贝赛尔曲线相关初始化48. path=newPath();49. paintQ=newPaint();50. paintQ.setAntiAlias(true);51. pai

14、ntQ.setStyle(Style.STROKE);52. paintQ.setStrokeWidth(5);53. paintQ.setColor(Color.WHITE);54. random=newRandom();55. 56. /*57. *SurfaceView视图创建,响应此函数58. */59. publicvoidsurfaceCreated(SurfaceHolderholder)60. screenW=this.getWidth();61. screenH=this.getHeight();62. flag=true;63. /实例线程64. th=newThread(

15、this);65. /启动线程66. th.start();67. /-以上是SurfaceView游戏框架68. 69. /*70. *游戏绘图71. */72. publicvoidmyDraw()73. try74. canvas=sfh.lockCanvas();75. if(canvas!=null)76. canvas.drawColor(Color.BLACK);77. /-以上是SurfaceView游戏框架78. drawQpath(canvas);79. 80. catch(Exceptione)81. /TODO:handleexception82. finally83.

16、 if(canvas!=null)84. sfh.unlockCanvasAndPost(canvas);85. 86. 87. /*88. *绘制贝赛尔曲线89. *90. *paramcanvas主画布91. */92. publicvoiddrawQpath(Canvascanvas)93. path.reset();/重置path94. /贝赛尔曲线的起始点95. path.moveTo(startX,startY);96. /设置贝赛尔曲线的操作点以及终止点97. path.quadTo(controlX,controlY,endX,endY);98. /绘制贝赛尔曲线(Path)9

17、9. canvas.drawPath(path,paintQ);100. 101. /*102. *触屏事件监听103. */104. Override105. publicbooleanonTouchEvent(MotionEventevent)106. endX=(int)event.getX();107. endY=(int)event.getY();108. returntrue;109. 110. /*111. *游戏逻辑112. */113. privatevoidlogic()114. if(endX!=0&endY!=0)115. /设置操作点为线段x/y的一半116. con

18、trolX=random.nextInt(endX-startX)/2);117. controlY=random.nextInt(endY-startY)/2);118. 119. 120. /*121. *按键事件监听122. */123. Override124. publicbooleanonKeyDown(intkeyCode,KeyEventevent)125. returnsuper.onKeyDown(keyCode,event);126. 127. publicvoidrun()128. while(flag)129. longstart=System.currentTime

19、Millis();130. myDraw();131. logic();132. longend=System.currentTimeMillis();133. try134. if(end-start50)135. Thread.sleep(50-(end-start);136. 137. catch(InterruptedExceptione)138. e.printStackTrace();139. 140. 141. 142. /*143. *SurfaceView视图状态发生改变,响应此函数144. */145. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,146. intheight)147. 148. /*149. *SurfaceView视图消亡时,响应此函数150. */151. publicvoidsurfaceDestroyed(SurfaceHolderholder)152. flag=false;153. 154.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1