Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Androidµã¾Åͼ×ܽáÒÔ¼°ÔÚÁÄÌìÆøÅÝÖеÄʹÓÃ
 
  3035  次浏览      27
 2018-8-9
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÌÚÑ¶ÔÆ£¬½éÉÜÁ˵ã¾ÅͼµÄ±¾ÖÊ£¬ÁÄÌìÆøÅÝÖÐʹÓõã¾Åͼ£¬ÆäËüÎÊÌâµÈ¡£

1. µã¾Åͼ½éÉÜ

ÕâÒ»¿éÊǶԵã¾ÅͼµÄ¼òµ¥½éÉÜ£¬Èç¹û¶ÔÕâ¿éÒѾ­ÓÐÁ˽âµÄ»°£¬¿ÉÒÔÖ±½ÓÌøµ½2£¬¿´¿´ÁÄÌìÆøÅÝÖÐÈçºÎʹÓõã¾Åͼ¡£

1.1 µã¾Åͼ³öÏÖµÄÔ­Òò

Ê×Ïȼòµ¥½éÉÜϵã¾Åͼ³öÏÖµÄÔ­Òò°É£¬AndroidΪÁËʹÓÃͬһÕÅͼ×÷Ϊ²»Í¬ÊýÁ¿ÎÄ×ֵı³¾°£¬Éè¼ÆÁËÒ»ÖÖ¿ÉÒÔÖ¸¶¨ÇøÓòÀ­ÉìµÄͼƬ¸ñʽ¡°.9.png¡±£¬ÕâÖÖͼƬ¸ñʽ¾ÍÊǵã¾Åͼ¡£

