ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Android¿ª·¢Ö®SurfaceView
2014-11-24 12:07:24 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:0´Î
Tags£ºAndroid ¿ª·¢ SurfaceView

Èç¹û×öÓÎÏ·»òÕßÊÓÆµÏà¹Ø¿ª·¢µÄʱºò£¬½«»áÓõ½SurfaceView¡£¶ÔÓÚSurfaceView£¬Ê×ÏÈÐèÒªÁ˽âÒ»ÏÂËü×Ô¼ºµÄλÖãº


extends View


ÓÉÊÖ²á¿ÉÖª£º


SurfaceViewÊÇViewÀàµÄ¼Ì³ÐÀ࣬Õâ¸öViewÀïÄÚǶÁËÒ»¸öרÃÅÓÃÓÚ»æÖƵÄSurface£¬Õâ¸ö¿ÉÒÔÀàËÆµÄÀí½â³ÉΪһ¸öÔÚViewÀïµÄCanvas¡£Äã¿ÉÒÔ¿ØÖÆÕâ¸öSurfaceµÄ¸ñʽºÍ³ß´ç¡£SurfaceviewÀàÔò¿ØÖÆÕâ¸öSurfaceÔÚÆÁÄ»ÉϵÄÕýȷλÖá£


¡¶Android¸ß¼¶±à³Ì¡·ÀïÕâÑù˵£º


ÔÚÒ»°ãÇé¿öÏ£¬Ó¦ÓóÌÐòµÄView¶¼ÊÇÔÚÏàͬµÄGUIÏß³ÌÖлæÖƵġ£Õâ¸öÖ÷Ó¦ÓóÌÐòÏß³ÌͬʱҲÓÃÀ´´¦ÀíËùÓеÄÓû§½»»¥£¨ÀýÈç°´Å¥µ¥»÷»òÕßÎı¾ÊäÈ룩¡£


¶ÔÓÚÒ»¸öViewµÄonDraw()·½·¨£¬²»Äܹ»Âú×㽫ÆäÒÆ¶¯µ½ºǫ́Ïß³ÌÖÐÈ¥¡£ÒòΪ´Óºǫ́Ïß³ÌÐÞ¸ÄÒ»¸öGUIÔªËØ»á±»ÏÔʽµØ½ûÖ¹µÄ¡£


µ±ÐèÒª¿ìËٵظüÐÂViewµÄUI£¬»òÕßµ±Ç°äÖȾ´úÂë×èÈûGUIÏ̵߳Äʱ¼ä¹ý³¤µÄʱºò£¬SurfaceView¾ÍÊǽâ¾öÉÏÊöÎÊÌâµÄ×î¼ÑÑ¡Ôñ¡£SurfaceView·â×°ÁËÒ»¸öSurface¶ÔÏ󣬶ø²»ÊÇCanvas¡£ÕâÒ»µãºÜÖØÒª£¬ÒòΪSurface¿ÉÒÔʹÓúǫ́Ï̻߳æÖÆ¡£¶ÔÓÚÄÇЩ×ÊÔ´Ãô¸ÐµÄ²Ù×÷£¬»òÕßÄÇЩҪÇó¿ìËÙ¸üлòÕ߸ßËÙÖ¡Âʵĵط½£¬ÀýÈçʹÓÃ3DͼÐΣ¬´´½¨ÓÎÏ·£¬»òÕßʵʱԤÀÀÉãÏñÍ·£¬ÕâÒ»µãÌØ±ðÓÐÓá£


1. ºÎʱӦ¸ÃʹÓÃSurfaceView


SurfaceViewʹÓõķ½Ê½ÓëÈκÎViewËùÅÉÉúµÄÀà¶¼ÊÇÍêÈ«ÏàͬµÄ¡£¿ÉÒÔÏñÆäËûViewÄÇÑùÓ¦Óö¯»­£¬²¢°ÑËüÃǷŵ½²¼¾ÖÖС£


SurfaceView·â×°µÄSurfaceÖ§³ÖËùÓбê×¼µÄCanvas·½·¨½øÐлæÍ¼£¬Í¬Ê±Ò²Ö§³ÖÍêÈ«µÄOpenGL ES ¿â¡£


ʹÓÃOpenGL£¬Äã¿ÉÒÔÔÚSurfaceÉÏ»æÖÆÈκÎÖ§³Ö2D»òÕß3D¶ÔÏó£¬ÓëÔÚ2D»­²¼ÉÏÄ£ÄâÏàͬµÄЧ¹ûÏà±È£¬ÕâÖÖ·½·¨¿ÉÒÔÒÀ¿¿Ó²¼þ¼ÓËÙ£¨¿ÉÓõÄʱºò£©À´¼«´óµØÌá¸ßÐÔÄÜ¡£


