android的图像图像绘图surfaceview_第1页
android的图像图像绘图surfaceview_第2页
android的图像图像绘图surfaceview_第3页
android的图像图像绘图surfaceview_第4页
android的图像图像绘图surfaceview_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

android的图像图像-SurfaceView类2023/6/28View和SurfaceViewView类是android的一个超类,每一个View都有一个用于绘画的画布,这个画布可以进行任意的扩展。有的时候我们需要自定义VIew实现自己想要的视图。view、SurfaceView是游戏开发中经常用到的视图。View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。View的缺陷View缺乏双缓冲机制当程序需要更新View上的图像时,必须重绘View上显示的整张图片。SurfaceView

类SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,GL和视频播放以及Camera摄像头一般均使用SurfaceView.SurfaceView可以控制表面的格式,比如大小、显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的方法有lockCanvas()、lockCanvas(Rectdirty)

、removeCallback(Callbackcallback)、unlockCanvasAndPost(Canvascanvas)控制图形以及绘制。对于Surface,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android后面用到的OpenGL中的GLSurfaceView也是从该类实现。2023/6/28callback接口只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,SurfaceHolder.Callback具有如下的接口:surfaceCreated(SurfaceHolderholder):当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight):当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。注意:一个SurfaceView只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()调用之间是可用的,其他时间是得不到它的Canvas对象的(null)。Android-surfaceView与View的区别SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面可能会引发问题,比如更新画面的时间过长,那么主UI线程会被正在绘制的函数阻塞。那么将无法响应按键、触屏等消息。使用surfaceView,由于是在新的线程中更新画面所以不会阻塞UI主线程。但这也带来了另外一个问题,就是事件同步。比如触屏了一下,需要surfaceView中thread处理,一般就需要有一个eventqueue的设计来保存touchevent,这会稍稍复杂一点,因为涉及到线程同步。所以基于以上,根据游戏特点,一般分成两类: (1)被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于onTouch来更新,可以直接使用invalidate。因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。 (2)主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞主线程。所以显然view不合适,需要surfaceView来控制。使用SurfaceView绘制矩形2023/6/28publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(newMyView(this));}classMyViewextendsSurfaceViewimplementsSurfaceHolder.Callback{SurfaceHolderholder; publicMyView(Contextcontext){ super(context); holder=getHolder(); holder.addCallback(this);}}publicvoidsurfaceCreated(SurfaceHolderholder){ newThread(newMyThread()).start();}使用SurfaceView绘制矩形2023/6/28classMyThreadimplementsRunnable{publicvoidrun(){//锁定画布,通过其返回的画布对象canvas,在其上面画图Canvascanvas=holder.lockCanvas();canvas.drawColor(Color.WHITE);Paintpaint=newPaint();paint.setColor(Color.YELLOW);canvas.drawRect(10,10,220,180,paint);holder.unlockCanvasAndPost(canvas);//结束锁定画图,并提交编辑}}SurfaceView绘图机制重写CallBack对象的surfaceCreate方法,在该方法中为SurfaceView绘制背景,并避免背景图片被下一次lockCanvas遮挡。监听触摸事件,每次触摸屏幕时,程序会锁定触碰周围的区域,那么就只更新该区域的数据,而且本次的lockCanvas会遮挡上一次的lockCanvas后绘制的图形。注:第一次绘制的图形可能会被第二次的lockCanvas遮挡,第三次的lockcanvas又可能遮挡第二次lockCanvas的区域,但不可能遮挡第一次的lockCanvas区域Su色rf咸ac坊eV胖ie悦w绘图借机制20穗23蛮/6环/2读6ho川ld膊er猛.a播dd用Ca菜ll源ba毅ck墨(ne无wCa未ll陵ba舒ck贩()辨{pu副bl拿icvo喝idsu连rf裳ac体eD陵es撒tr炼oy句ed隔(S健ur陡fa和ce告Ho桂ld天er战h螺ol烈de黄r)糠{挽}pu固bl踢icvo能idsu菜rf倒ac量eC海re掏at键ed穿(S恼ur银fa希ce坡Ho牌ld比er特h筑ol稍de佣r)京{Ca绿nv锄as宫ca蒸nv仍as肚=h城ol竖de团r.经lo膛ck袭Ca拢nv如as投()卖;Bi统tm衣ap向b预it仁ma谢p=嫌Bi连tm鬼ap拣Fa提ct岗or拿y.de屋co鸽de快Re馅so责ur肚ce(M肃ai沙nA妹ct削iv只it旷y.th坑is.g惕et格Re雾so铸ur党ce雁s(洒),封R蓝.d午ra丘wa饮bl蔽e.su耐n);ca枯nv宿as今.d筐ra尸wB亡it炒ma令p(厦bi喷tm木ap惠,捆0,愿0掀,nu令ll);ho喜ld基er纸.u眨nl蚁oc棵kC熄an吹va园sA烛nd廊Po盏st仁(c赢an适va旨s)雅;ho喝ld介er哪.l腥oc崇kC蒜an士va傲s(ne撒wRe咬ct捆(0间,0脂,0限,0粪))佳;ho雅ld巷er嫂.u钟nl携oc舰kC罢an虾va隐sA扰nd而Po杯st莲(c思an蔬va班s)室;}pu格bl风icvo都idsu狼rf帅ac暗eC晌ha舟ng破ed扰(S盒ur屈fa厦ce租Ho崇ld向er毕h嘴ol鄙de裤r,in耻tfo鸡rm惯at晓,in北twi聋dt芹h,in暮the量ig骑ht舱)沃{}})左;Su修rf颂ac舒eV惜ie指w绘图各机制20劫23到/6驻/2诉6sf医.s李et伍On堵To肿uc牧hL徐is胸te聚ne穗r(ne米wOn枕To箭uc辫hL纠is言te笑ne百r(赚)棍{pu买bl恢icbo检ol菠ea孟non骂To外uc胡h(呀Vi下ew归v宿,得Mo宏ti屋on膜Ev股en池t匆ev踪蝶en止t)毛{if(e畅ve诞nt亿.g锐et劲Ac桑ti烂on罩()梳==额Mo郊ti乎on蛾Ev焰en葱t.AC美TI鲜ON短_D衫OW瓦N){in逗tcx建=(in瓶t)光ev敞en把t.石ge勾tX伏()誓;in慢tcy高=(in帆t)井ev陈en川t.稻ge豆tY或()骄;Ca册nv贪as桐c帆an翅va发s=档ho递ld突er努.l身oc愿kC概an叮va短s(ne挨wRe场ct测(c浓x-帖50升,c锦y-挨50闭,c桃x+婶50伤,c挨y+列50混))斯;ca恼nv厌as粪.s快av土e(剥);ca梨nv妻as兄.r续ot利at她e(缩慧30领,疯cx雪,未cy妙);pa董in腊t.棉se婆tC逆ol淡or是(C齿ol饱or烤.YE桥LL的OW);ca昆nv若as潮.d滋ra狐wR竭ec别t(峡cx菊-4疲0,爪c钓y-窝40加,雾cx袖,嫩cy使,劣pa嘴in运t)煌;ca始nv遥as柄.r遍es秧to愚re伶()茂;pa假in樱t.秩se周tC删ol贿or押(C克ol谨or减.GR赌EE慨N);ca哄nv孔as缘瑞.d宫ra斗wR拉ec害t(教cx秘,良cy钉,帝cx且+4团0,半c赚y+战40款,钻pa讽in剑t)迁;ho蚕ld恭er押.u重nl绝oc在kC挤an侧va荷sA绞nd嚷Po暴st剩(c宋an迹va剩s)烘;}re撕tu页rnfa浊ls馆e;}})演;Su婚rf杂ac进eV垮ie睬w的双法缓冲方使用20佛23蜜/6逼/2熔6前面企简单吓介绍举了Su伴rf柿ac烈eV育ie祝w的使禾用,钓这次父就介蓄绍Su尿rf图ac庆eV贯ie躁w的双疤缓冲宵使用雾。双权缓冲感是为的了防盈止动巴画闪第烁而革实现烛的一扛种多杯线程额应用蔽,基术于Su弃rf野ac觉eV兽ie鸡w的双岂缓冲管实现必很简题单,逗开一逐条线升程并掠在其往中绘寒图即滴可。衔。程序独运行球截图染如下墨,左义边是艰开单碎个线里程读开取并伙绘图溪,右牧边是章开两烦个线总程,诵一个各专门寸读取绒图片捕,另心一个仰专门匠绘图骑:对比援一下尾,右自边动鼻画的约帧速仪明显卡比左惹边的拐快,牧左右句两者舒都没股使用Th笑re虹ad顿.s到le亿ep腔()。因虚为Su饭rf偶ac域eV碎ie赛w每次讲绘图既都会沉锁定Ca滚nv难as话,也就陵是说柴同一员片区烦域这菜次没勉画完赠下次辉就不狂能画把,因港此要属提高棕双缓双冲的兵效率扇,就拒得开劝一条售线程摄专门哄画图屈,开梦另外侦一条王线程膛做预伙处理涂的工挪作。Su盖rf江ac珠eV瓣ie砍w的垦双缓难冲使稼用Bu吉tt棕on副b起tn术1,径b住tn盯2;Su返rf篮ac起eV交ie吃w钓sf骄v;Su削rf蹄ac涌eH颈ol徐de绘r报sf捧h;Ar有ra街yL胖is喉tim端gl坝is镜t请=刮ne预wAr狱ra状yL捡is页t()破;in挣t朗im汁gw盆id捆th少,已im搏gh飞ei桂gh配t;Bi酸tm秃ap锋b职it就ma病p;pu被bl争ic毙v狱oi吨d赠on凯Cr低ea毛te代(B勾un娱dl蠢e调sa弱ve讨dI棋ns笔ta湾nc凤eS哈ta怨te日)嗓{su笼pe锋r.灾on编Cr岂ea飘te香(s呜av欠ed谷In筋st定an原ce腹St峰at瓦e)名;se宋tC浙on榨te扇nt千Vi刊ew挠(R裂.l理ay咽ou也t.ma粒in);bt椒n1田=议(录Bu悬tt罚on惨)待th诱is邻.f套in妄dV诱ie饥wB晌yI之d(租R.猾id票.bt穗n1);bt慈n2蚀=艳(晃Bu沫tt省on准)诞th烤is直.f钓in省dV疾ie识wB挡yI傍d(合R.直id援.bt炉n2);bt凤n1宾.s叠et昨On建Cl抓ic茧kL冈is柱te宰ne票r(搂ne维w瘦My利Li传st狮en慌er道()夕);bt那n2蜡.s绘et按On准Cl休ic隙kL诵is颜te洒ne桶r(建ne叼w趟My崖Li线st求en依er茅()配);sf哨v塌=缓(S注ur量fa韵ce麻Vi确ew箭)喂th号is奶.f或in殃dV发ie税wB笛yI勺d(夕R.为id催.Su遍rf透ac互eV馋ie随w0岸1);sf湖h解=塌sf从v.籍ge敲tH慈ol敲de困r(幼);sf塘h.信ad失dC堆al败lb首ac蜂k(连ne喝w凉My附Ca茧ll插Ba结ck愁()步);域//自动诉运行su至rf程ac删eC词re执at罚ed}Su奋rf涛ac面eV专ie考w的块双缓赴冲使链用cl戴as绍s膊My嫩Li掌st霜en距er逼i笋mp洋le怪me球nt煎s城Vi崖ew银.O已nC换li沃ck郊Li祥st明en冰er诱{pu贪bl钩ic腾v族oi柄d蹄on肃Cl虫ic泄k(抗Vi它ew附v需)纤{if伤(略v脊==渠b阵tn怕1)叛{ne俯w华re压ad惯Dr垂aw歇Im喷ag昏e(占0,惹0湿).劳st姜ar诞t(按);离//开一家条线延程读育取并馆绘图}el唤se衣i这f狗(v他=单=楚bt逝n2润)历{ne殊w犹re男ad巾Im罚ag壶e(然).很st轮ar蛋t(控);机//开一辫条线谨程读障取ne趟w橡dr扫aw茧Im按ag伪e(圾im巡寿gw催id掀th远+显1义0,脸0岩).浑st讯ar浸t(悔);呼//开一翅条线添程绘盟图}}}Su闷rf佳ac沫eV粱ie读w的字双缓央冲使安用cl求as遇sMy祥Ca秀ll惯Ba琴ckim饲pl骡em卡en却tsSu狗rf剑ac看eH劳ol部de锁r.症Ca投ll薪ba献ck摩{pu谜bl塔icvo记idsu包rf橡ac锅eC弃re霞at睛ed楼(S铺ur广fa尼ce座Ho探ld愉er加h坏ol速de睛r)猛{Lo庄g.i("梳Su警rf才ac拘e:到",钉"责Cr未ea蝴te珠")边;//用反帝射机回制来叫获取若资源拜中的贫图片ID和尺兽寸Fi防el培d[时]雹fi普el尾ds润=R.撇dr辰aw柳ab需le油.cl拉as太s.g扇et屑De恩cl钓ar骆ed阁Fi顾el艰ds缸()解;fo傻r(F惕ie澡ld别f蝇ie屿ld袋:膜f灵ie近ld优s)株{if(!辰"i弟co君n"皱.e核qu晋al赵s(旨fi远el亚d.抱ge件tN盛am右e(耽))寸){斤//除了ic飘on之外单的图伐片in侄tin旅de客x够=郊0;tr在y{in脾de辨x蒜=线fi将el哄d.愤ge笛tI逃nt锄(R腔.d获ra肿wa为bl壤e.cl责as重s);}ca粗tc命h(I移ll米eg捷al前Ar乳gu密me把nt直Ex荣ce古pt案io寄n芦e)体{粱e.和pr迷in结tS班ta宪ck尖Tr凤ac冷e(叫);}ca届tc稻h(I毒ll必eg佩al绳Ac殃ce键ss屠Ex庭ce下pt忆io避n眉e)四{挑e.鬼pr孔in耐tS着ta修ck赠Tr耀ac帮e(准);窃}//保存鲁图片IDim蛾gl安is榨t.著ad攀d(跪in材de塌x);}距}//取得螺图像私大小Bi租tm馒ap宾b筋mI搏mg危=部B俱it丈ma津pF维ac狼to纺ry误.de坚co龟de沉Re好so炒ur断ce(g就et堂Re峰so胜ur鞠ce俩s(究),昌(I阿nt袋eg翼er宣)四im恨gl仿is猾t.党ge右t(亩0)天);im呼gw声id盾th睁=召b同mI滋mg功.g筒et谈Wi刺dt凯h(季);更i乘mg优he悲ig捏ht叠=滚b矩mI科mg石.g傲et俊He五ig制ht腥()秩;}}Su赞rf折ac滚eV斥ie郊w的谎双缓炎冲使婆用//读取京并显喘示图项片的关线程cl哲as鲁sre睡ad角Dr明aw裁Im债ag孔eex芳te纸nd某sTh械re挖ad刘{in英tx,督y盲;in远tim姑gI伐nd焦ex猾=鸽0委;pu峰bl末icre僚ad旬Dr场aw书Im刻ag铜e(in盗tx,in趣ty)樱{th济is.x尤=奏x亏;th花is.y键=毅y母;}pu老bl任icvo烤idru壁n(袄)舰{wh艇il乔e(tr兴ue)染{Ca陈nv点as援c滚=罪s刷fh匙.l煌oc梅kC诉an相va惨s(ne租wRe类ct弟(th缸is.x柱,th哈is.y上,th姥is.x垃+细im佳gw爬id状th茄,th滨is.y摔+闲i肥mg誉he寸ig伸ht渗))宫;Bi梳tm电ap错b浩mI未mg察=趁B左it绒ma耐pF攀ac骡to华ry呼.de珍co忍de齐Re碎so鼠ur址ce(g午et淹Re五so蚊ur律ce摄s(齿),棉(I低nt棚eg半er夜)i附mg岁li丑st削.g维et欲(i火mg滤In睡de蚁x)陡);c.垒dr迅aw嘉Bi昏tm根ap证(b温mI俊mg戏,th顾is.x础,th设is.y融,ne汤wPa旨in怜t(碗))虾;im拒gI孟nd碧ex倍++顷;if(i惨mg锐In煎de卷x愤==穗i放mg章li农st文.s衡iz灶e(价))im恒gI裳nd宰ex祸=莫0晨;sf域h.池un陡lo纹ck鉴Ca驾nv坟as斤An钥dP植os换t(愉c)痛;/沉/更新阅屏幕搬显示盗内容}}};Su蚕rf骗ac靠eV散ie像w的喉双缓雷冲使饺用//脉只负垒责绘昨图的馅线程cl扒as亚sdr住aw抬Im上ag菊eex铃te谅nd舒sTh矮re广ad甜{in损tx,古y迹;pu贵bl译

温馨提示

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

评论

0/150

提交评论