Èç¹û×öÓÎÏ·»òÕßÊÓÆµÏà¹Ø¿ª·¢µÄʱºò£¬½«»áÓõ½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);
// ½áÊøËø¶¨»Í¼£¬²¢Ìá½»¸Ä±ä¡£
²âÊÔ´úÂëÈçÏ£º