¶ÔÓÚÏÔʾ¶¯Ì¬µÄ3DͼÏñÀ´Ëµ£¬ÀýÈ磬ÄÇЩʹÓÃGoogle Earth ¹¦ÄܵÄÓ¦ÓóÌÐò£¬»òÕßÄÇЩÌṩ³Á½þÌåÑéµÄ½»»¥Ê½ÓÎÏ·£¬SurfaceÌØ±ðÓÐÓá£Ëü»¹ÊÇʵʱÏÔʾÉãÏñÍ·Ô¤ÀÀµÄ×î¼ÑÑ¡Ôñ¡£


2. ´´½¨Ò»¸öеÄSurfaceView¿Ø¼þ


´´½¨Ò»¸öеÄSurfaceView¿Ø¼þÐèÒª´´½¨Ò»¸öеÄÀ©Õ¹ÁËSurfaceViewµÄÀ࣬²¢ÊµÏÖSurfaceHolder.Callback¡£


SurfaceHolder»Øµ÷¿ÉÒÔÔڵײãµÄSurface±»´´½¨ºÍÏú»ÙµÄʱºò֪ͨView£¬²¢´«µÝ¸øËüSurfaceHolder¶ÔÏóµÄÒýÓã¬ÆäÖаüº¬Á˵±Ç°ÓÐЧµÄSurface¡£


Ò»¸öµäÐ͵ÄSurfaceView Éè¼ÆÄ£ÐͰüÀ¨Ò»¸öÓÉThreadËùÅÉÉúµÄÀ࣬Ëü¿ÉÒÔ½ÓÊÕ¶Ôµ±Ç°µÄSurfaceHolderµÄÒýÓ㬲¢¶ÀÁ¢µØ¸üÐÂËü¡£


3. ʹÓÃSurfaceView´´½¨3D¿Ø¼þ


AndroidÍêȫ֧³ÖOpenGL ES 3D äÖȾ¿ò¼Ü£¬ÆäÖаüº¬Á˶ÔÉ豸µÄÓ²¼þ¼ÓËÙµÄÖ§³Ö¡£SurfaceView¿Ø¼þÌṩÁËÒ»¸ö±íÃæ£¬¿ÉÒÔÔÚËüÉÏÃæäÖȾÄãµÄOpenGL³¡¾°¡£


ÄÇôÎÒÃÇÔÚʹÓõÄʱºò¿ÉÒÔÕâÑùʹÓãº


±»¶¯¸üл­ÃæµÄ¡£±ÈÈçÆåÀ࣬ÕâÖÖÓÃview¾ÍºÃÁË¡£ÒòΪ»­ÃæµÄ¸üÐÂÊÇÒÀÀµÓÚ onTouch À´¸üУ¬¿ÉÒÔÖ±½ÓʹÓà invalidate¡£ ÒòΪÕâÖÖÇé¿öÏ£¬ÕâÒ»´ÎTouchºÍÏÂÒ»´ÎµÄTouchÐèÒªµÄʱ¼ä±È½Ï³¤Ð©£¬²»»á²úÉúÓ°Ïì¡£


Ö÷¶¯¸üС£±ÈÈçÒ»¸öÈËÔÚÒ»Ö±Åܶ¯¡£Õâ¾ÍÐèÒªÒ»¸öµ¥¶ÀµÄthread²»Í£µÄÖØ»æÈ˵Ä״̬£¬±ÜÃâ×èÈûmain UI thread¡£ËùÒÔÏÔÈ»view²»ºÏÊÊ£¬ÐèÒªsurfaceViewÀ´¿ØÖÆ¡£



¿ÉÒÔÖ±½Ó´ÓÄÚ´æ»òÓ²¼þÉ豸±ÈÈçÏà»úµÈÈ¡µÃͼÏñÊý¾Ý,ÊǸö·Ç³£ÖØÒªµÄ»æÍ¼ÈÝÆ÷¡£


ËüµÄÌØÐÔÊÇ£º¿ÉÒÔÔÚÖ÷Ïß³ÌÖ®ÍâµÄÏß³ÌÖÐÏòÆÁÄ»»æÍ¼¡£ÕâÑù¿ÉÒÔ±ÜÃ⻭ͼÈÎÎñ·±ÖصÄʱºòÔì³ÉÖ÷Ïß³Ì×èÈû£¬´Ó¶øÌá¸ßÁ˳ÌÐòµÄ·´Ó¦ËÙ¶È¡£


ÈçºÎȥʹÓÃÒ»¸öSurfaceView£º