×¢Ò⣺ÕâÖÖͼƬ¸ñʽֻÄܱ»Ê¹ÓÃÓÚAndroid¿ª·¢¡£ÔÚios¿ª·¢ÖУ¬¿ÉÒÔÔÚ´úÂëÖÐÖ¸¶¨Ä³¸öµã½øÐÐÀ­É죬¶øÔÚAndroidÖв»ÐУ¬ËùÒÔÔÚAndroidÖÐÏëÒª´ïµ½Õâ¸öЧ¹û£¬Ö»ÄÜʹÓõã¾Åͼ¡£(¶Ô´ó¶àÊýʱºòÀ´ËµÊÇÕâÑù£¬Êµ¼ÊÉÏ¿ÉÒÔ×Ô¼º¹¹Ô죬ºóÃæ»áÉÔ΢Ìáһϣ¬¼û3.2£©

1.2 µã¾ÅͼµÄ±¾ÖÊ

µã¾ÅͼµÄ±¾ÖÊʵ¼ÊÉÏÊÇÔÚͼƬµÄËÄÖܸ÷Ôö¼ÓÁË1pxµÄÏñËØ£¬²¢Ê¹Óô¿ºÚ(#FF000000)µÄÏß½øÐбê¼Ç£¬ÆäËüµÄÓëԭͼûÓÐÈκÎÇø±ð¡£¿ÉÒԲο¼ÒÔÏÂͼƬ£º

¿ÉÒÔ¿´µ½ÔÚ¸ÃͼµÄËÄÖÜ£¬¾ùÓкÚÉ«ÏñËØ±ê¼Ç£¬ÕâЩ±ê¼ÇµÄ×÷Ó÷ֱðÊÇ£º

1.3 ´´½¨µã¾ÅͼµÄ¼¸¸ö·½·¨

ÓÉÓÚµã¾ÅͼµÄ±¾ÖÊÒ²ÊǸöͼƬ£¬Ö»ÊÇÔÚÖÜΧ¼ÓÁË1pxµÄÏñËØ£¬ËùÒÔÄã¿ÉÒÔʹÓÃps»òÆäËüÈÎÒâÖ§³ÖÏñËØ²Ù×÷µÄpͼ¹¤¾ßÀ´½«Ò»¸öÆÕͨͼƬת»»Îªµã¾Åͼ£¬µ«ÊǾÍÒ×ÓÃÐԺͿÉÊÓÐÔÀ´¿´£¬ÍƼöʹÓÃDraw9patch¹¤¾ß£¬¸Ã¹¤¾ß´æÔÚÓÚÔçÆÚµÄAndroid SDKÖУ¬Èç½ñ±»¼¯³Éµ½ÁËAndroid studioÖУ¬Ëüʵ¼ÊÉÏÒ²ÊÇÔÚͼƬ±ßÔµ»­Ïߣ¬µ«ÊÇÔÚ¹¤¾ßÖÐÖ»ÄÜÔÚ±ßÔµ»­£¬ÇÒÖ»ÄÜ»­ºÚÏߣ¬ÕâÑù±ã¼õÉÙÁËÎó²Ù×÷µÄ¿ÉÄÜÐÔ¡£²¢ÇÒÔÚDraw9patchÖпÉÒÔÔ¤ÀÀ½á¹û¡£

×¢Ò⣺ͼƬËĸö½ÇµÄÏñËØµã²»Òª»­ÉϺÚÏߣ¬·ñÔòAndroidÎÞ·¨Ê¶±ð¡£

¾ßÌåÈçºÎ²Ù×÷£¬ÕâÀï¾Í²»¶à׸ÊöÁË¡£

1.4 Android µã¾ÅͼµÄ»ù±¾Ê¹ÓÃ

AndroidÖÐʹÓõã¾Åͼ£¬Ö÷ÒªÓÐÈýÖÖÐÎʽ£¬Ê¹ÓÃresÎļþ¼ÐÖеĵã¾Åͼ£¬Ê¹ÓÃassetsÎļþ¼ÐÖеĵã¾ÅͼÒÔ¼°Ê¹ÓÃÍøÉÏÀ­È¡µÄµã¾Åͼ£¬ÏÂÃæ·Ö±ð¿´¿´ËüÃÇÈçºÎʹÓá£

1.ʹÓÃresÎļþ¼ÐÖеĵã¾Åͼ±È½Ï¼òµ¥£¬Ö±½Ó½«´øºÚÏߵĵã¾Åͼ·Åµ½resÎļþ¼ÐÖУ¬¾Í¿ÉÒÔ°´ÕÕÕý³£Ê¹ÓÃresµÄ·½·¨Ê¹ÓÃÁË¡£Ò»°ãΪÉèÖÃΪTextViewµÄ±³¾°£¬±ã¿ÉÒÔ¸ù¾ÝTextViewµÄÄÚÈÝ´óС½øÐÐÀ­ÉìÁË¡£

2.ʹÓÃassetsÎļþ¼ÐÖеĵã¾ÅͼÉÔ΢¸´ÔÓһЩ£¬ÕâÀï²»ÄÜÖ±½Ó·ÅÈë´øºÚÏߵĵã¾Åͼ£¬¶øÊÇ·ÅÈëÒ»ÖÖת»»ºóµÄµã¾Åͼ£¬È»ºóÔÚʹÓÃʱ£¬ÔÙÓÉ¿ª·¢Ö÷¶¯¹¹Ôì³ÉNinePatchDrawableÈ»ºóʹÓᣣ¨ÊDz»ÊÇ¿´²»¶®£¬Íùºó¿´¾Í¶ÔÁË¡££©

3.ʹÓÃÍøÉÏÀ­È¡µÄµã¾Åͼ¾Í¸ü¸´ÔÓÁË£¬±¾ÆªÎÄÕ´󲿷ֶ¼ÔÚ½²ÕâÒ»¿é£¬ÓÐÐËȤµÄ¾ÍÇëÍùÏ¿´~¡£

1.5 Androidµã¾ÅͼµÄ½âÎöÔ­Àí

Android²¢²»ÊÇÖ±½ÓʹÓõã¾Åͼ£¬¶øÊÇÔÚ±àÒëʱ½«Æäת»»ÎªÁíÍâÒ»ÖÖ¸ñʽ£¨¼û3.1£©£¬ÕâÖÖ¸ñʽÊǽ«ÆäËÄÖܵĺÚÉ«ÏñËØ±£´æÖÁBitmapÀàÖеÄÒ»¸öÃûΪmNinePatchChunkµÄbyte[]ÖУ¬²¢Ä¨³ýµôËÄÖܵÄÕâÒ»¸öÏñËØµÄ¿í¶È£»½Ó×ÅÔÚʹÓÃʱ£¬Èç¹ûBitmapµÄÕâ¸ömNinePatchChunk²»Îª¿Õ£¬ÇÒΪ9patch chunk£¨¼û3.3£©£¬Ôò½«Æä¹¹ÔìΪNinePatchDrawable£¬·ñÔò½«»á±»¹¹ÔìΪBitmapDrawable£¬×îÖÕÉèÖøøview£¬NinePatchDrawableµÄÀ­ÉìÖ÷ÒªÊÇͨ¹ýÆädraw·½·¨ÊµÏֵġ£×ܶøÑÔÖ®£¬×îºó´ò³öµÄ°üÖеĵã¾Åͼ£¬ÒѾ­²»ÊÇÔ­À´µÄ´øºÚÏߵĵã¾ÅͼÁË¡£

2. ÁÄÌìÆøÅÝÖÐʹÓõã¾Åͼ

2.1 Óöµ½µÄÎÊÌâºÍ½â¾ö·½°¸

Ïȼòµ¥ËµÏ´ÓÍøÉÏÀ­È¡µã¾ÅͼµÄ¹ý³Ì£¬Ê×ÏÈʹÓÃurlÇëÇóÍøÂçÊý¾Ý£¬²¢½«½á¹û»º´æÎª±¾µØÎļþ£¬ÔÙʹÓÃÎļþÁ÷´´½¨Bitmap£¬½Ó×ÅʹÓÃBitmap´´½¨drawableÔÙ½»¸øviewʹÓã¬×îºóÓÉviewµÄdraw·½·¨µ÷ÓÃdrawableµÄdraw·½·¨½«Í¼Æ¬»æÖƳöÀ´¡£

ÔÙ¿´¿´ÉÏÃæ1.5µÄ½âÎöÔ­Àí£¬Ëü»á´øÀ´Ò»¸ö¿Ó£¬ÓÉÓÚÁÄÌìÆøÅÝÐèÇóÐèҪʹÓÃurl´ÓÍøÂçÉÏÀ­È¡µã¾Åͼ£¬Èç¹ûÕâ¸öµã¾ÅͼûÓо­¹ý±àÒëµÄ¹ý³Ì£¬½«ÆäÖÜΧµÄºÚÏß±ê¼Ç·ÅÈëµ½pngÖеÄÒ»¸ö¸¨ÖúchunkÖУ¬ÄÇôÔÚʹÓÃÕâ¸öͼ×÷Ϊ±³¾°Ê±£¬»áÏÔʾ³öºÚÏߣ¬ÇÒ²»»áÀ­Éì¡£¶ø¸ù¾ÝÒÔÍùµÄ¾­Ñ飬AndroidÊÇ¿ÉÒÔÖ±½ÓʹÓõã¾ÅͼµÄ£¬ÒòΪ·Åµ½resÎļþ¼ÐÖоͿÉÒÔÖ±½ÓʹÓã¬ËùÒԾͽ«µã¾Åͼֱ½ÓÉÏ´«µ½·þÎñÆ÷ÉÏ£¬Õâʱ´ÓÍøÉÏÀ­È¡µÄͼƬÊý¾ÝÊÇ´øºÚÏßµÄͼ£¬ÄÇô¾Í»á³ö´íÁË¡£

ÕâʱºòЧ¹ûÊÇÕâÑùµÄ£º

emmmmm£¬ºÜ³ó¡£

µ±³õ·¢ÏÖÕâ¸öÎÊÌâʱ£¬¿¼ÂÇÁËÈý¸ö·½°¸À´´¦Àí

1.¿ª·¢Ìṩ¹¤¾ß£¬²úÆ·»òÉè¼Æ½øÐÐת»»ºóÔÙÔÚÅäÖÃÆ½Ì¨ÉÏÉÏ´«£¬ÎÊÌâÊÇÕâ¸ö¹ý³ÌÈ«ÊÇÍâ°ü½øÐд¦ÀíµÄ£¬ÎÞ·¨±£Ö¤×ª»»µÄÖÊÁ¿ºÍ׼ȷÐÔ£¬ÒòΪת»»ºóµÄͼºÍԭͼ³¤Ò»Ñù¡£

2.½«´øºÚÏߵĵã¾ÅͼÉÏ´«µ½ÅäÖÃÆ½Ì¨£¬Æ½Ì¨½øÐÐת»»ºóÔÙÉÏ´«µ½·þÎñÆ÷¡£Õâ¸öÔÝʱûÓÐÏëµ½ÓÐʲô´óµÄÎÊÌâ¡£

3.¿Í»§¶ËÊÕµ½´øºÚÏߵĵã¾Åͼºó£¬½øÐд¦Àí£¬ÎÊÌâÊÇûÓÐÖ±½ÓµÄ·½·¨½øÐÐת»»£¬ÐèÒª¿Í»§¶Ëͨ¹ýÏñËØ¼¶ + byte¼¶µÄ²Ù×÷£¬À´¹¹Ôì³öNinePatchDrawable£¬¹ý³Ì±È½ÏºÄʱ£¬Ó°ÏìÐÔÄܺÍÁ÷³©¶È£¬²¢ÇÒÉæ¼°µ½µÄÄÚÈÝ̫ϸ£¬ºóÐøÎ¬»¤À§ÄÑ¡£

pass: Æäʵ¿Í»§¶Ë»¹ÓÐÒ»¸ö½â¾ö·½·¨£¬¾ÍÊÇ×Ô¼º¸ù¾ÝÀ­ÉìÇøÓò¹¹ÔìmNinePatchChunk£¬È»ºó½«ÆÕͨµÄBitmap´´½¨ÎªNinePatchDrawable£¬ÒòΪiosµÄÌØÐÔ£¬Éè¼Æ»áÖ¸¶¨Ò»¸öÀ­Éìµã£¬ÒÔ¼°ÎÄ×ÖÏÔÊ¾ÇøÓò£¬ÕâÁ½¸öÊý¾ÝÊǹ̶¨µÄ£¬Ò²¾ÍÊÇ˵£¬Ã¿¸öµã¾ÅͼÉϵĺÚÏßÊǹ̶¨µÄ£¬ËùÒÔ¿ÉÒÔ¸ù¾ÝÕâЩÊý¾ÝÀ´¹¹ÔìÒ»¸ö¹Ì¶¨µÄmNinePatchChunk¡£ÕâÑù¿ÉÒÔ×ö³öÒ»¸ö¸úiosʵÏÖ·½Ê½ÏàͬµÄ¿Ø¼þ¡££¨¼û3.2£©

×îºóÊÇͨ¹ýÁªÏµÊÖq²Î¿¼²¢²ÉÓÃÁËËûÃǵķ½°¸£¬Ò²¾ÍÊÇÉÏÃæµÄµÚÒ»ÖÖ·½·¨ÊµÏֵġ£ (ΪÁ˱ÜÃâÍâ°üͬѧ³ö´íºóÎÞ·¨·¢ÏÖÎÊÌ⣬ÕâÀïÈç¹û²»Êǵã¾Åͼ£¬ÔòÉϱ¨£¬ÓÃÓÚ·¢ÏÖÎÊÌâ)

2.2 ×îÖÕÈ·¶¨µÄʹÓÃÁ÷³Ì

×îÖÕÈ·¶¨µÄʵÏÖÁ÷³ÌÈçÏÂͼËùʾ£º

½ÓÏÂÀ´ËµËµÕâ9¸ö²½ÖèÖеÄÓöµ½ÎÊÌ⣺

1.²½Öè2ÖУ¬¸ø9µãͼ»­ºÚÏߣ¬±ØÐëÊÇ´¿ºÚÉ«ÏñËØ£¬ÇÒͼƬµÄËĸö½Ç±ØÐëΪ͸Ã÷ÏñËØµã£¬·ñÔòAndroid»áÎÞ·¨Ê¶±ð£¬ÇÒÔÚ²½Öè3Öн«ÎÞ·¨×ª»»¡£

2.²½Öè3ÖУ¬½«´øºÚÏߵĵã¾Åͼת»»£¬¿ÉÒÔʹÓÃAndroid SDK×Ô´øµÄaapt¹¤¾ß½øÐÐת»»£¬Ê¹ÓÃÃüÁîaapt c -v -S . -C .\9out£¬ÆäÖÐ.±íʾµ±Ç°Ä¿Â¼£¬.\9out±íʾĿ±êĿ¼£¬¼´½«µ±Ç°Ä¿Â¼ÖеĴøºÚÏߵĵã¾Åͼת»»ºó·Åµ½µ±Ç°Ä¿Â¼ÏµÄ9outÎļþ¼ÐÖУ¬9outÎļþ¼Ð¸ÃÃüÁî»á×Ô¶¯´´½¨¡£ÎªÁËÈÃÍâ°ü×Ô¶¯»¯Õâ¸ö¹ý³Ì£¬¿ÉÒÔ½«Æä×ö³ÉÒ»¸ö¹¤¾ß£¬ÓÃÓÚÅúÁ¿×ª»»¡£

3.²½Öè4ÖУ¬ÉÏ´«µÄ¹ý³ÌÖв»ÄܶÔת»»ºóµÄµã¾Åͼ½øÐÐѹËõ£¨Ä³Ð©ÅäÖÃÆ½Ì¨»áĬÈ϶ÔÉÏ´«µÄͼƬ½øÐÐѹËõ£©£¬ÒòΪת»»ºóµÄµã¾ÅͼµÄºÚÏßÐÅÏ¢±»±£´æµ½ÁËpngͼƬµÄ¸¨ÖúÊý¾Ý¿éÖУ¬Õⲿ·ÖÊý¾ÝÔÚѹËõ¹ý³ÌÖлáÏûʧ£¬µ¼ÖÂ×îÖÕ¿Í»§¶Ëͨ¹ýurlÀ­µ½µÄͼƬ²»Êǵã¾Åͼ£¬´Ó¶øÏÔʾ´íÎó¡£

4.²½Öè4ÖУ¬Ä³Ð©cdnÒòΪʡÁ÷Á¿£¬»òÕ߯äËüÔ­Òò£¬¶ÔͼƬ½øÐÐѹËõ»òÕßתÂëΪwebp¸ñʽ£¬ÕâÑù»áµ¼ÖÂ×îÖÕͨ¹ýurlÀ­È¡µÄͼƬ²»ÊÇÏëÒªµÄµã¾Åͼ£¬´Ó¶øÏÔʾ´íÎó¡£ÕâÀïÒªÕë¶Ô²»Í¬ÒµÎñ²ÉÈ¡²»Í¬µÄ´¦Àí·½Ê½£¬ÕâÀï¼òµ¥ËµËµK¸èÕâÀïµÄ´¦Àí·½Ê½£¬ÓÃÓÚ½è¼ø¡£

Ê×ÏȽéÉÜÏÂĿǰK¸èʹÓÃwebpµÄ·½°¸£º

1. ¿Í»§¶ËhttpÇëÇóÈç¹û´øÁËaccept:image/webp£¬Ôò·þÎñÆ÷ÈÏΪÐèÒªwebp£¬´Ëʱ»áתһ·Ýwebp¸ñʽͼƬ³öÀ´£¬ºóÐøÇëÇó¸ø¿Í»§¶ËµÄÊÇwebp¸ñʽͼƬ¡£ 2. Èç¹ûhttpÇëÇóÀï²»´øwebp²ÎÊý£¬ÇÒͼƬurlÊÇ/0(±íʾԭͼ)½á⣬Ôò·þÎñÆ÷²»»áѹËõ¡£

ËùÒÔÒª±£Ö¤×îÖÕurlÀ­µ½µÄͼƬ²»ÊÇwebp¸ñʽ£¬ÇÒ²»±»Ñ¹Ëõ£¬ÓÐÁ½¸öÌõ¼þ£º

1. ÔÚÕâÀàÀ­µã¾ÅͼurlÇëÇóµÄÇëÇóÍ·Àï²»´øÉÏaccept:image/webp¡£ 2. À­µã¾ÅͼµÄurlµÄĩβÒÔ/0½áβ¡£

5.²½Öè8ÖУ¬ÐèҪͨ¹ýBitmap´´½¨drawable£¬Èç¹ûÊÇʹÓõÄresÎļþ£¬Androidϵͳ×Ô¼º»áÍê³ÉÕâ¸ö¹ý³Ì£¬¶øÈç¹ûÊÇÍøÉÏÀ­È¡µÄͼƬ£¬ÔòÐèÒª×Ô¼º´´½¨£¬Õⲿ·Ö´úÂëÈçÏ£º

byte[] chunk = bitmap .getNinePatchChunk(); if ( Nine Patch .isNinePatchChunk (chunk)) { NinePatchDrawable ninePatchDrawable = new NinePatchDrawable (bitmap, chunk , new Rect(), null); } else { BitmapDrawable bitmapDrawable = new BitmapDrawable (bitmap) }

ÕâÀïÒª¿´¿´Õâ¸öchunkÐÅÏ¢ÊÇÔõô±»¹¹ÔìµÄ£¬ÒÔ¼°ÈçºÎÅжÏÕâ¸öchunkÊDz»Êǵã9chunkµÄ¡£Õâ¸öºóÃæÔÙ½²¡£

6.²½Öè9ÖУ¬Ò»¶¨ÒªÊ¹Óûº´æ£¬²»È»Òì²½¼ÓÔØµÄ¹ý³ÌÖУ¬ÔÚlistÖÐÏÔʾ»áÓÐÎÊÌâ£¬Ìø±äºÜÑÏÖØ¡£ÓеÄͼƬ¼ÓÔØ×é¼þ²»Ö§³ÖNinePatchDrawable»º´æµÄ¼ÇµÃÒª²¹ÉÏ¡£

7.²½Öè8»ò9ÖУ¬ÎªÁ˱ÜÃâÍâ°üͬѧ³ö´íºóÎÞ·¨·¢ÏÖÎÊÌ⣬»òÕß³öÏÖÎÊÌâ4ÖÐËù˵µÄѹËõºÍ¸ñʽת»»µ¼Ö³ö´í£¬ËùÒÔÕâÀïÈç¹û²»Êǵã¾Åͼ£¬Ôò½øÐÐÉϱ¨£¬ÓÃÓÚ·¢ÏÖÎÊÌâ¡£

3. ÆäËüÎÊÌâ

ÏÈÀ´Ò»Ð¡¶Î·ÖÎö£º

¸ù¾Ý֮ǰµÄÌÖÂÛÎÒÃÇÖªµÀ£¬»­ºÚÏߵĵã¾ÅͼÓëÆÕͨͼƬµÄÇø±ðÖ÷ÒªÔÚÓÚËÄÖܶàÁË1pxµÄºÚÏߣ¬¶ø×ª»»ºóµÄµã¾ÅͼÔòûÓÐÕâ1pxµÄºÚÏߣ¬µ«ÊÇËüÈ´°üº¬ÁËÓÃÓÚÀ­ÉìµÄÐÅÏ¢£¬ÄÇôÕâ¸öÐÅÏ¢ÊDZ»°üº¬ÔÚÄÄÀïÄØ£¿ÕâÀï¾ÍÒª¿´¿´pngͼƬµÄÎļþ¸ñʽÁË¡£

pngͼƬÊÇÓÉÒ»¸öpngÎļþ±êÖ¾ºÍÈý¸öÒÔÉϵÄÊý¾Ý¿é(chunk)°´ÕÕÌØÐÔµÄ˳Ðò×é³É£¬Ëüº¬ÓÐÁ½ÖÖÀàÐ͵ÄÊý¾Ý¿é£¬¹Ø¼üÊý¾Ý¿éºÍ¸¨ÖúÊý¾Ý¿é£¬¹Ø¼üÊý¾Ý¿éÖ»°üº¬ÎļþÍ·¡¢Î²Êý¾Ý¿éºÍͼÏñÊý¾Ý¿é£¬ÊDZØÐëÒªÓе쬶ø¸¨ÖúÊý¾Ý¿éÔòÊÇ¿ÉÑ¡µÄ¡£°üº¬ÁËһЩ¶îÍâµÄÐÅÏ¢£¬Ã¿¸öÊý¾Ý¿é°üº¬ÄÄЩÐÅÏ¢¿ÉÒԲο¼ÎÄÕÂPNGÎļþ½á¹¹·ÖÎö£¬ÕâÀï¾Í²»¶à˵ÁË¡£

PNGÎļþ½á¹¹ÈçÏÂ

ÏÖÔÚ¿ÉÒÔÖªµÀ£¬µã¾ÅͼµÄºÚÏߣ¬ÔÚ±àÒëʱ£¬±»×ª»»³ÉÁËijЩÊý¾Ý£¬±£´æÔÚÁËpngͼƬµÄ¸¨ÖúÊý¾Ý¿éÖÐÁË¡£

ÄÇô£¬Õâ¸öÊý¾Ý¿éÊÇʲôÑùµÄ£¬javaµÄBitmapÓÖÊÇÈçºÎ½âÎö³öÕâ¸öÊý¾Ý¿éµÄÄØ£¿Í¨¹ý×·²é£¬¿ÉÒÔÕÒµ½Õâ¿é´úÂ룬ÆäÖÐmPatch×îÖÕ½«±»¹¹Ôìµ½BitmapÖÐÈ¥¡£

// frameworks \base\core \jni\android \graphics \ NinePatch Peeker .cpp
bool NinePatchPeeker:: readChunk (const char tag[], const void * data , size_t length) {
if ( !strcmp ("npTc", tag) && length >= sizeof (Res_png_ 9patch) ) {
Res_png_ 9patch* patch = (Res_png_9patch*) data;
size_t patchSize = patch->serializedSize();
if (length != patchSize) {
return false;
}
// You have to copy the data because it is owned by the png reader
Res_ png_ 9patch* patchNew = (Res_png_ 9patch*) malloc ( patchSize );
memcpy (patchNew, patch, patchSize);
Res_png_ 9patch:: deserialize (patchNew);
patchNew- >fileToDevice();
free(mPatch);
mPatch = patchNew;
mPatchSize = patchSize;
} else {
...
}
return true; // keep on decoding
}

ͨ¹ýÕâ¿é´úÂë¿ÉÒÔÖªµÀ£¬ÏµÍ³ÊÇÕÒµ½tagΪ¡°npTc¡±µÄÊý¾Ý¿é£¬Èç¹ûÕâ¸öÊý¾Ý¿éûÓÐÒì³£µÄ»°£¬¾Í½«Õâ¸öÊý¾Ý¿éµÄÊý¾Ý¸´ÖƸømPatch£¬×îÖÕ±»×°Èëµ½BitmapÖС£

ÕâÀïÓиöRes_png_9patch½á¹¹£¬ËùÒÔBitmapµÄmNinePatchChunkµÄÊý¾Ý½á¹¹Êµ¼ÊÉÏΪRes_png_9patch£¬µÚÒ»¸ö×Ö½ÚÓÃÀ´±íʾÕâ¸öpngͼƬÊÇ·ñÊǵã¾Åͼ£¬ÉÏÊöµÄNinePatch.isNinePatchChunk()·½·¨Ò²ÊÇͨ¹ýÕâ¸ö×Ö½ÚÅжϵ쬽ÓמÍÊÇһЩÀ­ÉìµãµÄλÖúÍpaddingÐÅÏ¢£¬ÓÃÓÚ×îºóµÄäÖȾÁ÷³Ì¡£

//frameworks \base\libs \androidfw \include\androidfw \ ResourceTypes .h
struct alignas (uintptr_t) Res_png_9patch
{
Res_png_9patch() : wasDeserialized (false) , xDivsOffset(0),
yDivsOffset (0), colorsOffset(0) { }
int8_t wasDeserialized;
uint8_t numXDivs;
uint8_t numYDivs;
uint8_t numColors;
// The offset (from the start of this structure) to the xDivs & yDivs
// array for this 9patch . To get a pointer to this array , call
// getXDivs or getYDivs. Note that the serialized form for 9patches places
// the xDivs , yDivs and colors arrays immediately after the location
// of the Res_png_9patch struct.
uint32_t xDivsOffset;
uint32_t yDivsOffset;
int32_t paddingLeft, paddingRight;
int32_t paddingTop, paddingBottom;
enum {
// The 9 patch segment is not a solid color.
NO_COLOR = 0x00000001,
// The 9 patch segment is completely transparent.
TRANSPARENT _COLOR = 0x00000000
};
// The offset (from the start of this structure) to the colors array
// for this 9patch.
uint32_t colorsOffset;
...
inline int32_t* getXDivs() const {
return reinterpret_ cast<int32_t*> (reinterpret_ cast <uintptr_t> ( this ) + xDivsOffset);
}
inline int32_t* getYDivs() const {
return reinterpret_ cast <int32_t*> (reinterpret_ cast <uintptr _t > (this) + yDivsOffset);
}
inline uint32_t* getColors() const {
return reinterpret_cast <uint32_t*> (reinterpret_ cast <uintptr_ t> (this) + colorsOffset);
}
} __attribute__((packed));

ÕâÀï¼òµ¥½²ÏÂÕâ¸ö½á¹¹ÖÐÿ¸ö×ֶδú±íµÄº¬Ò壺

ÔÙ¿´¿´ÕâЩ×Ö¶ÎÊÇÈçºÎÉúЧµÄ£¬Ê×ÏÈ¿´¿´Ò»¶ÎÔ´ÂëÖеÄ×¢ÊÍ£º

* This chunk specifies how to split an image into segments for
* scaling.
*
* There are J horizontal and K vertical segments. These segments divide
* the image into J*K regions as follows (where J= 4 and K=3):
*
* F0 S0 F1 S1
* +-----+----+------+-------+
* S2| 0 | 1 | 2 | 3 |
* +-----+----+------+-------+
* | | | | |
* | | | | |
* F2| 4 | 5 | 6 | 7 |
* | | | | |
* | | | | |
* +-----+----+------+-------+
* S3| 8 | 9 | 10 | 11 |
* +-----+----+------+-------+
*
* Each horizontal and vertical segment is considered to by either
* stretchable (marked by the Sx labels) or fixed (marked by the Fy
* labels), in the horizontal or vertical axis, respectively. In the
* above example, the first is horizontal segment (F0) is fixed, the
* next is stretchable and then they continue to alternate. Note that
* the segment list for each axis can begin or end with a stretchable
* or fixed segment.
* /

ÕýÈçÔ´Âë×¢ÊÍÖÐËùʾ£¬µã¾Åͼ½«Í¼Æ¬ÐéÄâµØ»®·Ö³ÉÁËn¸öÄ£¿é£¬ÆäÖÐFÇøÓò´ú±í¹Ì¶¨£¬SÇøÓò´ú±íÀ­É죬¶ømDivX£¬mDivYÃèÊöÁËËùÓÐSÇøÓòµÄλÖÃÆðʼλÖúͽáÊøÎ»Öã¬mColorÃèÊöÁ˸÷¸öСģ¿éµÄÑÕÉ«£¬´óСΪn£¬Í¨³£Çé¿öÏ£¬¸³ÖµÎªRes_png_9patch.NO_COLOR¡£¾ÍÒÔÔ´Âë×¢ÊÍÖеÄÀý×ÓÀ´Ëµ£¬mDivX£¬mDivY£¬mColorÈçÏ£º

mDivX = [ S0.start, S0.end, S1.start, S1.end];
mDivY = [ S2.start, S2.end, S3.start, S3.end];
mColor = [c[0],c[1],...,c[11]]

Õâʱ֮ǰµÄÎÊÌâ¾Í½â¾öÁË£¬Õâ¸öÊý¾Ý¿é¾ÍÊÇtagΪ¡±npTc¡°µÄÊý¾Ý¿é£¬Êý¾ÝÄÚÈÝΪ Res_png_9patch¡£JavaµÄBitmapͨ¹ý±éÀúpngµÄÊý¾Ý¿é£¬ÕÒ³ötagΪ¡±npTc¡°ÇÒ³¤¶ÈÎÞÎóµÄÊý¾Ý¿é£¬¾ÍÊǵã¾ÅͼµÄÊý¾Ý¿é£¬Õâ¸öÊý¾Ý¿é±£´æÁ˵ã¾ÅͼµÄÀ­ÉìÐÅÏ¢£¬Ö÷ÒªÊǶ¨ÒåÁËÀ­ÉìÇøÓòÒÔ¼°padding¡£

×îºóÀ´¿´¿´Ö®Ç°µÄ¼¸¸öÎÊÌ⣺

3.1 »­ºÚÏߵĵã¾ÅͼÔÚ±àÒëʱ¾­ÀúÁËʲô£¿

½«pngͼƬÖÐËÄÖܺÚÏßËù´ú±íµÄÐÅÏ¢½âÎö³ÉRes_png_9patch£¬´æ·Åµ½pngµÄÒ»¸öÊý¾Ý¿éÖУ¬È»ºó°ÑºÚÏßĨȥ£¬ºÚÏßËù±íʾµÄÐÅÏ¢¾Í±£´æÔÚÁËÈçÉϵÄRes_png_9patch½á¹¹ÖС£

3.2 ¿É·ñ²»Óõã¾Åͼ£¬¶øÊÇÖ¸¶¨Î»ÖÃÀ­Éì´ïµ½µã¾ÅͼµÄЧ¹û£¿

ÀíÂÛÉÏÊÇ¿ÉÐеģ¬¿ÉÒÔ¸ù¾ÝRes_png_patchµÄ½á¹¹£¬¹¹ÔìÒ»¸öchunk[]£¬½«ËùÐèÒªµÄÀ­ÉìÐÅÏ¢ºÍpaddingÌîÈëµ½ÐèÒªµÄλÖÃÉÏ£¬½Ó×ÅÔÚ¹¹ÔìNinePatchDrawableµÄʱºò£¬½«Õâ¸öchunk[]ÐÅÏ¢´«Èë½øÈ¥¼´¿É¡£

ÆäÖÐÀ­ÉìÐÅÏ¢ÒòΪios¶ËÒ²ÐèÒª£¬ËùÒÔºǫ́»á´«£¬»òÕßÉè¼Æ¶¨ºÃÒ»¸öλÖÃдËÀ£¬¶øpaddingÒ²ÊÇÉè¼Æ¸øµÄ£¬Êµ¼ÊÉÏÕâ¸öpadding»á±»view±¾ÉíÉèÖõÄpaddingËù¸²¸Ç¡£

NinePatchDrawableµÄ¹¹Ôì·½·¨ÎªNinePatchDrawable ninePatchDrawable = new NinePatchDrawable ( bitmap , chunk, new Rect (), null);£¬ÆäÖÐbitmapÖ±½ÓÓýâÎö³öÀ´µÄbitmap£¬chunkÔòÊÇ´Óbitmap . getNinePatchChunk ()È¡³öµÄÒ»¸öchunk £¬»òÕßÊǿͻ§¶Ë×Ô¼º¹¹ÔìµÄÒ»¸öbyte[]£¬allocate Ò»¸öByteBuffer£¬È»ºó¸ù¾Ý Res_png_9patch µÄ½á¹¹£¬ÒÀ´ÎÌîÈëÊý¾Ý¼´¿É¡£²Î¿¼ÎÄÕÂ2ÓÐÒ»¸öС demo£¬ÓÐÐËȤµÄ¿ÉÒÔÌø×ª¿´¿´¡£

3.3 mNinePatchChunkÐÅÏ¢ÊÇÈçºÎ±»¹¹ÔìµÄ£¬ÓÖÊÇÈçºÎÅжÏÒ»¸öchunkÐÅÏ¢ÊDz»Êǵã9chunk ÐÅÏ¢µÄ£¿

ÕâÀïµÄmNinePatchChunk ÐÅÏ¢£¬Êµ¼ÊÉÏÊÇÔÚ±àÒëʱ£¬±àÒëÆ÷½«pngͼƬÖÐËÄÖܺÚÏßËù´ú±íµÄÐÅÏ¢½âÎö³ÉRes _ png_ 9patch£¬´æ·Åµ½pn gµÄÒ»¸öÊý¾Ý¿éÖУ¬È»ºój½«tagÉèÖÃΪ¡°npTc¡±£¬½Ó×ÅÔÚʹÓÃʱ£¬Í¨¹ý±éÀúpng µÄÊý¾Ý¿é£¬ÕÒµ½tagΪ¡°npTc¡±µÄÊý¾Ý¿é£¬Èç¹ûÕâ¸öÊý¾Ý¿éûÓÐÎÊÌ⣬Õâ±»ÓÃ×÷²ÎÊý¹¹Ôì Bitmap£¬×îÖÕ³ÉΪ mNinePatchChunk¡£

ÅжÏÒ»¸ö¾­¹ýtagºÍ³¤¶ÈɸѡºóµÄchunkÐÅÏ¢ÊÇ·ñÊǵã9chunkÐÅÏ¢£¬ÊÇÖ±½Óͨ¹ýRes_png_ 9patch. wasDeserialized Åжϵģ¬¿ÉÒÔ¿´¿´NinePatch µÄisNinePatchChun kµÄ´úÂ룬Èç¹ûwasDeserialized ²»Îª-1£¬Ôò±íʾÕâ¸öÐÅÏ¢Êǵã9chunk ÐÅÏ¢¡£

static jboolean isNinePatchChunk (JNIEnv* env , jobject , jbyteArray obj) {
if (NULL == obj) {
return JNI_ FALSE;
}
if (env-> GetArrayLength(obj) < (int) sizeof (Res_ png _ 9patch )) {
return JNI_FALSE;
}
const jbyte* array = env-> GetByteArrayElements (obj, 0);
if (array != NULL) {
const Res_png_9patch* chunk = reinterpret_cast <const Res_png_ 9patch*> (array);
int8_t wasDeserialized = chunk->wasDeserialized;
env-> ReleaseByteArrayElements (obj, const_cast <jbyte*> (array), JNI_ ABORT);
return (wasDeserialized != -1) ? JNI_TRUE : JNI_FALSE;
}
return JNI_FALSE;
}
   
3035 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì