<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6648017645721515533</id><updated>2012-02-16T20:29:01.822-08:00</updated><category term='Drawables'/><category term='full screen'/><category term='title bar'/><category term='Memory Leaks'/><category term='Blender'/><category term='Android'/><category term='OpenGL ES'/><category term='Animation'/><category term='ImageView'/><category term='Bitmaps'/><category term='Style'/><category term='ListView'/><title type='text'>E.T. Code Home</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://etcodehome.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-6349762377589961983</id><published>2011-07-15T08:35:00.000-07:00</published><updated>2011-07-15T13:59:55.536-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL ES'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android - Rendering 3D Blender Models (Part 1)</title><content type='html'>&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/UvoquaaJauA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;I decided I to create a simple OpenGL ES example for Android.  I found many examples with hard coded values for a model, but I wanted to create the model in a 3D modeling tool and import it into my app.  I wanted to do this using a model made in &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; due to my experience with the tool and its FREE!  Here are the steps I took to accomplish this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exporting a 3D Model from Blender&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Once your model is ready to export, select only the objects you want.&lt;br /&gt;2) Go to: File -&gt; Export -&gt; Wavefront (.obj)&lt;br /&gt;3) Next you will see a screen with an Export OBJ tab on the left.  I found the most success only the following items selected:&lt;br /&gt;&lt;br /&gt;- Selection Only&lt;br /&gt;- Normals&lt;br /&gt;- UVs&lt;br /&gt;- Triangulate&lt;br /&gt;- Objects as OBJ Objects&lt;br /&gt;- Keep Vertex Order&lt;br /&gt;&lt;br /&gt;4) Export your Wavefront file&lt;br /&gt;5) Place the .obj files into your Android App's assets folder&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating your OpenGL ES Android App Structure&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After some research into OpenGL ES I became most comfortable with the following structure:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gb7a6yus0_s/TiBflWGvY1I/AAAAAAAAAFA/wDsSFRckfu0/s1600/AndroidOpenGLES_Structure.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="156" src="http://3.bp.blogspot.com/-gb7a6yus0_s/TiBflWGvY1I/AAAAAAAAAFA/wDsSFRckfu0/s200/AndroidOpenGLES_Structure.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will work from the bottom up while walking through this example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parsing a Wavefront File&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Your Wavefront file should have the following format (&lt;a href="http://en.wikipedia.org/wiki/Wavefront_.obj_file"&gt;learn more&lt;/a&gt;):&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; // Vertices  &lt;br /&gt; v 1.797824 0.168228 5.381136  &lt;br /&gt; ...  &lt;br /&gt;   &lt;br /&gt; // Normals  &lt;br /&gt; vn 0.000000 1.000000 0.000000  &lt;br /&gt; ...  &lt;br /&gt;   &lt;br /&gt; // Faces  &lt;br /&gt; f 21//1 1//2 2//3  &lt;br /&gt; ...  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I found a great example of parsing a Wavefront file in the &lt;a href="http://code.google.com/p/earth-live-wallpaper/"&gt;Earth Live Wallpaper&lt;/a&gt; project.  The following is a stripped down version of their parsing method.  I've stripped this down because my example does not include the object's textures.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:400px;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;1:  private void LoadObjFile() {  &lt;br /&gt;2:              &lt;br /&gt;3:      try   &lt;br /&gt;4:      {  &lt;br /&gt;5:           AssetManager am = mContext.getAssets();  &lt;br /&gt;6:        String str;  &lt;br /&gt;7:        String[] tmp;  &lt;br /&gt;8:        String[] ftmp;  &lt;br /&gt;9:        float v;  &lt;br /&gt;10:        ArrayList&amp;lt;Float&amp;gt; vlist = new ArrayList&amp;lt;Float&amp;gt;();  &lt;br /&gt;11:        ArrayList&amp;lt;Float&amp;gt; nlist = new ArrayList&amp;lt;Float&amp;gt;();  &lt;br /&gt;12:        ArrayList&amp;lt;Fp&amp;gt; fplist = new ArrayList&amp;lt;Fp&amp;gt;();  &lt;br /&gt;13:          &lt;br /&gt;14:        BufferedReader inb = new BufferedReader(new InputStreamReader(am.open("androidmodel.obj")), 1024);  &lt;br /&gt;15:          &lt;br /&gt;16:        while ((str = inb.readLine()) != null)   &lt;br /&gt;17:        {  &lt;br /&gt;18:             tmp = str.split(" ");  &lt;br /&gt;19:               &lt;br /&gt;20:             //Parse the vertices  &lt;br /&gt;21:             if (tmp[0].equalsIgnoreCase("v"))   &lt;br /&gt;22:             {  &lt;br /&gt;23:                  for (int i = 1; i &amp;lt; 4; i++)   &lt;br /&gt;24:                  {  &lt;br /&gt;25:                       v = Float.parseFloat(tmp[i]);  &lt;br /&gt;26:              vlist.add(v);  &lt;br /&gt;27:            }  &lt;br /&gt;28:             }  &lt;br /&gt;29:             //Parse the vertex normals  &lt;br /&gt;30:          if (tmp[0].equalsIgnoreCase("vn"))   &lt;br /&gt;31:          {  &lt;br /&gt;32:               for (int i = 1; i &amp;lt; 4; i++)   &lt;br /&gt;33:               {  &lt;br /&gt;34:                    v = Float.parseFloat(tmp[i]);  &lt;br /&gt;35:              nlist.add(v);  &lt;br /&gt;36:            }  &lt;br /&gt;37:          }  &lt;br /&gt;38:          //Parse the faces/indices  &lt;br /&gt;39:          if (tmp[0].equalsIgnoreCase("f"))   &lt;br /&gt;40:          {  &lt;br /&gt;41:               for (int i = 1; i &amp;lt; 4; i++)   &lt;br /&gt;42:               {  &lt;br /&gt;43:                    ftmp = tmp[i].split("/");  &lt;br /&gt;44:                      &lt;br /&gt;45:                    long chi = Integer.parseInt(ftmp[0]) - 1;  &lt;br /&gt;46:                    int cht = 0;  &lt;br /&gt;47:                    if(!ftmp[1].equals(""))  &lt;br /&gt;48:                         cht = Integer.parseInt(ftmp[1]) - 1;  &lt;br /&gt;49:              int chn = Integer.parseInt(ftmp[2]) - 1;  &lt;br /&gt;50:    &lt;br /&gt;51:              fplist.add(new Fp(chi, cht, chn));  &lt;br /&gt;52:            }  &lt;br /&gt;53:               NBFACES++;  &lt;br /&gt;54:          }  &lt;br /&gt;55:        }  &lt;br /&gt;56:          &lt;br /&gt;57:        ByteBuffer vbb = ByteBuffer.allocateDirect(fplist.size() * 4 * 3);  &lt;br /&gt;58:        vbb.order(ByteOrder.nativeOrder());  &lt;br /&gt;59:        mVertexBuffer = vbb.asFloatBuffer();  &lt;br /&gt;60:    &lt;br /&gt;61:        ByteBuffer nbb = ByteBuffer.allocateDirect(fplist.size() * 4 * 3);  &lt;br /&gt;62:        nbb.order(ByteOrder.nativeOrder());  &lt;br /&gt;63:        mNormBuffer = nbb.asFloatBuffer();  &lt;br /&gt;64:    &lt;br /&gt;65:        for (int j = 0; j &amp;lt; fplist.size(); j++)   &lt;br /&gt;66:        {  &lt;br /&gt;67:             mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3)));  &lt;br /&gt;68:          mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3 + 1)));  &lt;br /&gt;69:          mVertexBuffer.put(vlist.get((int) (fplist.get(j).Vi * 3 + 2)));  &lt;br /&gt;70:    &lt;br /&gt;71:          mNormBuffer.put(nlist.get(fplist.get(j).Ni * 3));  &lt;br /&gt;72:          mNormBuffer.put(nlist.get((fplist.get(j).Ni * 3) + 1));  &lt;br /&gt;73:          mNormBuffer.put(nlist.get((fplist.get(j).Ni * 3) + 2));  &lt;br /&gt;74:        }  &lt;br /&gt;75:          &lt;br /&gt;76:        mIndexBuffer = CharBuffer.allocate(fplist.size());  &lt;br /&gt;77:        for (int j = 0; j &amp;lt; fplist.size(); j++)   &lt;br /&gt;78:        {  &lt;br /&gt;79:             mIndexBuffer.put((char) j);  &lt;br /&gt;80:        }  &lt;br /&gt;81:          &lt;br /&gt;82:        mVertexBuffer.position(0);  &lt;br /&gt;83:        mNormBuffer.position(0);  &lt;br /&gt;84:        mIndexBuffer.position(0);  &lt;br /&gt;85:    &lt;br /&gt;86:      } catch (FileNotFoundException e)   &lt;br /&gt;87:      {  &lt;br /&gt;88:           e.printStackTrace();  &lt;br /&gt;89:      } catch (IOException e)   &lt;br /&gt;90:      {  &lt;br /&gt;91:           e.printStackTrace();  &lt;br /&gt;92:      }  &lt;br /&gt;93:       }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-6349762377589961983?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/6349762377589961983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/6349762377589961983'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/07/android-rendering-3d-blender-models.html' title='Android - Rendering 3D Blender Models (Part 1)'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/UvoquaaJauA/default.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-2210768562870743838</id><published>2011-07-07T13:03:00.000-07:00</published><updated>2011-07-07T13:07:19.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='ListView'/><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android - Animations</title><content type='html'>&lt;b&gt;Page Transitions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To override the current page transitions when switching activities you can use the overridePendingTransition method.  The code snippet shows an example of using the pre-defined Android animations fade_in and fade_out.  We need to provide resource ids to the overridePendingTransition method representing the incoming activity and outgoing activity animations.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; Intent i = new Intent(this, ListViewExampleActivity.class);  &lt;br /&gt; startActivity(i);  &lt;br /&gt; overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;View Animations&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In this example we will make our own custom animation.  The easiest way to create your own animation xml file in Eclipse follows:&lt;br /&gt;&lt;br /&gt;1) Right click your project in the Package Explorer&lt;br /&gt;2) New -&gt; Android XML File&lt;br /&gt;3) Select "Animation" as your type, this will place your xml into "res/anim"&lt;br /&gt;&lt;br /&gt;The following code shows an example of a scale animation.  This animation is using the bounce interpolator.  This is much like easing functions in Silverlight.  This causes the animation to have a bounce effect.  The animation defines the from and to scales, starting at 0 and ending at 1.  It also moves the X and Y pivots to 50% so that as the element scales up it scales from the center of the object.  Finally the duration is set to 500 milliseconds.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;set xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;       android:interpolator="@android:anim/bounce_interpolator"&amp;gt;  &lt;br /&gt;   &amp;lt;scale   &lt;br /&gt;       android:fromXScale="0.0" android:toXScale="1.0"   &lt;br /&gt;       android:fromYScale="0.0" android:toYScale="1.0"  &lt;br /&gt;       android:pivotX="50%" android:pivotY="50%"  &lt;br /&gt;       android:fillAfter="true"   &lt;br /&gt;       android:duration="500"&amp;gt;  &lt;br /&gt;   &amp;lt;/scale&amp;gt;  &lt;br /&gt; &amp;lt;/set&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;To apply this animation use the following code:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; Button animBttn = (Button)findViewById(R.id.AnimationButton);  &lt;br /&gt; animBttn.setOnClickListener(this);  &lt;br /&gt;       &lt;br /&gt; Animation bttnAnim = AnimationUtils.loadAnimation(mContext, R.anim.button_animation);  &lt;br /&gt; animBttn.setAnimation(bttnAnim);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you would like to trigger the animation we can use the startAnimation method.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; animBttn.startAnimation(bttnAnim);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;List View Animations&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This time we will use a translate animation.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;set xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;       android:interpolator="@android:anim/overshoot_interpolator" &amp;gt;  &lt;br /&gt;      &amp;lt;translate   &lt;br /&gt;           android:fromXDelta="-100%"  &lt;br /&gt;           android:toXDelta="0%"  &lt;br /&gt;           android:duration="500"&amp;gt;  &lt;br /&gt;      &amp;lt;/translate&amp;gt;  &lt;br /&gt; &amp;lt;/set&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In order to apply this animation to individual list view items we must also create a layoutAnimation xml file.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"   &lt;br /&gt;                  android:animation="@anim/listitem_animation"/&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;To attach the animation to the ListView we will use the setLayoutAnimation method.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; ListView lv = (ListView)findViewById(R.id.ExampleList);  &lt;br /&gt; lv.setAdapter(new ArrayAdapter&amp;lt;String&amp;gt;(this, R.layout.listitem, PLANETS));  &lt;br /&gt;       &lt;br /&gt; //We need to load a LayoutAnimation instead of just an Animation   &lt;br /&gt; //to set the animation for each individual list item  &lt;br /&gt; LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(mContext,R.anim.list_layoutcontroller);  &lt;br /&gt; //This is the delay between each animation as a fraction of the animation duration  &lt;br /&gt; controller.setDelay(0.25f);  &lt;br /&gt; //Be sure to set the LayoutAnimation, using setAnimation will set the animation for the entire listview  &lt;br /&gt; lv.setLayoutAnimation(controller);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-2210768562870743838?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/2210768562870743838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/2210768562870743838'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/07/android-animations.html' title='Android - Animations'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-1264468866867103575</id><published>2011-07-07T08:30:00.000-07:00</published><updated>2011-07-07T08:32:20.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ImageView'/><category scheme='http://www.blogger.com/atom/ns#' term='Bitmaps'/><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leaks'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Drawables'/><title type='text'>java.lang.OutOfMemoryError: bitmap size exceeds VM</title><content type='html'>Recently while working on an Android app I started running into this error:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#FF0000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#FF0000;word-wrap:normal;"&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429): FATAL EXCEPTION: main  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429): java.lang.OutOfMemoryError: bitmap size exceeds VM budget  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:309)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.graphics.drawable.Drawable.createFromPath(Drawable.java:800)    &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.ActivityThread.access$1500(ActivityThread.java:117)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.os.Handler.dispatchMessage(Handler.java:99)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.os.Looper.loop(Looper.java:130)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at android.app.ActivityThread.main(ActivityThread.java:3683)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at java.lang.reflect.Method.invokeNative(Native Method)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at java.lang.reflect.Method.invoke(Method.java:507)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)  &lt;br /&gt; 07-07 10:59:14.519: ERROR/AndroidRuntime(20429):   at dalvik.system.NativeStart.main(Native Method)  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This error was stemming from the large bitmaps I was switching out between activities.  When I monitored the Heap Size for my app in the DDMS I was always well under the 16MB cap when the error occurred.  I started manually running the garbage collector and even started scaling down my images to no avail.  I found that this issue had been reported &lt;a href="http://code.google.com/p/android/issues/detail?id=8488"&gt;(Issue 8488)&lt;/a&gt; and promptly declined.  In the bug report comments you can see that this issue is highly debated whether this is a bug or working as expected.  &lt;br /&gt;&lt;br /&gt;The best explanation I could find was that the Dalvik heap is used for your Java memory allocations and the Native heap is used for other things like your bitmaps.  The DDMS is only reporting the Dalvik heap size. So when switching between activities and setting a new bitmap to an ImageView source I was inflating the total heap size beyond the cap.  I was never nulling out the ImageView source references therefore eventually running out of memory.&lt;br /&gt;&lt;br /&gt;I also found a nice &lt;a href="http://code.google.com/p/android/issues/detail?id=8488#c51"&gt;solution &lt;/a&gt;in the comments for this issue.  Here is a "BetterActivity" class that extends Activity.  This handles nulling out all of the ImageViews to release the memory and running the garbage collector.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:500px;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;1:  import android.app.Activity;  &lt;br /&gt;2:  import android.view.LayoutInflater;  &lt;br /&gt;3:  import android.view.View;  &lt;br /&gt;4:  import android.view.ViewGroup;  &lt;br /&gt;5:  import android.view.ViewGroup.LayoutParams;  &lt;br /&gt;6:  import android.widget.ImageView;  &lt;br /&gt;7:    &lt;br /&gt;8:  public abstract class BetterActivity extends Activity  &lt;br /&gt;9:  {  &lt;br /&gt;10:        private ViewGroup mContentView = null;  &lt;br /&gt;11:          &lt;br /&gt;12:        @Override  &lt;br /&gt;13:        protected void onResume()  &lt;br /&gt;14:        {  &lt;br /&gt;15:             System.gc();  &lt;br /&gt;16:             super.onResume();  &lt;br /&gt;17:        }  &lt;br /&gt;18:     &lt;br /&gt;19:        @Override  &lt;br /&gt;20:        protected void onPause()  &lt;br /&gt;21:        {  &lt;br /&gt;22:             super.onPause();  &lt;br /&gt;23:             System.gc();  &lt;br /&gt;24:        }  &lt;br /&gt;25:     &lt;br /&gt;26:        @Override  &lt;br /&gt;27:        public void setContentView(int layoutResID)  &lt;br /&gt;28:        {  &lt;br /&gt;29:             ViewGroup mainView = (ViewGroup)LayoutInflater.from(this).inflate(layoutResID, null);  &lt;br /&gt;30:             setContentView(mainView);  &lt;br /&gt;31:        }  &lt;br /&gt;32:     &lt;br /&gt;33:        @Override  &lt;br /&gt;34:        public void setContentView(View view)  &lt;br /&gt;35:        {  &lt;br /&gt;36:             super.setContentView(view);  &lt;br /&gt;37:             mContentView = (ViewGroup)view;  &lt;br /&gt;38:        }  &lt;br /&gt;39:     &lt;br /&gt;40:        @Override  &lt;br /&gt;41:        public void setContentView(View view, LayoutParams params)  &lt;br /&gt;42:        {  &lt;br /&gt;43:             super.setContentView(view, params);  &lt;br /&gt;44:             mContentView = (ViewGroup)view;  &lt;br /&gt;45:        }  &lt;br /&gt;46:     &lt;br /&gt;47:        @Override  &lt;br /&gt;48:        protected void onDestroy()  &lt;br /&gt;49:        {  &lt;br /&gt;50:             super.onDestroy();  &lt;br /&gt;51:               &lt;br /&gt;52:             nullViewDrawablesRecursive(mContentView);  &lt;br /&gt;53:             mContentView = null;  &lt;br /&gt;54:             System.gc();  &lt;br /&gt;55:        }  &lt;br /&gt;56:     &lt;br /&gt;57:        private void nullViewDrawablesRecursive(View view)  &lt;br /&gt;58:        {  &lt;br /&gt;59:             if(view != null)  &lt;br /&gt;60:             {  &lt;br /&gt;61:               try  &lt;br /&gt;62:               {  &lt;br /&gt;63:                    ViewGroup viewGroup = (ViewGroup)view;  &lt;br /&gt;64:                      &lt;br /&gt;65:                    int childCount = viewGroup.getChildCount();  &lt;br /&gt;66:                      &lt;br /&gt;67:                    for(int index = 0; index &amp;lt; childCount; index++)  &lt;br /&gt;68:                    {  &lt;br /&gt;69:                         View child = viewGroup.getChildAt(index);  &lt;br /&gt;70:                      nullViewDrawablesRecursive(child);  &lt;br /&gt;71:                    }  &lt;br /&gt;72:               }  &lt;br /&gt;73:               catch(Exception e){}  &lt;br /&gt;74:            &lt;br /&gt;75:               nullViewDrawable(view);  &lt;br /&gt;76:             }    &lt;br /&gt;77:        }  &lt;br /&gt;78:    &lt;br /&gt;79:        private void nullViewDrawable(View view)  &lt;br /&gt;80:        {  &lt;br /&gt;81:             try  &lt;br /&gt;82:             {  &lt;br /&gt;83:                  view.setBackgroundDrawable(null);  &lt;br /&gt;84:             }  &lt;br /&gt;85:             catch(Exception e){}  &lt;br /&gt;86:               &lt;br /&gt;87:             try  &lt;br /&gt;88:             {  &lt;br /&gt;89:                  ImageView imageView = (ImageView)view;  &lt;br /&gt;90:                  imageView.setImageDrawable(null);  &lt;br /&gt;91:                  imageView.setBackgroundDrawable(null);  &lt;br /&gt;92:             }  &lt;br /&gt;93:             catch(Exception e){}  &lt;br /&gt;94:        }  &lt;br /&gt;95:  }  &lt;br /&gt;96:    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-1264468866867103575?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/1264468866867103575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/1264468866867103575'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/07/javalangoutofmemoryerror-bitmap-size.html' title='java.lang.OutOfMemoryError: bitmap size exceeds VM'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-310122274324110136</id><published>2011-05-19T11:33:00.000-07:00</published><updated>2011-05-19T11:33:20.317-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='full screen'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='title bar'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android - Full Screen App</title><content type='html'>By default an Android app has a title bar and allows the user to pull down the task bar while your app is open.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-g2XkuBxSR4U/TdVhsyrxLhI/AAAAAAAAAEk/BYbIvzgRipE/s1600/taskbar_title.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="112" src="http://4.bp.blogspot.com/-g2XkuBxSR4U/TdVhsyrxLhI/AAAAAAAAAEk/BYbIvzgRipE/s200/taskbar_title.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The following code allows you to remove the title bar and hide the task bar.  This would be your onCreate method in your activity.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; public void onCreate(Bundle savedInstanceState) {  &lt;br /&gt;        super.onCreate(savedInstanceState);  &lt;br /&gt;        //No title   &lt;br /&gt;        requestWindowFeature(Window.FEATURE_NO_TITLE);   &lt;br /&gt;        //Full screen (no task bar)  &lt;br /&gt;        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   &lt;br /&gt;        setContentView(R.layout.main);  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Result:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-OejXD6k2ZXs/TdVh32PYZGI/AAAAAAAAAEs/I0xpWpIt6nA/s1600/noTaskbar_noTitle.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="112" src="http://3.bp.blogspot.com/-OejXD6k2ZXs/TdVh32PYZGI/AAAAAAAAAEs/I0xpWpIt6nA/s200/noTaskbar_noTitle.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-310122274324110136?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/310122274324110136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/310122274324110136'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/05/android-full-screen-app.html' title='Android - Full Screen App'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-g2XkuBxSR4U/TdVhsyrxLhI/AAAAAAAAAEk/BYbIvzgRipE/s72-c/taskbar_title.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-8460130047694562222</id><published>2011-05-16T11:11:00.000-07:00</published><updated>2011-05-16T11:11:46.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ImageView'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android - ImageView scaleType Samples</title><content type='html'>I found it super frustrating when testing out the different scale types for an ImageView.  The Graphical Layout in Eclipse currently does not consistently show an accurate representation of an image in an ImageView when changing the scaleType.  The only way to know what the image was going to look like was to run the app and then decide if the current scaleType was what I was looking for. &lt;br /&gt;&lt;br /&gt;Here is a table showing samples for all scale types for the ImageView.&lt;br /&gt;&lt;br /&gt;&lt;table border=1&gt;  &lt;tbody&gt;    &lt;!-- Results table headers --&gt;    &lt;tr&gt;      &lt;th&gt;scaleType&lt;/th&gt;      &lt;th&gt;fill_parent x fill_parent&lt;/th&gt;      &lt;th&gt;200dp x 200dp&lt;/th&gt;      &lt;th&gt;200dp x 200dp&lt;br /&gt;with Overlay&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;matrix&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LLnEzgXntT4/TdFiScQRujI/AAAAAAAAABk/rYR_sAxwBQ0/s1600/fill_parent_matrix.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://2.bp.blogspot.com/-LLnEzgXntT4/TdFiScQRujI/AAAAAAAAABk/rYR_sAxwBQ0/s200/fill_parent_matrix.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-B5hOD5MXDrg/TdFiYhjn9aI/AAAAAAAAABs/gdZw2NPjmPw/s1600/matrix.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-B5hOD5MXDrg/TdFiYhjn9aI/AAAAAAAAABs/gdZw2NPjmPw/s200/matrix.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ez39efqcWxM/TdFidYWEpSI/AAAAAAAAAB0/C7oGZrL2QSo/s1600/overlay_matrix.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-ez39efqcWxM/TdFidYWEpSI/AAAAAAAAAB0/C7oGZrL2QSo/s200/overlay_matrix.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;fitXY&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-U1FGl3FaRNg/TdFiqdJ-JdI/AAAAAAAAAB8/TF-k1CCNsnI/s1600/fill_parent_fitXYpng.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://3.bp.blogspot.com/-U1FGl3FaRNg/TdFiqdJ-JdI/AAAAAAAAAB8/TF-k1CCNsnI/s200/fill_parent_fitXYpng.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pGHVPudpdz8/TdFiwd7VGnI/AAAAAAAAACE/tMPNDYw3WqE/s1600/fitXY.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://2.bp.blogspot.com/-pGHVPudpdz8/TdFiwd7VGnI/AAAAAAAAACE/tMPNDYw3WqE/s200/fitXY.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gqWLxUFa6Q0/TdFi1zaTHaI/AAAAAAAAACM/V97TZgH5br4/s1600/overlay_fitXY.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://2.bp.blogspot.com/-gqWLxUFa6Q0/TdFi1zaTHaI/AAAAAAAAACM/V97TZgH5br4/s200/overlay_fitXY.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;fitStart&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Hxyvx10QHm8/TdFi_a1qJzI/AAAAAAAAACU/GZgFf9fRCSE/s1600/fill_parent_fitstart.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://3.bp.blogspot.com/-Hxyvx10QHm8/TdFi_a1qJzI/AAAAAAAAACU/GZgFf9fRCSE/s200/fill_parent_fitstart.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-g3ZXZUwpV2Q/TdFjDy1VzpI/AAAAAAAAACc/mkcE6Dm9Wfo/s1600/fitStart.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-g3ZXZUwpV2Q/TdFjDy1VzpI/AAAAAAAAACc/mkcE6Dm9Wfo/s200/fitStart.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-eGHAmmkdoKo/TdFjJc9mhRI/AAAAAAAAACk/TH3pnS7o1F8/s1600/overlay_fitStart.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://3.bp.blogspot.com/-eGHAmmkdoKo/TdFjJc9mhRI/AAAAAAAAACk/TH3pnS7o1F8/s200/overlay_fitStart.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;fitCenter&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-G4Ps3_N4oAU/TdFjVI3VcXI/AAAAAAAAACs/KcGsn9zQpwk/s1600/fill_parent_fitCenter.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-G4Ps3_N4oAU/TdFjVI3VcXI/AAAAAAAAACs/KcGsn9zQpwk/s200/fill_parent_fitCenter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-jdHe075v420/TdFjaeXsRrI/AAAAAAAAAC0/HWSyBYNsXmg/s1600/fitCenter.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-jdHe075v420/TdFjaeXsRrI/AAAAAAAAAC0/HWSyBYNsXmg/s200/fitCenter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zrO4rr7vQ-I/TdFjfjsikxI/AAAAAAAAAC8/sdmlIjYS6O8/s1600/overlay_fitCenter.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-zrO4rr7vQ-I/TdFjfjsikxI/AAAAAAAAAC8/sdmlIjYS6O8/s200/overlay_fitCenter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;fitEnd&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jmzFvi7VPWg/TdFjrHp4ECI/AAAAAAAAADE/ho16tifSxgc/s1600/fill_parent_fitEnd.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-jmzFvi7VPWg/TdFjrHp4ECI/AAAAAAAAADE/ho16tifSxgc/s200/fill_parent_fitEnd.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eDUqH-3owd4/TdFjxbqzQjI/AAAAAAAAADM/WDQfpo8uTG8/s1600/fitEnd.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-eDUqH-3owd4/TdFjxbqzQjI/AAAAAAAAADM/WDQfpo8uTG8/s200/fitEnd.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-KtxKstmkAS4/TdFj39J-iPI/AAAAAAAAADU/ymzwW23Q3dA/s1600/overlay_fitEnd.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-KtxKstmkAS4/TdFj39J-iPI/AAAAAAAAADU/ymzwW23Q3dA/s200/overlay_fitEnd.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;center&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-j2crLGIj9S4/TdFj9CjUbRI/AAAAAAAAADc/Pav_V4etP-c/s1600/fill_parent_center.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-j2crLGIj9S4/TdFj9CjUbRI/AAAAAAAAADc/Pav_V4etP-c/s200/fill_parent_center.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WXrw_rdE_eo/TdFkBPmRqiI/AAAAAAAAADk/jGXFhlQWqWg/s1600/center.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://1.bp.blogspot.com/-WXrw_rdE_eo/TdFkBPmRqiI/AAAAAAAAADk/jGXFhlQWqWg/s200/center.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2vCi8isVR0s/TdFkLHmEx6I/AAAAAAAAADs/HzN7Cgwxpow/s1600/overlay_center.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-2vCi8isVR0s/TdFkLHmEx6I/AAAAAAAAADs/HzN7Cgwxpow/s200/overlay_center.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;centerCrop&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-h_4yRzhbsIo/TdFkZqTVKkI/AAAAAAAAAD0/orXJt4hRLNY/s1600/fill_parent_centerCrop.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://3.bp.blogspot.com/-h_4yRzhbsIo/TdFkZqTVKkI/AAAAAAAAAD0/orXJt4hRLNY/s200/fill_parent_centerCrop.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6WsksXEQBCg/TdFkgoJCVuI/AAAAAAAAAD8/lk3QOp5ainY/s1600/centerCrop.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-6WsksXEQBCg/TdFkgoJCVuI/AAAAAAAAAD8/lk3QOp5ainY/s200/centerCrop.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-u5vIs6yR1x4/TdFkolegqUI/AAAAAAAAAEE/inCWFE6h9rA/s1600/overlay_centerCrop.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://2.bp.blogspot.com/-u5vIs6yR1x4/TdFkolegqUI/AAAAAAAAAEE/inCWFE6h9rA/s200/overlay_centerCrop.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;center&gt;&lt;b&gt;centerInside&lt;/b&gt;&lt;/center&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DSq60peedII/TdFk1ctddaI/AAAAAAAAAEM/6tP2viFT22A/s1600/fill_parent_centerInside.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://2.bp.blogspot.com/-DSq60peedII/TdFk1ctddaI/AAAAAAAAAEM/6tP2viFT22A/s200/fill_parent_centerInside.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DvUT4lOAqY8/TdFk8T_XD6I/AAAAAAAAAEU/a5VUsihhtGo/s1600/centerInside.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-DvUT4lOAqY8/TdFk8T_XD6I/AAAAAAAAAEU/a5VUsihhtGo/s200/centerInside.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;      &lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cD3unqvK3T4/TdFlCuJ2SBI/AAAAAAAAAEc/kx2OEDcw21M/s1600/overlay_centerInside.png" imageanchor="1" style=""&gt;&lt;img border="0" height="200" width="120" src="http://4.bp.blogspot.com/-cD3unqvK3T4/TdFlCuJ2SBI/AAAAAAAAAEc/kx2OEDcw21M/s200/overlay_centerInside.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The column labeled "fill_parent x fill_parent" represents the following layout:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;   android:layout_width="fill_parent"  &lt;br /&gt;   android:layout_height="fill_parent"&amp;gt;  &lt;br /&gt;   &amp;lt;ImageView android:layout_width="fill_parent"  &lt;br /&gt;               android:layout_height="fill_parent"  &lt;br /&gt;               android:src="@drawable/eureka"  &lt;br /&gt;               android:scaleType="matrix"&amp;gt;  &lt;br /&gt;   &amp;lt;/ImageView&amp;gt;  &lt;br /&gt; &amp;lt;/FrameLayout&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The column labeled "200dp x 200dp" represents the following layout:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt; &amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  &lt;br /&gt;   android:layout_width="fill_parent"  &lt;br /&gt;   android:layout_height="fill_parent"&amp;gt;  &lt;br /&gt;   &amp;lt;ImageView android:layout_width="200dp"  &lt;br /&gt;               android:layout_height="200dp"  &lt;br /&gt;               android:layout_gravity="center"  &lt;br /&gt;               android:src="@drawable/eureka"  &lt;br /&gt;               android:scaleType="matrix"&amp;gt;  &lt;br /&gt;   &amp;lt;/ImageView&amp;gt;  &lt;br /&gt; &amp;lt;/FrameLayout&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Finally, the column labeled "200dp x 200dp with Overlay" represents the last layout with a 200dp by 200dp rectangle centered and overlaying the ImageView.&lt;br /&gt;&lt;br /&gt;For more info on scaleType and each type's definition check out &lt;a href="http://developer.android.com/reference/android/widget/ImageView.ScaleType.html"&gt;ImageView.ScaleType&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-8460130047694562222?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/8460130047694562222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/8460130047694562222'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/05/android-imageview-scaletype-samples.html' title='Android - ImageView scaleType Samples'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-LLnEzgXntT4/TdFiScQRujI/AAAAAAAAABk/rYR_sAxwBQ0/s72-c/fill_parent_matrix.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6648017645721515533.post-6306479952701539868</id><published>2011-05-16T07:24:00.000-07:00</published><updated>2011-05-16T07:25:49.457-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android – Styling the ProgressDialog Bar</title><content type='html'>This is the default gray and yellow progress bar:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LaSQfwmb5pE/TdEwhhICv6I/AAAAAAAAAA0/Nsmvu0bH8cg/s1600/progress_default.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="91" width="200" src="http://4.bp.blogspot.com/-LaSQfwmb5pE/TdEwhhICv6I/AAAAAAAAAA0/Nsmvu0bH8cg/s200/progress_default.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I want my progress bar to look like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-oVkscTMbtFc/TdEwqjBzT1I/AAAAAAAAAA8/Q_v8W3HTKBM/s1600/progress_style.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="91" width="200" src="http://1.bp.blogspot.com/-oVkscTMbtFc/TdEwqjBzT1I/AAAAAAAAAA8/Q_v8W3HTKBM/s200/progress_style.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Steps to accomplish this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) Create a layer list xml file in your drawable folder to hold the shapes and gradients for each part of the progress bar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;my_progress_bar.xml&lt;/i&gt;&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: 300px; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;1:  &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;  &lt;br /&gt;2:  &amp;lt;layer-list xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;  &lt;br /&gt;3:  &amp;lt;item android:id="@android:id/background"&amp;gt;  &lt;br /&gt;4:    &amp;lt;shape&amp;gt;  &lt;br /&gt;5:      &amp;lt;corners android:radius="5dip" /&amp;gt;  &lt;br /&gt;6:      &amp;lt;gradient  &lt;br /&gt;7:          android:startColor="#69A0C6"  &lt;br /&gt;8:          android:endColor="#446F8D"  &lt;br /&gt;9:          android:angle="270"/&amp;gt;  &lt;br /&gt;10:    &amp;lt;/shape&amp;gt;  &lt;br /&gt;11:  &amp;lt;/item&amp;gt;  &lt;br /&gt;12:  &amp;lt;item android:id="@android:id/secondaryProgress"&amp;gt;  &lt;br /&gt;13:    &amp;lt;clip&amp;gt;  &lt;br /&gt;14:      &amp;lt;shape&amp;gt;  &lt;br /&gt;15:        &amp;lt;corners android:radius="5dip" /&amp;gt;  &lt;br /&gt;16:        &amp;lt;gradient  &lt;br /&gt;17:          android:startColor="#B963BA"  &lt;br /&gt;18:          android:endColor="#A05AA1"  &lt;br /&gt;19:          android:angle="270" /&amp;gt;  &lt;br /&gt;20:      &amp;lt;/shape&amp;gt;  &lt;br /&gt;21:    &amp;lt;/clip&amp;gt;  &lt;br /&gt;22:  &amp;lt;/item&amp;gt;  &lt;br /&gt;23:  &amp;lt;item android:id="@android:id/progress"&amp;gt;  &lt;br /&gt;24:    &amp;lt;clip&amp;gt;  &lt;br /&gt;25:      &amp;lt;shape&amp;gt;  &lt;br /&gt;26:        &amp;lt;corners  &lt;br /&gt;27:          android:radius="5dip" /&amp;gt;  &lt;br /&gt;28:        &amp;lt;gradient  &lt;br /&gt;29:          android:startColor="#911793"  &lt;br /&gt;30:          android:endColor="#5B115C"  &lt;br /&gt;31:          android:angle="270" /&amp;gt;  &lt;br /&gt;32:      &amp;lt;/shape&amp;gt;  &lt;br /&gt;33:    &amp;lt;/clip&amp;gt;  &lt;br /&gt;34:  &amp;lt;/item&amp;gt;  &lt;br /&gt;35:  &amp;lt;/layer-list&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;In this example the blue color is the background and the purple is the progress.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Set the progress drawable in your Java code.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; dialog.setProgressDrawable(c.getResources().getDrawable(R.drawable.my_progress_bar));  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648017645721515533-6306479952701539868?l=etcodehome.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/6306479952701539868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648017645721515533/posts/default/6306479952701539868'/><link rel='alternate' type='text/html' href='http://etcodehome.blogspot.com/2011/05/android-styling-progressdialog-bar_16.html' title='Android – Styling the ProgressDialog Bar'/><author><name>E.T.</name><uri>http://www.blogger.com/profile/16437969546544041424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LaSQfwmb5pE/TdEwhhICv6I/AAAAAAAAAA0/Nsmvu0bH8cg/s72-c/progress_default.png' height='72' width='72'/></entry></feed>