Ê×Ïȼ̳ÐSurfaceView²¢ÊµÏÖSurfaceHolder.Callback½Ó¿Ú¡£ÒòΪʹÓÃSurfaceView ÓÐÒ»¸öÔ­Ôò£¬ËùÓеĻæÍ¼¹¤×÷±ØÐëµÃÔÚSurface ±»´´½¨Ö®ºó²ÅÄÜ¿ªÊ¼¡£¿ÉÒÔ±»Ö±½Ó¸´ÖƵ½ÏÔ´æ´Ó¶øÏÔʾ³öÀ´£¬ÕâʹµÃÏÔʾËÙ¶È»á·Ç³£¿ì£¬¶øÔÚSurface ±»Ïú»Ù֮ǰ±ØÐë½áÊø¡£ËùÒÔCallback ÖеÄsurfaceCreated ºÍsurfaceDestroyed ¾Í³ÉÁË»æÍ¼´¦Àí´úÂëµÄ±ß½ç¡£


ÐèÒªÖØÐ´µÄ·½·¨


£¨1£©public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}


//ÔÚsurfaceµÄ´óС·¢Éú¸Ä±äʱ¼¤·¢


£¨2£©public void surfaceCreated(SurfaceHolder holder){}


//ÔÚ´´½¨Ê±¼¤·¢£¬Ò»°ãÔÚÕâÀïµ÷Óû­Í¼µÄÏ̡߳£


£¨3£©public void surfaceDestroyed(SurfaceHolder holder) {}


//Ïú»Ùʱ¼¤·¢£¬Ò»°ãÔÚÕâÀォ»­Í¼µÄÏß³ÌÍ£Ö¹¡¢ÊÍ·Å¡£


Õû¸ö¹ý³Ì£º¼Ì³ÐSurfaceView²¢ÊµÏÖSurfaceHolder.Callback½Ó¿Ú ----> SurfaceView.getHolder()»ñµÃSurfaceHolder¶ÔÏó ---->SurfaceHolder.addCallback(callback)Ìí¼Ó»Øµ÷º¯Êý---->SurfaceHolder.lockCanvas()»ñµÃCanvas¶ÔÏó²¢Ëø¶¨»­²¼----> Canvas»æ»­ ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)½áÊøËø¶¨»­Í¼£¬²¢Ìá½»¸Ä±ä£¬½«Í¼ÐÎÏÔʾ¡£


¹ØÓÚSurfaceHolder£º


ÕâÀïÓõ½ÁËÒ»¸öÀàSurfaceHolder,¿ÉÒÔ°ÑËüµ±³ÉsurfaceµÄ¿ØÖÆÆ÷£¬ÓÃÀ´²Ù×Ýsurface¡£´¦ÀíËüµÄCanvasÉÏ»­µÄЧ¹ûºÍ¶¯»­£¬¿ØÖƱíÃæ£¬´óС£¬ÏñËØµÈ¡£
¼¸¸öÐèҪעÒâµÄ·½·¨£º
(1)¡¢abstract void addCallback(SurfaceHolder.Callback callback);
// ¸øSurfaceViewµ±Ç°µÄ³ÖÓÐÕßÒ»¸ö»Øµ÷¶ÔÏó¡£
(2)¡¢abstract Canvas lockCanvas();
// Ëø¶¨»­²¼£¬Ò»°ãÔÚËø¶¨ºó¾Í¿ÉÒÔͨ¹ýÆä·µ»ØµÄ»­²¼¶ÔÏóCanvas£¬ÔÚÆäÉÏÃæ»­Í¼µÈ²Ù×÷ÁË¡£
(3)¡¢abstract Canvas lockCanvas(Rect dirty);
// Ëø¶¨»­²¼µÄij¸öÇøÓò½øÐл­Í¼µÈ..ÒòΪ»­Íêͼºó£¬»áµ÷ÓÃÏÂÃæµÄunlockCanvasAndPostÀ´¸Ä±äÏÔʾÄÚÈÝ¡£
// Ïà¶Ô²¿·ÖÄÚ´æÒªÇó±È½Ï¸ßµÄÓÎÏ·À´Ëµ£¬¿ÉÒÔ²»ÓÃÖØ»­dirtyÍâµÄÆäËüÇøÓòµÄÏñËØ£¬¿ÉÒÔÌá¸ßËÙ¶È¡£
(4)¡¢abstract void unlockCanvasAndPost(Canvas canvas);
// ½áÊøËø¶¨»­Í¼£¬²¢Ìá½»¸Ä±ä¡£


²âÊÔ´úÂëÈçÏ£º


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºAndroid¿ª·¢½Ì³Ì£ºÎÄ×Ö·­×ª¶¯»­µÄ.. ÏÂһƪ£ºAndroid ÈçºÎ·ÀÖ¹´úÂë±»·´±àÒë

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Linuxϵͳ¼ò½é (2025-12-25 21:55:25)
¡¤Linux°²×°MySQL¹ý³Ì (2025-12-25 21:55:22)
¡¤Linuxϵͳ°²×°½Ì³Ì£¨ (2025-12-25 21:55:20)
¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)