±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÌÚÑ¶ÔÆ£¬½éÉÜÁ˵ã¾ÅͼµÄ±¾ÖÊ£¬ÁÄÌìÆøÅÝÖÐʹÓõã¾Åͼ£¬ÆäËüÎÊÌâµÈ¡£ |
|
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;
} |
|