Your SlideShare is downloading. ×
0
Tuesday, May 25, 2010
Tuesday, May 25, 2010
Casting a Wide Net:
      Targeting All Android Devices
      Justin Mattson
      Developer Advocate
      19 May 2010


...
House keeping
          Use Wave to see live notes and ask questions



                         http://tinyurl.com/io10ca...
Agenda
          Resource Loading
          Image & Drawable Considerations
          Adapting to API Availability
       ...
Resource Loading
       • Based on current system configuration
       • If config changes, your app restarts (eg. orienta...
Resource loading
      Screen size
       • Physical size of the screen
       • Buckets
           – small: <~3.0”
      ...
Resource loading
      Screen orientation
       • landscape, portrait, or
         square
       • Might be triggered by
...
Resource loading
      Screen density
       • Pixels per unit of measurement
       • System looks for “best” fit*
      ...
Resource loading
      Screen density
       • Pixels per unit of measurement
       • System looks for “best” fit*
      ...
Resource loading
      SDK Version
       • Styles across versions


       • Inexact matching, <= current
         versio...
Resource loading
      SDK Version
       • Styles across versions


       • Inexact matching, <= current
         versio...
Resource loading
      SDK Version
       • Styles across versions


       • Inexact matching, <= current
         versio...
Resource loading
      SDK Version
       • Styles across versions


       • Inexact matching, <= current
         versio...
Tuesday, May 25, 2010
Image resources



Tuesday, May 25, 2010
Image Resources
       • Goal is uniform physical sizing across screens
       • Best match allows for up or down sampling...
Image Resources
      The trouble with pixels




      12


Tuesday, May 25, 2010
Image Resources
      The trouble with pixels




      12


Tuesday, May 25, 2010
Image Resources
      The trouble with pixels




      12


Tuesday, May 25, 2010
Image Resources
      The trouble with pixels




      12


Tuesday, May 25, 2010
Image Resources
      The trouble with pixels




      12


Tuesday, May 25, 2010
Manipulating Image Loading
      • DO NOT DO THIS
      • OKAY, okay, if you must...
      • Only possible (and sensical) ...
Nine-Patches
       • Use to create image resources that can stretch controllably
       • One set of controls for stretch...
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      Stretching to fill the space




      15


Tuesday, May 25, 2010
Nine-Patches
      A little cushion




      16


Tuesday, May 25, 2010
Tuesday, May 25, 2010
Drawables



Tuesday, May 25, 2010
Shapes
       • Draw optimized views, regardless of screen
       • Primitives like square, oval, rectangle
       • Use t...
Shapes
        public class LogoView extends View {
             private Shape mShape = new RectShape();
             priv...
ScaleDrawable
       • Adapt your drawables in a custom manner based on screen
       • Wraps another drawable
       • Al...
LevelListDrawable
       • Specified in XML
       • Combines a group of resources into a drawable
       • Use where the ...
LevelListDrawable
           <?xml version="1.0" encoding="utf-8"?>
           <level-list xmlns:android="http://schemas.a...
LevelListDrawable

           public class IO_Demo extends Activity {
               public void onResume() {
            ...
LevelListDrawable




             Thanks to openclipart.org from for the Public Domain clipart used on this slide.
      ...
LevelListDrawable




             Thanks to openclipart.org from for the Public Domain clipart used on this slide.
      ...
LevelListDrawable




             Thanks to openclipart.org from for the Public Domain clipart used on this slide.
      ...
Tuesday, May 25, 2010
Cross-Version Compatibility



Tuesday, May 25, 2010
API Changes: New Classes
       • Runtime handling of class load failures
       • Class dependencies resolved when class ...
API Changes: New Classes
           public class Canary {
               private static NEW_CLASS foo;


               pu...
API Changes: New Classes
           public class MyActivity extends Activity {
            private boolean canaryAvailable...
API Changes: New Methods
       • A bit trickier than dealing with classes
       • Determining which APIs are available
 ...
API Changes: Mirror, mirror...
           public class Canary {
               private static Method getDensity;
         ...
API Changes: Mirror, mirror...
           public class Canary {
              private static boolean hasDensity;
         ...
Tuesday, May 25, 2010
Testing



Tuesday, May 25, 2010
Testing, testing, testing
       • Nothing beats it
       • Verify the UI is behaving as expected
       • Check that any...
Questions?
           Use Wave to see live notes and ask questions



                          http://tinyurl.com/io10cas...
Upcoming SlideShare
Loading in...5
×

Android casting-wide-net-android-devices

1,083

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,083
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
21
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Android casting-wide-net-android-devices"

  1. 1. Tuesday, May 25, 2010
  2. 2. Tuesday, May 25, 2010
  3. 3. Casting a Wide Net: Targeting All Android Devices Justin Mattson Developer Advocate 19 May 2010 Tuesday, May 25, 2010
  4. 4. House keeping Use Wave to see live notes and ask questions http://tinyurl.com/io10casting 3 Tuesday, May 25, 2010
  5. 5. Agenda Resource Loading Image & Drawable Considerations Adapting to API Availability Testing 4 Tuesday, May 25, 2010
  6. 6. Resource Loading • Based on current system configuration • If config changes, your app restarts (eg. orientation change) • Hierarchy of qualifiers 5 Tuesday, May 25, 2010
  7. 7. Resource loading Screen size • Physical size of the screen • Buckets – small: <~3.0” – normal: ~3.0” - ~4.0” – large: >~4.0” 6 Tuesday, May 25, 2010
  8. 8. Resource loading Screen orientation • landscape, portrait, or square • Might be triggered by accelerometers or other events 7 Tuesday, May 25, 2010
  9. 9. Resource loading Screen density • Pixels per unit of measurement • System looks for “best” fit* • Buckets – ldpi: ~120dpi – mdpi: ~160dpi – hdpi: ~240dpi • *Matching: everyone is a winner – first match on 1.5 8 Tuesday, May 25, 2010
  10. 10. Resource loading Screen density • Pixels per unit of measurement • System looks for “best” fit* • Buckets – ldpi: ~120dpi – mdpi: ~160dpi – hdpi: ~240dpi • *Matching: everyone is a winner – first match on 1.5 8 Tuesday, May 25, 2010
  11. 11. Resource loading SDK Version • Styles across versions • Inexact matching, <= current version • Work around 1.5 dpi bug – Exact matching on 1.5 - 2.0 – v5 thinks its v6 9 Tuesday, May 25, 2010
  12. 12. Resource loading SDK Version • Styles across versions • Inexact matching, <= current version • Work around 1.5 dpi bug – Exact matching on 1.5 - 2.0 – v5 thinks its v6 9 Tuesday, May 25, 2010
  13. 13. Resource loading SDK Version • Styles across versions • Inexact matching, <= current version • Work around 1.5 dpi bug – Exact matching on 1.5 - 2.0 – v5 thinks its v6 9 Tuesday, May 25, 2010
  14. 14. Resource loading SDK Version • Styles across versions • Inexact matching, <= current version • Work around 1.5 dpi bug – Exact matching on 1.5 - 2.0 – v5 thinks its v6 9 Tuesday, May 25, 2010
  15. 15. Tuesday, May 25, 2010
  16. 16. Image resources Tuesday, May 25, 2010
  17. 17. Image Resources • Goal is uniform physical sizing across screens • Best match allows for up or down sampling based on available resources – Single or few pixel features are most obviously impacted 11 Tuesday, May 25, 2010
  18. 18. Image Resources The trouble with pixels 12 Tuesday, May 25, 2010
  19. 19. Image Resources The trouble with pixels 12 Tuesday, May 25, 2010
  20. 20. Image Resources The trouble with pixels 12 Tuesday, May 25, 2010
  21. 21. Image Resources The trouble with pixels 12 Tuesday, May 25, 2010
  22. 22. Image Resources The trouble with pixels 12 Tuesday, May 25, 2010
  23. 23. Manipulating Image Loading • DO NOT DO THIS • OKAY, okay, if you must... • Only possible (and sensical) on 1.6 and above • Bitmap scaling controlled by density attributes of the object • Normally... BitmapFactory.Options default = new BitmapFactory.Options(); default.inDensity = <density of loaded resource> default.inTargetDensity = getResources().getDisplayMetrics().densityDpi; • Pixels are scaled by inTargetDensity/inDensity • Manually set inDensity = inTargetDensity = DisplayMetrics.densityDpi 13 Tuesday, May 25, 2010
  24. 24. Nine-Patches • Use to create image resources that can stretch controllably • One set of controls for stretching, another for the content area 14 Tuesday, May 25, 2010
  25. 25. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  26. 26. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  27. 27. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  28. 28. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  29. 29. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  30. 30. Nine-Patches Stretching to fill the space 15 Tuesday, May 25, 2010
  31. 31. Nine-Patches A little cushion 16 Tuesday, May 25, 2010
  32. 32. Tuesday, May 25, 2010
  33. 33. Drawables Tuesday, May 25, 2010
  34. 34. Shapes • Draw optimized views, regardless of screen • Primitives like square, oval, rectangle • Use these as the basis for simple graphics instead of bitmaps • Shape.draw() makes it easy to build a custom view 18 Tuesday, May 25, 2010
  35. 35. Shapes public class LogoView extends View { private Shape mShape = new RectShape(); private Drawable mLogo; public LogoView (Context context) { super(context); mLogo = getContext().getResources() .getDrawable(R.id.logo); } protected void onDraw(Canvas canvas) { mShape.resize(canvas.getWidth(), canvas.getHeight()); mShape.draw(canvas, mLogoBackgroundPaint); mLogo.draw(canvas); } } 19 Tuesday, May 25, 2010
  36. 36. ScaleDrawable • Adapt your drawables in a custom manner based on screen • Wraps another drawable • Allows for more exact control over scaling • Ideal for situations where it doesn’t make sense to preserve aspect ratio – Progress bars – Dividers – Any place where one dimension is more important than the other 20 Tuesday, May 25, 2010
  37. 37. LevelListDrawable • Specified in XML • Combines a group of resources into a drawable • Use where the drawable is logically the same, but presentation varies based on state – status meters (eg. battery, signal) – weather condition – sports team – UI theme • For cases without a natural “level”, define constants making code more readable • Select the right resource for the right UI theme 21 Tuesday, May 25, 2010
  38. 38. LevelListDrawable <?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/ res/android"> <item android:maxLevel="0" android:drawable="@drawable/rain_chance_zero"/> <item android:maxLevel="10" android:drawable="@drawable/rain_chance_slight"/> <item android:maxLevel="40" android:drawable="@drawable/rain_chance_good"/> <item android:maxLevel="70" android:drawable="@drawable/rain_chance_high"/> </level-list> 22 Tuesday, May 25, 2010
  39. 39. LevelListDrawable public class IO_Demo extends Activity { public void onResume() { ((ImageView)findViewBy(R.id.weather)) .setImageLevel(getRainChance()); } private int getRainChance() { // call web service to get forecast } } 23 Tuesday, May 25, 2010
  40. 40. LevelListDrawable Thanks to openclipart.org from for the Public Domain clipart used on this slide. 24 Tuesday, May 25, 2010
  41. 41. LevelListDrawable Thanks to openclipart.org from for the Public Domain clipart used on this slide. 24 Tuesday, May 25, 2010
  42. 42. LevelListDrawable Thanks to openclipart.org from for the Public Domain clipart used on this slide. 24 Tuesday, May 25, 2010
  43. 43. Tuesday, May 25, 2010
  44. 44. Cross-Version Compatibility Tuesday, May 25, 2010
  45. 45. API Changes: New Classes • Runtime handling of class load failures • Class dependencies resolved when class is first loaded • Use a second class with a static method to provoke class verification • Catch any verification error and adapt behavior • Avoids messy Class.forName(“”) pattern, but grows number of classes needed – group in a single package or as inner classes 26 Tuesday, May 25, 2010
  46. 46. API Changes: New Classes public class Canary { private static NEW_CLASS foo; public static void tryNewClass() { foo = new NEW_CLASS(); } } 27 Tuesday, May 25, 2010
  47. 47. API Changes: New Classes public class MyActivity extends Activity { private boolean canaryAvailable; private void checkApis() { try { Canary.tryNewClass(); canaryAvailable = true; } catch (VerifyError e) { canaryAvailable = false; Log.w(LOG_TAG, “Canary unavailable, falling back.”); } } 28 Tuesday, May 25, 2010
  48. 48. API Changes: New Methods • A bit trickier than dealing with classes • Determining which APIs are available – Use reflection to check availability – Make your code version aware • Working with availability – Call through using reflection (fewer classes) – Write a factory to return the right class (cleaner) 29 Tuesday, May 25, 2010
  49. 49. API Changes: Mirror, mirror... public class Canary { private static Method getDensity; static { getDensity = Canvas.class.getMethod(“getDensity”, null); } catch (NoSuchMethodException e) { Log.w(LOG_TAG, “getDensity method not available.”); } } 30 Tuesday, May 25, 2010
  50. 50. API Changes: Mirror, mirror... public class Canary { private static boolean hasDensity; private Canvas mDrawingSurface; public Integer getDensity() { if (getDensity != null) { return (Integer) getDensity.invoke(mDrawingSurface, null); } else { return DEFAULT; } } 31 Tuesday, May 25, 2010
  51. 51. Tuesday, May 25, 2010
  52. 52. Testing Tuesday, May 25, 2010
  53. 53. Testing, testing, testing • Nothing beats it • Verify the UI is behaving as expected • Check that any API compatibility code functions properly • Hardware testing is hopefully unnecessary, but... 33 Tuesday, May 25, 2010
  54. 54. Questions? Use Wave to see live notes and ask questions http://tinyurl.com/io10casting 34 Tuesday, May 25, 2010
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×