<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DkMBRXczeyp7ImA9WhVREUQ.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004</id><updated>2012-03-19T15:00:54.983-07:00</updated><title>Android Coding</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Android Er</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_C5a2qH8Y_jk/SndkX0GrLYI/AAAAAAAAAAM/r1XMHvATAI8/S220/Android.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>220</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AndroidCoding" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="androidcoding" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DkQFRn8zfCp7ImA9WhVREUQ.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-2468588795338246103</id><published>2012-03-19T14:57:00.002-07:00</published><updated>2012-03-19T14:58:37.184-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T14:58:37.184-07:00</app:edited><title>Touch to move Bitmap inside a custom View</title><content type="html">Refer to the article &lt;a href="http://android-coding.blogspot.com/2011/04/detect-touch-event-test-on-custom-view.html"&gt;Detect Touch Event, test on Custom View&lt;/a&gt;. Modify to add a Bitmap in the custom view, if user touch the View over the bitmap, it will be moved accordingly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-Lh1rlVdtsO0/T2er2JG3m4I/AAAAAAAAAhg/tu-1GnXb7aM/s1600/SingleTouch_Move_Bitmap.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-Lh1rlVdtsO0/T2er2JG3m4I/AAAAAAAAAhg/tu-1GnXb7aM/s400/SingleTouch_Move_Bitmap.png" border="0" alt="Touch to move Bitmap inside a custom View" title="Touch to move Bitmap inside a custom View" id="BLOGGER_PHOTO_ID_5721730798243519362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.TestSingleTouch;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;import android.view.View;&lt;br /&gt;&lt;br /&gt;public class TestSingleTouch extends Activity {&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public class TouchView extends View {&lt;br /&gt;  &lt;br /&gt;  private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);&lt;br /&gt;  private float x, y;&lt;br /&gt;  boolean touching = false;&lt;br /&gt;  &lt;br /&gt;  Bitmap bm = BitmapFactory.decodeResource(&lt;br /&gt;      getResources(),&lt;br /&gt;      R.drawable.ic_launcher);&lt;br /&gt;  int bm_x = 0;&lt;br /&gt;  int bm_y = 0;&lt;br /&gt;  int bm_w = bm.getWidth();&lt;br /&gt;  int bm_h = bm.getHeight();&lt;br /&gt;  int bm_offsetx;&lt;br /&gt;  int bm_offsety;&lt;br /&gt;  boolean dm_touched = false;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  public TouchView(Context context) {&lt;br /&gt;   &lt;br /&gt;   super(context);&lt;br /&gt;   // TODO Auto-generated constructor stub &lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  protected void onDraw(Canvas canvas) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   paint.setStyle(Paint.Style.STROKE);&lt;br /&gt;   paint.setStrokeWidth(1);&lt;br /&gt;   paint.setColor(Color.WHITE);&lt;br /&gt;   &lt;br /&gt;   if(touching){&lt;br /&gt;    canvas.drawRect(x, y, x+bm_w, y+bm_h, paint);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   canvas.drawBitmap(bm, bm_x, bm_y, paint);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),&lt;br /&gt;     MeasureSpec.getSize(heightMeasureSpec)); &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  &lt;br /&gt;  public boolean onTouchEvent(MotionEvent event) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   int action = event.getAction();&lt;br /&gt;   switch(action){&lt;br /&gt;   case MotionEvent.ACTION_MOVE:&lt;br /&gt;    x = event.getX();&lt;br /&gt;    y = event.getY();&lt;br /&gt;    touching = true;&lt;br /&gt;&lt;br /&gt;    if(dm_touched){&lt;br /&gt;     bm_x = (int)x - bm_offsetx;&lt;br /&gt;     bm_y = (int)y - bm_offsety;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    break; &lt;br /&gt;   case MotionEvent.ACTION_DOWN:&lt;br /&gt;    x = event.getX();&lt;br /&gt;    y = event.getY();&lt;br /&gt;    touching = true;&lt;br /&gt;    &lt;br /&gt;    //check if bm touched&lt;br /&gt;    if((x &amp;gt; bm_x)&lt;br /&gt;     &amp;amp;&amp;amp; (x &amp;lt; bm_x+bm_w)&lt;br /&gt;     &amp;amp;&amp;amp; (y &amp;gt; bm_y)&lt;br /&gt;     &amp;amp;&amp;amp; (y &amp;lt; bm_y+bm_h)){&lt;br /&gt;     bm_offsetx = (int)x - bm_x;&lt;br /&gt;     bm_offsety = (int)y - bm_y;&lt;br /&gt;     dm_touched = true;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    break; &lt;br /&gt;   case MotionEvent.ACTION_UP:&lt;br /&gt;   default:&lt;br /&gt;    dm_touched = false;&lt;br /&gt;    touching = false; &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   invalidate();&lt;br /&gt;   return true; &lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /** Called when the activity is first created. */&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  setContentView(new TouchView(this)); &lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-2468588795338246103?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bCkBGEEm5z-tR9_XiqhO90PLFpI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bCkBGEEm5z-tR9_XiqhO90PLFpI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bCkBGEEm5z-tR9_XiqhO90PLFpI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bCkBGEEm5z-tR9_XiqhO90PLFpI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/2468588795338246103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/touch-to-move-bitmap-inside-custom-view.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2468588795338246103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2468588795338246103?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/touch-to-move-bitmap-inside-custom-view.html" title="Touch to move Bitmap inside a custom View" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Lh1rlVdtsO0/T2er2JG3m4I/AAAAAAAAAhg/tu-1GnXb7aM/s72-c/SingleTouch_Move_Bitmap.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QARHw-fSp7ImA9WhVSGEo.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-8841168713048095801</id><published>2012-03-15T21:13:00.001-07:00</published><updated>2012-03-15T21:15:45.255-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-15T21:15:45.255-07:00</app:edited><title>Implement Horizontal ListView using android.widget.Gallery, with custom BaseAdapter.</title><content type="html">Refer to the article &lt;a href="http://android-coding.blogspot.com/2011/07/imaplement-photo-bar-using.html"&gt;Implement a photo bar using android.widget.Gallery, with custom BaseAdapter, and custom object&lt;/a&gt;. It can be modify to implement a Horizontal ListView, like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-HcA40Aue65E/T2K-RMVYMzI/AAAAAAAAAhU/WKBkEpFCJ7A/s1600/HorizontalListView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-HcA40Aue65E/T2K-RMVYMzI/AAAAAAAAAhU/WKBkEpFCJ7A/s400/HorizontalListView.png" border="0" alt="Our Horizontal ListView" title="Our Horizontal ListView" id="BLOGGER_PHOTO_ID_5720343679291896626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify the main java code to implement our custom BaseAdapter for Gallery.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AnHorizontalListView;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.LayoutInflater;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.view.ViewGroup;&lt;br /&gt;import android.widget.AdapterView;&lt;br /&gt;import android.widget.AdapterView.OnItemClickListener;&lt;br /&gt;import android.widget.BaseAdapter;&lt;br /&gt;import android.widget.Gallery;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;import android.widget.Toast;&lt;br /&gt;&lt;br /&gt;public class AnHorizontalListViewActivity extends Activity {&lt;br /&gt; &lt;br /&gt; Gallery myHorizontalListView;&lt;br /&gt; MyAdapter myAdapter;&lt;br /&gt; &lt;br /&gt;  /** Called when the activity is first created. */&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.main);&lt;br /&gt;      myHorizontalListView = (Gallery)findViewById(R.id.horizontallistview);&lt;br /&gt;    &lt;br /&gt;      myAdapter = new MyAdapter(this);&lt;br /&gt;      myHorizontalListView.setAdapter(myAdapter);&lt;br /&gt;    &lt;br /&gt;      myHorizontalListView.setOnItemClickListener(new OnItemClickListener(){&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void onItemClick(AdapterView&amp;lt;?&amp;gt; parent, View view, int position,&lt;br /&gt;     long id) {&lt;br /&gt;    Toast.makeText(&lt;br /&gt;      AnHorizontalListViewActivity.this,&lt;br /&gt;      parent.getItemAtPosition(position).toString() + " Clicked",&lt;br /&gt;      Toast.LENGTH_LONG)&lt;br /&gt;      .show();&lt;br /&gt;    &lt;br /&gt;   }});&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public class MyAdapter extends BaseAdapter {&lt;br /&gt;   &lt;br /&gt;   Context context;&lt;br /&gt;   &lt;br /&gt;   String[] itemsArray = {&lt;br /&gt;     "SUN","MON", "TUS", "WED", "THU", "FRI", "SAT"};&lt;br /&gt;   &lt;br /&gt;   MyAdapter(Context c){&lt;br /&gt;    context = c;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public int getCount() {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   return itemsArray.length;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object getItem(int position) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   return itemsArray[position];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public long getItemId(int position) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   return position;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;   // TODO Auto-generated method stub&lt;br /&gt;   &lt;br /&gt;   View rowView = LayoutInflater&lt;br /&gt;     .from(parent.getContext())&lt;br /&gt;     .inflate(R.layout.row, null);&lt;br /&gt;   TextView listTextView = (TextView)rowView.findViewById(R.id.itemtext);&lt;br /&gt;   listTextView.setText(itemsArray[position]);&lt;br /&gt;   &lt;br /&gt;   return rowView;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create /res/layout/row.xml to define the layout of individual items in Gallery.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;  android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:id="@+id/itemtext"&lt;br /&gt;      android:layout_width="wrap_content"&lt;br /&gt;      android:layout_height="wrap_content"&lt;br /&gt;      android:layout_margin="20dp"&lt;br /&gt;      android:textColor="@android:color/white"&lt;br /&gt;      android:textStyle="bold"&lt;br /&gt;      android:textSize="30sp"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Main.xml&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;  android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"&lt;br /&gt;      android:text="@string/hello" /&amp;gt;&lt;br /&gt;  &amp;lt;Gallery&lt;br /&gt;      android:id="@+id/horizontallistview"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-8841168713048095801?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UkURW3RuhYLxHEQVXiQPTufa7RA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UkURW3RuhYLxHEQVXiQPTufa7RA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UkURW3RuhYLxHEQVXiQPTufa7RA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UkURW3RuhYLxHEQVXiQPTufa7RA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/8841168713048095801/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/implement-horizontal-listview-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8841168713048095801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8841168713048095801?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/implement-horizontal-listview-using.html" title="Implement Horizontal ListView using android.widget.Gallery, with custom BaseAdapter." /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-HcA40Aue65E/T2K-RMVYMzI/AAAAAAAAAhU/WKBkEpFCJ7A/s72-c/HorizontalListView.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkENRn04eyp7ImA9WhVSGEw.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-8032039764094994184</id><published>2012-03-15T06:36:00.003-07:00</published><updated>2012-03-15T06:38:17.333-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-15T06:38:17.333-07:00</app:edited><title>Dual VideoView to play 3gp from YouTube</title><content type="html">It's a simple example to include two VideoView in layout to play differnece 3gp from YouTube at the same time.&lt;br /&gt;&lt;br /&gt;Reference: &lt;a href="http://android-coding.blogspot.com/2011/03/simple-example-using-videoview-to-play.html"&gt;A simple example using VideoView to play 3gp from YouTube&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-QkrZFYeLqFE/T2Hwdtqn9QI/AAAAAAAAAhI/NydT4ZQz_tg/s1600/AnVideoView_DualScreen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-QkrZFYeLqFE/T2Hwdtqn9QI/AAAAAAAAAhI/NydT4ZQz_tg/s400/AnVideoView_DualScreen.png" border="0" alt="Dual VideoView to play 3gp from YouTube" title="Dual VideoView to play 3gp from YouTube" id="BLOGGER_PHOTO_ID_5720117395002488066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Main Layout:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;    android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:text="@string/hello" /&amp;gt;&lt;br /&gt;    &amp;lt;LinearLayout&lt;br /&gt;        android:orientation="vertical"&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="match_parent"&amp;gt;&lt;br /&gt;        &amp;lt;VideoView&lt;br /&gt;            android:id="@+id/myvideoview"&lt;br /&gt;            android:layout_width="fill_parent"&lt;br /&gt;            android:layout_height="wrap_content" /&amp;gt;&lt;br /&gt;        &amp;lt;VideoView&lt;br /&gt;            android:id="@+id/myvideoview2"&lt;br /&gt;            android:layout_width="fill_parent"&lt;br /&gt;            android:layout_height="wrap_content" /&amp;gt;&lt;br /&gt;    &amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Main Code:&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AnVideoView;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.net.Uri;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.MediaController;&lt;br /&gt;import android.widget.VideoView;&lt;br /&gt;&lt;br /&gt;public class AnVideoView extends Activity {&lt;br /&gt; &lt;br /&gt; String SrcPath = "rtsp://v5.cache1.c.youtube.com/CjYLENy73wIaLQnhycnrJQ8qmRMYESARFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPj_hYjnq6uUTQw=/0/0/0/video.3gp";&lt;br /&gt; String SrcPath2 = "rtsp://v2.cache7.c.youtube.com/CjYLENy73wIaLQk4RDShYkdS1BMYJCAkFEIJbXYtZ29vZ2xlSARSBXdhdGNoYKjR78WV1ZH5Tgw=/0/0/0/video.3gp";&lt;br /&gt; &lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        VideoView myVideoView = (VideoView)findViewById(R.id.myvideoview);&lt;br /&gt;        myVideoView.setVideoURI(Uri.parse(SrcPath));&lt;br /&gt;        myVideoView.setMediaController(new MediaController(this));&lt;br /&gt;        myVideoView.requestFocus();&lt;br /&gt;        myVideoView.start();&lt;br /&gt;        &lt;br /&gt;        VideoView myVideoView2 = (VideoView)findViewById(R.id.myvideoview2);&lt;br /&gt;        myVideoView2.setVideoURI(Uri.parse(SrcPath2));&lt;br /&gt;        myVideoView2.setMediaController(new MediaController(this));&lt;br /&gt;        myVideoView2.requestFocus();&lt;br /&gt;        myVideoView2.start();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-8032039764094994184?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ax-YnKbrGIfy97RM5Qi1xFKA-js/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ax-YnKbrGIfy97RM5Qi1xFKA-js/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ax-YnKbrGIfy97RM5Qi1xFKA-js/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ax-YnKbrGIfy97RM5Qi1xFKA-js/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/8032039764094994184/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/dual-videoview-to-play-3gp-from-youtube.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8032039764094994184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8032039764094994184?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/dual-videoview-to-play-3gp-from-youtube.html" title="Dual VideoView to play 3gp from YouTube" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-QkrZFYeLqFE/T2Hwdtqn9QI/AAAAAAAAAhI/NydT4ZQz_tg/s72-c/AnVideoView_DualScreen.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08FRnwycCp7ImA9WhVSFUU.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-4763820982593067982</id><published>2012-03-12T15:01:00.003-07:00</published><updated>2012-03-12T15:03:37.298-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-12T15:03:37.298-07:00</app:edited><title>Create our Android Compass</title><content type="html">Base on last post "&lt;a href="http://android-coding.blogspot.com/2012/03/detect-orientation-using-accelerometer.html"&gt;Detect Orientation using Accelerometer and Magnetic Field sensors&lt;/a&gt;", a Android compass is implemented here. In the implementation, the final result (base on Accelerometer and Magnetic Field sensors) is show in RED, point to the north.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-sKsSDPElb40/T15yezNyIGI/AAAAAAAAAg8/xJvsONwnslw/s1600/Compass.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://2.bp.blogspot.com/-sKsSDPElb40/T15yezNyIGI/AAAAAAAAAg8/xJvsONwnslw/s400/Compass.png" border="0" alt="our Android Compass" title="our Android Compass" id="BLOGGER_PHOTO_ID_5719134450276769890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a custom View, Compass, extends View. The method update() is called from onSensorChanged() of main activity, with the updated direction.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidDetOrientation;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;import android.view.View;&lt;br /&gt;&lt;br /&gt;public class Compass extends View {&lt;br /&gt;&lt;br /&gt; private float direction;&lt;br /&gt; &lt;br /&gt; public Compass(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Compass(Context context, AttributeSet attrs) {&lt;br /&gt;  super(context, attrs);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Compass(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {&lt;br /&gt;  setMeasuredDimension(&lt;br /&gt;    MeasureSpec.getSize(widthMeasureSpec),&lt;br /&gt;    MeasureSpec.getSize(heightMeasureSpec));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  &lt;br /&gt;  int w = getMeasuredWidth();&lt;br /&gt;  int h = getMeasuredHeight();&lt;br /&gt;  int r;&lt;br /&gt;  if(w &amp;gt; h){&lt;br /&gt;   r = h/2;&lt;br /&gt;  }else{&lt;br /&gt;   r = w/2;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);&lt;br /&gt;  paint.setStyle(Paint.Style.STROKE);&lt;br /&gt;  paint.setStrokeWidth(5);&lt;br /&gt;  paint.setColor(Color.WHITE);&lt;br /&gt;  &lt;br /&gt;  canvas.drawCircle(w/2, h/2, r, paint);&lt;br /&gt;  &lt;br /&gt;  paint.setColor(Color.RED);&lt;br /&gt;  canvas.drawLine(&lt;br /&gt;    w/2,&lt;br /&gt;    h/2,&lt;br /&gt;    (float)(w/2 + r * Math.sin(-direction)),&lt;br /&gt;    (float)(h/2 - r * Math.cos(-direction)),&lt;br /&gt;    paint);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void update(float dir){&lt;br /&gt;  direction = dir;&lt;br /&gt;  invalidate();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main activity, AndroidDetOrientationActivity, to update Compass.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidDetOrientation;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.hardware.Sensor;&lt;br /&gt;import android.hardware.SensorEvent;&lt;br /&gt;import android.hardware.SensorEventListener;&lt;br /&gt;import android.hardware.SensorManager;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;public class AndroidDetOrientationActivity extends Activity&lt;br /&gt; implements SensorEventListener{&lt;br /&gt; &lt;br /&gt; SensorManager sensorManager;&lt;br /&gt; private Sensor sensorAccelerometer;&lt;br /&gt; private Sensor sensorMagneticField;&lt;br /&gt; &lt;br /&gt; private float[] valuesAccelerometer;&lt;br /&gt; private float[] valuesMagneticField;&lt;br /&gt; &lt;br /&gt; private float[] matrixR;&lt;br /&gt; private float[] matrixI;&lt;br /&gt; private float[] matrixValues;&lt;br /&gt; &lt;br /&gt; TextView readingAzimuth, readingPitch, readingRoll;&lt;br /&gt; Compass myCompass;&lt;br /&gt; &lt;br /&gt;  /** Called when the activity is first created. */&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.main);&lt;br /&gt;      readingAzimuth = (TextView)findViewById(R.id.azimuth);&lt;br /&gt;      readingPitch = (TextView)findViewById(R.id.pitch);&lt;br /&gt;      readingRoll = (TextView)findViewById(R.id.roll);&lt;br /&gt;    &lt;br /&gt;      myCompass = (Compass)findViewById(R.id.mycompass);&lt;br /&gt;    &lt;br /&gt;      sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);&lt;br /&gt;      sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);&lt;br /&gt;   sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);&lt;br /&gt;    &lt;br /&gt;   valuesAccelerometer = new float[3];&lt;br /&gt;   valuesMagneticField = new float[3];&lt;br /&gt;&lt;br /&gt;   matrixR = new float[9];&lt;br /&gt;   matrixI = new float[9];&lt;br /&gt;   matrixValues = new float[3];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;&lt;br /&gt;  sensorManager.registerListener(this,&lt;br /&gt;    sensorAccelerometer,&lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt;  sensorManager.registerListener(this,&lt;br /&gt;    sensorMagneticField,&lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt;  super.onResume();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;&lt;br /&gt;  sensorManager.unregisterListener(this,&lt;br /&gt;    sensorAccelerometer);&lt;br /&gt;  sensorManager.unregisterListener(this,&lt;br /&gt;    sensorMagneticField);&lt;br /&gt;  super.onPause();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onAccuracyChanged(Sensor arg0, int arg1) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSensorChanged(SensorEvent event) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt;  switch(event.sensor.getType()){&lt;br /&gt;  case Sensor.TYPE_ACCELEROMETER:&lt;br /&gt;   for(int i =0; i &amp;lt; 3; i++){&lt;br /&gt;    valuesAccelerometer[i] = event.values[i];&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  case Sensor.TYPE_MAGNETIC_FIELD:&lt;br /&gt;   for(int i =0; i &amp;lt; 3; i++){&lt;br /&gt;    valuesMagneticField[i] = event.values[i];&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  boolean success = SensorManager.getRotationMatrix(&lt;br /&gt;       matrixR,&lt;br /&gt;       matrixI,&lt;br /&gt;       valuesAccelerometer,&lt;br /&gt;       valuesMagneticField);&lt;br /&gt;  &lt;br /&gt;  if(success){&lt;br /&gt;   SensorManager.getOrientation(matrixR, matrixValues);&lt;br /&gt;   &lt;br /&gt;   double azimuth = Math.toDegrees(matrixValues[0]);&lt;br /&gt;   double pitch = Math.toDegrees(matrixValues[1]);&lt;br /&gt;   double roll = Math.toDegrees(matrixValues[2]);&lt;br /&gt;   &lt;br /&gt;   readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));&lt;br /&gt;   readingPitch.setText("Pitch: " + String.valueOf(pitch));&lt;br /&gt;   readingRoll.setText("Roll: " + String.valueOf(roll));&lt;br /&gt;   &lt;br /&gt;   myCompass.update(matrixValues[0]);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml to add a View of Compass.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;  android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"&lt;br /&gt;      android:text="@string/hello" /&amp;gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:id="@+id/azimuth"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:id="@+id/pitch"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:id="@+id/roll"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;  &amp;lt;view&lt;br /&gt;      class="com.AndroidDetOrientation.Compass"&lt;br /&gt;      android:id="@+id/mycompass"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="fill_parent"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-4763820982593067982?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_Uf7tWRLDmpIAmYDmMzxsLWARBE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Uf7tWRLDmpIAmYDmMzxsLWARBE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_Uf7tWRLDmpIAmYDmMzxsLWARBE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Uf7tWRLDmpIAmYDmMzxsLWARBE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/4763820982593067982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/create-our-android-compass.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4763820982593067982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4763820982593067982?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/create-our-android-compass.html" title="Create our Android Compass" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-sKsSDPElb40/T15yezNyIGI/AAAAAAAAAg8/xJvsONwnslw/s72-c/Compass.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08MRXg-fyp7ImA9WhVSFUU.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-8599417344665048429</id><published>2012-03-11T16:44:00.004-07:00</published><updated>2012-03-12T15:04:44.657-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-12T15:04:44.657-07:00</app:edited><title>Detect Orientation using Accelerometer and Magnetic Field sensors</title><content type="html">The post &lt;a href="http://android-coding.blogspot.com/2012/02/detect-android-device-rotation-using.html"&gt;Detect Android device rotation, using Accelerometer sensor&lt;/a&gt; base on accelerometer only. It is another method to obtain it using both Accelerometer and Magnetic Field sensors together.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-6ZVFli7rjQ8/T105Wi5gjJI/AAAAAAAAAgw/PZt5C8s4LXQ/s1600/AndroidDetOrientation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://2.bp.blogspot.com/-6ZVFli7rjQ8/T105Wi5gjJI/AAAAAAAAAgw/PZt5C8s4LXQ/s400/AndroidDetOrientation.png" border="0" alt="Detect Orientation using Accelerometer and Magnetic Field sensors" title="Detect Orientation using Accelerometer and Magnetic Field sensors" id="BLOGGER_PHOTO_ID_5718790161318317202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidDetOrientation;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.hardware.Sensor;&lt;br /&gt;import android.hardware.SensorEvent;&lt;br /&gt;import android.hardware.SensorEventListener;&lt;br /&gt;import android.hardware.SensorManager;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;public class AndroidDetOrientationActivity extends Activity &lt;br /&gt; implements SensorEventListener{&lt;br /&gt; &lt;br /&gt; SensorManager sensorManager;&lt;br /&gt; private Sensor sensorAccelerometer;&lt;br /&gt; private Sensor sensorMagneticField;&lt;br /&gt; &lt;br /&gt; private float[] valuesAccelerometer;&lt;br /&gt; private float[] valuesMagneticField;&lt;br /&gt; &lt;br /&gt; private float[] matrixR;&lt;br /&gt; private float[] matrixI;&lt;br /&gt; private float[] matrixValues;&lt;br /&gt; &lt;br /&gt; TextView readingAzimuth, readingPitch, readingRoll;&lt;br /&gt; &lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        readingAzimuth = (TextView)findViewById(R.id.azimuth);&lt;br /&gt;        readingPitch = (TextView)findViewById(R.id.pitch);&lt;br /&gt;        readingRoll = (TextView)findViewById(R.id.roll);&lt;br /&gt;        &lt;br /&gt;        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);&lt;br /&gt;        sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);&lt;br /&gt;     sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);&lt;br /&gt;        &lt;br /&gt;     valuesAccelerometer = new float[3];&lt;br /&gt;     valuesMagneticField = new float[3];&lt;br /&gt;     &lt;br /&gt;     matrixR = new float[9];&lt;br /&gt;     matrixI = new float[9];&lt;br /&gt;     matrixValues = new float[3];&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;&lt;br /&gt;  sensorManager.registerListener(this, &lt;br /&gt;    sensorAccelerometer, &lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt;  sensorManager.registerListener(this, &lt;br /&gt;    sensorMagneticField, &lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt;  super.onResume();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;&lt;br /&gt;  sensorManager.unregisterListener(this, &lt;br /&gt;    sensorAccelerometer);&lt;br /&gt;  sensorManager.unregisterListener(this, &lt;br /&gt;    sensorMagneticField);&lt;br /&gt;  super.onPause();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onAccuracyChanged(Sensor arg0, int arg1) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSensorChanged(SensorEvent event) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt;  switch(event.sensor.getType()){&lt;br /&gt;  case Sensor.TYPE_ACCELEROMETER:&lt;br /&gt;   for(int i =0; i &amp;lt; 3; i++){&lt;br /&gt;    valuesAccelerometer[i] = event.values[i];&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  case Sensor.TYPE_MAGNETIC_FIELD:&lt;br /&gt;   for(int i =0; i &amp;lt; 3; i++){&lt;br /&gt;    valuesMagneticField[i] = event.values[i];&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  boolean success = SensorManager.getRotationMatrix(&lt;br /&gt;       matrixR, &lt;br /&gt;       matrixI, &lt;br /&gt;       valuesAccelerometer, &lt;br /&gt;       valuesMagneticField);&lt;br /&gt;  &lt;br /&gt;  if(success){&lt;br /&gt;   SensorManager.getOrientation(matrixR, matrixValues);&lt;br /&gt;   &lt;br /&gt;   double azimuth = Math.toDegrees(matrixValues[0]);&lt;br /&gt;   double pitch = Math.toDegrees(matrixValues[1]);&lt;br /&gt;   double roll = Math.toDegrees(matrixValues[2]);&lt;br /&gt;   &lt;br /&gt;   readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));&lt;br /&gt;   readingPitch.setText("Pitch: " + String.valueOf(pitch));&lt;br /&gt;   readingRoll.setText("Roll: " + String.valueOf(roll));&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;    android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:text="@string/hello" /&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/azimuth" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/pitch" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/roll" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Next&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/03/create-our-android-compass.html"&gt;Create our Android Compass&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-8599417344665048429?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3cdck4pBk4GkfPlBCFJQHgg90Nk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3cdck4pBk4GkfPlBCFJQHgg90Nk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3cdck4pBk4GkfPlBCFJQHgg90Nk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3cdck4pBk4GkfPlBCFJQHgg90Nk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/8599417344665048429/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/detect-orientation-using-accelerometer.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8599417344665048429?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8599417344665048429?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/detect-orientation-using-accelerometer.html" title="Detect Orientation using Accelerometer and Magnetic Field sensors" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6ZVFli7rjQ8/T105Wi5gjJI/AAAAAAAAAgw/PZt5C8s4LXQ/s72-c/AndroidDetOrientation.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkIGRX09eSp7ImA9WhVSEU8.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5002002089896129852</id><published>2012-03-07T05:52:00.002-08:00</published><updated>2012-03-07T05:55:24.361-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T05:55:24.361-08:00</app:edited><title>SurfaceView Game step-by-step: react device movement/orientation using accelerometer</title><content type="html">With the help of accelerometer on Android device(&lt;a href="http://android-coding.blogspot.com/2012/03/get-detail-info-of-accelerometer.html"&gt;Get detail info of Accelerometer&lt;/a&gt;), we can react device movement/orientation for our SurfaceView Game(&lt;a href="http://android-coding.blogspot.com/2012/02/implement-ontouchevent-to-handle-user.html"&gt;Implement onTouchEvent() to handle user touch on SurfaceView&lt;/a&gt;). After finished, the the Sprite will move once user move the device.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-YlVD8iOPKMM/T1dofC_ZoAI/AAAAAAAAAgk/VklCFhpJIas/s1600/MyGame_Accelerometer.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://3.bp.blogspot.com/-YlVD8iOPKMM/T1dofC_ZoAI/AAAAAAAAAgk/VklCFhpJIas/s400/MyGame_Accelerometer.png" border="0" alt="SurfaceView Game step-by-step: react device movement/orientation using accelerometer" title="SurfaceView Game step-by-step: react device movement/orientation using accelerometer" id="BLOGGER_PHOTO_ID_5717153134558158850" /&gt;&lt;/a&gt;&lt;br /&gt;Implement new class - MyAccelerometer.java.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.hardware.Sensor;&lt;br /&gt;import android.hardware.SensorEvent;&lt;br /&gt;import android.hardware.SensorEventListener;&lt;br /&gt;import android.hardware.SensorManager;&lt;br /&gt;&lt;br /&gt;public class MyAccelerometer implements SensorEventListener{&lt;br /&gt;&lt;br /&gt; private SensorManager sensorManager;&lt;br /&gt; private Sensor sensorAccelerometer;&lt;br /&gt; private MyGameActivity parent;&lt;br /&gt; &lt;br /&gt; private float maximumRange;&lt;br /&gt; &lt;br /&gt; public MyAccelerometer(Context c) {&lt;br /&gt;  parent = (MyGameActivity)c;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; void registerListener(){&lt;br /&gt;  sensorManager = (SensorManager)parent.getSystemService(Context.SENSOR_SERVICE);&lt;br /&gt;      sensorAccelerometer = sensorManager.getDefaultSensor(&lt;br /&gt;        Sensor.TYPE_ACCELEROMETER);&lt;br /&gt;    &lt;br /&gt;      maximumRange = sensorAccelerometer.getMaximumRange();&lt;br /&gt;    &lt;br /&gt;  sensorManager.registerListener(this,&lt;br /&gt;    sensorAccelerometer,&lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; void unregisterListener(){&lt;br /&gt;  sensorManager.unregisterListener(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onAccuracyChanged(Sensor sensor, int accuracy) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSensorChanged(SensorEvent event) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  /*&lt;br /&gt;   * event.values[0]: azimuth, rotation around the Z axis.&lt;br /&gt;   * event.values[1]: pitch, rotation around the X axis.&lt;br /&gt;   * event.values[2]: roll, rotation around the Y axis.&lt;br /&gt;   */&lt;br /&gt;  &lt;br /&gt;  float valueAzimuth = event.values[0];&lt;br /&gt;  float valuePitch = event.values[1];&lt;br /&gt;  &lt;br /&gt;  parent.updateAccelerometer(&lt;br /&gt;    valueAzimuth/maximumRange, -valuePitch/maximumRange);&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify MyGameActivity.java to instance MyAccelerometer object in onCreate(), init it in onResume(), unregisterListener it in onPause(), and also implement updateAccelerometer().&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.graphics.PixelFormat;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;&lt;br /&gt;public class MyGameActivity extends Activity {&lt;br /&gt; &lt;br /&gt; MyGameSurfaceView myGameSurfaceView1;&lt;br /&gt; MyForeground myForeground;&lt;br /&gt; &lt;br /&gt; MyAccelerometer myAccelerometer;&lt;br /&gt; &lt;br /&gt;  /** Called when the activity is first created. */&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.main);&lt;br /&gt;      myGameSurfaceView1 = (MyGameSurfaceView)findViewById(R.id.myview1);&lt;br /&gt;      myForeground = (MyForeground)findViewById(R.id.myforeground);&lt;br /&gt;    &lt;br /&gt;      //Set myForeground using transparent background&lt;br /&gt;      myForeground.setZOrderOnTop(true);&lt;br /&gt;      myForeground.getHolder().setFormat(PixelFormat.TRANSPARENT);&lt;br /&gt;    &lt;br /&gt;      myAccelerometer = new MyAccelerometer(this);&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  super.onResume();&lt;br /&gt;  myGameSurfaceView1.MyGameSurfaceView_OnResume();&lt;br /&gt;  myForeground.MyGameSurfaceView_OnResume();&lt;br /&gt;  &lt;br /&gt;  myAccelerometer.registerListener();&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  super.onPause();&lt;br /&gt;  myGameSurfaceView1.MyGameSurfaceView_OnPause();&lt;br /&gt;  myForeground.MyGameSurfaceView_OnPause();&lt;br /&gt;  &lt;br /&gt;  myAccelerometer.unregisterListener();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; void updateAccelerometer(float tx, float ty){&lt;br /&gt;  int w = myForeground.getWidth();&lt;br /&gt;  int h = myForeground.getHeight();&lt;br /&gt;  &lt;br /&gt;  float x = ((w/2) * tx) + (w/2);&lt;br /&gt;  float y = ((h/2) * ty) + (h/2);&lt;br /&gt;  myForeground.updateAccelerometer(x, y);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Update MyForeground.java.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.PorterDuff.Mode;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;&lt;br /&gt;public class MyForeground extends MyGameSurfaceView {&lt;br /&gt; &lt;br /&gt; Sprite mySprite;&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs) {&lt;br /&gt;  super(context, attrs);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void init(){&lt;br /&gt;  mySprite = new Sprite(&lt;br /&gt;    BitmapFactory.decodeResource(getResources(), R.drawable.icon_me),&lt;br /&gt;    100, 100);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  //Clear Canvas with transparent background&lt;br /&gt;  canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);&lt;br /&gt;  &lt;br /&gt;  mySprite.draw(canvas);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void updateStates() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  mySprite.update();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; void updateAccelerometer(float tx, float ty){&lt;br /&gt;  mySprite.setX((int)tx);&lt;br /&gt;  mySprite.setY((int)ty);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Update Sprite.java to remove un-used code.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;&lt;br /&gt;public class Sprite {&lt;br /&gt; private Bitmap bitmap;&lt;br /&gt; private int x;&lt;br /&gt; private int y;&lt;br /&gt; float bitmap_halfWidth, bitmap_halfHeight;&lt;br /&gt; &lt;br /&gt; public Sprite(Bitmap bm, int tx, int ty){&lt;br /&gt;  bitmap = bm;&lt;br /&gt;  x = tx;&lt;br /&gt;  y = ty;&lt;br /&gt;  bitmap_halfWidth = bitmap.getWidth()/2;&lt;br /&gt;  bitmap_halfHeight = bitmap.getHeight()/2;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setX(int tx){&lt;br /&gt;  x = tx;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setY(int ty){&lt;br /&gt;  y = ty;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int getX(){&lt;br /&gt;  return x;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int getY(){&lt;br /&gt;  return y;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void draw(Canvas canvas){&lt;br /&gt;  canvas.drawBitmap(bitmap, x-bitmap_halfWidth, y-bitmap_halfHeight, null);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void update(){&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The code can be download here: &lt;a href="https://sites.google.com/site/helloandroidingcoding/download/MyGame_20120307.zip?attredirects=0&amp;amp;d=1"&gt;https://sites.google.com/site/helloandroidingcoding/download/MyGame_20120307.zip?attredirects=0&amp;amp;d=1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5002002089896129852?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c8wHuzGH23XV0EkIyQhzRjqxqrk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c8wHuzGH23XV0EkIyQhzRjqxqrk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c8wHuzGH23XV0EkIyQhzRjqxqrk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c8wHuzGH23XV0EkIyQhzRjqxqrk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5002002089896129852/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/surfaceview-game-step-by-step-react.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5002002089896129852?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5002002089896129852?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/surfaceview-game-step-by-step-react.html" title="SurfaceView Game step-by-step: react device movement/orientation using accelerometer" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-YlVD8iOPKMM/T1dofC_ZoAI/AAAAAAAAAgk/VklCFhpJIas/s72-c/MyGame_Accelerometer.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkEGQnY9fSp7ImA9WhVSEU8.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-6852856855460156241</id><published>2012-03-05T09:55:00.002-08:00</published><updated>2012-03-07T05:57:03.865-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T05:57:03.865-08:00</app:edited><title>Get detail info of Accelerometer</title><content type="html">&lt;a href="http://2.bp.blogspot.com/-5L6yoTrIHmU/T1T-S-zkoCI/AAAAAAAAAgY/ZevRR1fdbk4/s1600/Accelerometer_info.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://2.bp.blogspot.com/-5L6yoTrIHmU/T1T-S-zkoCI/AAAAAAAAAgY/ZevRR1fdbk4/s400/Accelerometer_info.png" border="0" alt="detail info of Accelerometer" title="detail info of Accelerometer" id="BLOGGER_PHOTO_ID_5716473429090410530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.exercise.AndroidAccelerometer;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;import android.hardware.Sensor;&lt;br /&gt;import android.hardware.SensorEvent;&lt;br /&gt;import android.hardware.SensorEventListener;&lt;br /&gt;import android.hardware.SensorManager;&lt;br /&gt;&lt;br /&gt;public class AndroidAccelerometerActivity extends Activity &lt;br /&gt; implements SensorEventListener{&lt;br /&gt; &lt;br /&gt; private SensorManager sensorManager;&lt;br /&gt; private Sensor sensorAccelerometer;&lt;br /&gt; &lt;br /&gt; TextView readingAzimuth, readingPitch, readingRoll;&lt;br /&gt; &lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        &lt;br /&gt;        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);&lt;br /&gt;        sensorAccelerometer = sensorManager.getDefaultSensor(&lt;br /&gt;          Sensor.TYPE_ACCELEROMETER);&lt;br /&gt;        &lt;br /&gt;        readingAzimuth = (TextView)findViewById(R.id.azimuth);&lt;br /&gt;        readingPitch = (TextView)findViewById(R.id.pitch);&lt;br /&gt;        readingRoll = (TextView)findViewById(R.id.roll);&lt;br /&gt;        TextView info = (TextView)findViewById(R.id.info);&lt;br /&gt;          &lt;br /&gt;        String stringInfo = "\n"&lt;br /&gt;        + "Name: " + sensorAccelerometer.getName() + "\n"&lt;br /&gt;        + "Type: " + sensorAccelerometer.getType() + "\n"&lt;br /&gt;        + "Vendor: " + sensorAccelerometer.getVendor() + "\n"&lt;br /&gt;        + "Version: " + sensorAccelerometer.getVersion() + "\n"&lt;br /&gt;        + "Class: " + sensorAccelerometer.getClass() + "\n"&lt;br /&gt;        + "Resolution: " + sensorAccelerometer.getResolution() + "\n"&lt;br /&gt;        + "MaximumRange: " + sensorAccelerometer.getMaximumRange() + "\n"&lt;br /&gt;        + "Power: " + sensorAccelerometer.getPower() + "\n";&lt;br /&gt;        &lt;br /&gt;        info.setText(stringInfo);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;  super.onPause();&lt;br /&gt;  sensorManager.unregisterListener(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;  super.onResume();&lt;br /&gt;  sensorManager.registerListener(this, &lt;br /&gt;    sensorAccelerometer, &lt;br /&gt;    SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onAccuracyChanged(Sensor arg0, int arg1) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSensorChanged(SensorEvent event) {&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * event.values[0]: azimuth, rotation around the Z axis.&lt;br /&gt;   * event.values[1]: pitch, rotation around the X axis.&lt;br /&gt;   * event.values[2]: roll, rotation around the Y axis.&lt;br /&gt;   */&lt;br /&gt;  &lt;br /&gt;  float valueAzimuth = event.values[0];&lt;br /&gt;  float valuePitch = event.values[1];&lt;br /&gt;  float valueRoll = event.values[2];&lt;br /&gt;  &lt;br /&gt;  readingAzimuth.setText("Azimuth: " + String.valueOf(valueAzimuth));&lt;br /&gt;        readingPitch.setText("Pitch: " + String.valueOf(valuePitch));&lt;br /&gt;        readingRoll.setText("Roll: " + String.valueOf(valueRoll));&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;    android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:text="@string/hello" /&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/info" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/azimuth" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/pitch" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/roll" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Related:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/03/surfaceview-game-step-by-step-react.html"&gt;SurfaceView Game step-by-step: react device movement/orientation using accelerometer&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-6852856855460156241?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5YD91vrjl2mTbG491yCgBqgcb4Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5YD91vrjl2mTbG491yCgBqgcb4Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5YD91vrjl2mTbG491yCgBqgcb4Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5YD91vrjl2mTbG491yCgBqgcb4Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/6852856855460156241/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/03/get-detail-info-of-accelerometer.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/6852856855460156241?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/6852856855460156241?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/03/get-detail-info-of-accelerometer.html" title="Get detail info of Accelerometer" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-5L6yoTrIHmU/T1T-S-zkoCI/AAAAAAAAAgY/ZevRR1fdbk4/s72-c/Accelerometer_info.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08FSH85fip7ImA9WhVSFU0.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-527501929283141476</id><published>2012-02-27T09:24:00.003-08:00</published><updated>2012-03-11T16:50:19.126-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-11T16:50:19.126-07:00</app:edited><title>Detect Android device rotation, using Accelerometer sensor</title><content type="html">&lt;a href="http://2.bp.blogspot.com/-aDJCZx0rOiE/T0u9DZ-vNFI/AAAAAAAAAgM/Qu_wvAZqM00/s1600/AndroidRotation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://2.bp.blogspot.com/-aDJCZx0rOiE/T0u9DZ-vNFI/AAAAAAAAAgM/Qu_wvAZqM00/s400/AndroidRotation.png" border="0" alt="Detect Android device rotation, using Accelerometer sensor" title="Detect Android device rotation, using Accelerometer sensor" id="BLOGGER_PHOTO_ID_5713868418460890194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidRotation;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.hardware.Sensor;&lt;br /&gt;import android.hardware.SensorEvent;&lt;br /&gt;import android.hardware.SensorEventListener;&lt;br /&gt;import android.hardware.SensorManager;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;public class AndroidRotationActivity extends Activity implements SensorEventListener{&lt;br /&gt; &lt;br /&gt; private SensorManager manager;&lt;br /&gt; private Sensor sensor;&lt;br /&gt; &lt;br /&gt; TextView azimuth, pitch, roll;&lt;br /&gt; &lt;br /&gt;  /** Called when the activity is first created. */&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.main);&lt;br /&gt;    &lt;br /&gt;      manager = (SensorManager)getSystemService(SENSOR_SERVICE);&lt;br /&gt;      sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);&lt;br /&gt;    &lt;br /&gt;      azimuth = (TextView)findViewById(R.id.azimuth);&lt;br /&gt;      pitch = (TextView)findViewById(R.id.pitch);&lt;br /&gt;      roll = (TextView)findViewById(R.id.roll);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;  super.onPause();&lt;br /&gt;  manager.unregisterListener(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;  super.onResume();&lt;br /&gt;  manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onAccuracyChanged(Sensor arg0, int arg1) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSensorChanged(SensorEvent arg0) {&lt;br /&gt;  &lt;br /&gt;  azimuth.setText("Azimuth: " + String.valueOf(arg0.values[0]));&lt;br /&gt;      pitch.setText("Pitch: " + String.valueOf(arg0.values[1]));&lt;br /&gt;      roll.setText("Roll: " + String.valueOf(arg0.values[2]));&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/03/get-detail-info-of-accelerometer.html"&gt;Get detail info of Accelerometer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/03/detect-orientation-using-accelerometer.html"&gt;Detect Orientation using Accelerometer and Magnetic Field sensors&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-527501929283141476?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_giSB-WF48jEp9yJ7nhwx2SbvHI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_giSB-WF48jEp9yJ7nhwx2SbvHI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_giSB-WF48jEp9yJ7nhwx2SbvHI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_giSB-WF48jEp9yJ7nhwx2SbvHI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/527501929283141476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/02/detect-android-device-rotation-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/527501929283141476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/527501929283141476?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/02/detect-android-device-rotation-using.html" title="Detect Android device rotation, using Accelerometer sensor" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-aDJCZx0rOiE/T0u9DZ-vNFI/AAAAAAAAAgM/Qu_wvAZqM00/s72-c/AndroidRotation.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkAESXg8cSp7ImA9WhVSEU8.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5571145760068066609</id><published>2012-02-15T15:14:00.001-08:00</published><updated>2012-03-07T05:58:28.679-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T05:58:28.679-08:00</app:edited><title>Implement onTouchEvent() to handle user touch on SurfaceView</title><content type="html">Modify from last article &lt;a href="http://android-coding.blogspot.com/2012/02/sprite-auto-run.html"&gt;Sprite auto-run&lt;/a&gt;, implement onTouchEvent() to handle user touch on SurfaceView. When user touch on the screen(SurfaceView), it will call setX(x) and setY(y) of mySprite object to update its position.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.PorterDuff.Mode;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class MyForeground extends MyGameSurfaceView {&lt;br /&gt; &lt;br /&gt; Sprite mySprite;&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs) {&lt;br /&gt;  super(context, attrs);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void init(){&lt;br /&gt;  mySprite = new Sprite(&lt;br /&gt;    BitmapFactory.decodeResource(getResources(), R.drawable.icon_me),&lt;br /&gt;    100, 100);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  //Clear Canvas with transparent background&lt;br /&gt;  canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);&lt;br /&gt;  &lt;br /&gt;  mySprite.draw(canvas);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void updateStates() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  mySprite.update();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public boolean onTouchEvent(MotionEvent event) {&lt;br /&gt;  int x = (int) event.getX();&lt;br /&gt;  int y = (int) event.getY();&lt;br /&gt;  &lt;br /&gt;  int action = event.getAction();&lt;br /&gt;  switch(action){&lt;br /&gt;  case MotionEvent.ACTION_DOWN:&lt;br /&gt;   mySprite.setX(x);&lt;br /&gt;   mySprite.setY(y);&lt;br /&gt;   break;&lt;br /&gt;  case MotionEvent.ACTION_MOVE:&lt;br /&gt;   break;&lt;br /&gt;  case MotionEvent.ACTION_UP:&lt;br /&gt;   break;&lt;br /&gt;  case MotionEvent.ACTION_CANCEL:&lt;br /&gt;   break;&lt;br /&gt;  case MotionEvent.ACTION_OUTSIDE:&lt;br /&gt;   break;&lt;br /&gt;  default: &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  return true;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/03/surfaceview-game-step-by-step-react.html"&gt;React device movement/orientation using accelerometer&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5571145760068066609?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c-wkiuxCYKvhBNcLhHfjtRKGZjY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-wkiuxCYKvhBNcLhHfjtRKGZjY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c-wkiuxCYKvhBNcLhHfjtRKGZjY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-wkiuxCYKvhBNcLhHfjtRKGZjY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5571145760068066609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/02/implement-ontouchevent-to-handle-user.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5571145760068066609?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5571145760068066609?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/02/implement-ontouchevent-to-handle-user.html" title="Implement onTouchEvent() to handle user touch on SurfaceView" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkcHQX0_eyp7ImA9WhRaE0k.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-3808238725447707727</id><published>2012-02-12T08:33:00.001-08:00</published><updated>2012-02-15T15:20:30.343-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-15T15:20:30.343-08:00</app:edited><title>Sprite auto-run</title><content type="html">In last article &lt;a href="http://android-coding.blogspot.com/2012/02/introduce-sprite.html"&gt;Introduce Sprite&lt;/a&gt; without movement. In this article, we are going to make it self move.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-IeF6Rb9Nem4/Tzfp-2qQEUI/AAAAAAAAAgA/lz84ysmZCG4/s1600/Sprite%2Bauto-run.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-IeF6Rb9Nem4/Tzfp-2qQEUI/AAAAAAAAAgA/lz84ysmZCG4/s400/Sprite%2Bauto-run.png" border="0" alt="Sprite auto-run" title="Sprite auto-run" id="BLOGGER_PHOTO_ID_5708288318749282626" /&gt;&lt;/a&gt;&lt;br /&gt;Modify Sprite.java to make it self random move inside the canvas.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;&lt;br /&gt;public class Sprite {&lt;br /&gt; private Bitmap bitmap;&lt;br /&gt; private int x;&lt;br /&gt; private int y;&lt;br /&gt; float bitmap_halfWidth, bitmap_halfHeight;&lt;br /&gt; &lt;br /&gt; Random random = new Random();&lt;br /&gt; private int dirX;&lt;br /&gt; private int dirY;&lt;br /&gt; private int moveX;&lt;br /&gt; private int moveY;&lt;br /&gt; &lt;br /&gt; final int MAX = 99;&lt;br /&gt; &lt;br /&gt; public Sprite(Bitmap bm, int tx, int ty){&lt;br /&gt;  bitmap = bm;&lt;br /&gt;  x = tx;&lt;br /&gt;  y = ty;&lt;br /&gt;  bitmap_halfWidth = bitmap.getWidth()/2;&lt;br /&gt;  bitmap_halfHeight = bitmap.getHeight()/2;&lt;br /&gt;&lt;br /&gt;  if(random.nextBoolean()){&lt;br /&gt;   dirX = 1;&lt;br /&gt;  }else{&lt;br /&gt;   dirX = -1;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if(random.nextBoolean()){&lt;br /&gt;   dirY = 1;&lt;br /&gt;  }else{&lt;br /&gt;   dirY = -1;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  moveX = random.nextInt(MAX) + 1;&lt;br /&gt;  moveY = random.nextInt(MAX) + 1;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setX(int tx){&lt;br /&gt;  x = tx;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setY(int ty){&lt;br /&gt;  y = ty;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int getX(){&lt;br /&gt;  return x;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int getY(){&lt;br /&gt;  return y;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void draw(Canvas canvas){&lt;br /&gt;  &lt;br /&gt;  if(x &amp;lt; 0){&lt;br /&gt;   x = 0;&lt;br /&gt;   dirX *= -1;&lt;br /&gt;   moveX = random.nextInt(MAX) + 1;&lt;br /&gt;  }else if(x &amp;gt;= canvas.getWidth()){&lt;br /&gt;   x = canvas.getWidth();&lt;br /&gt;   dirX *= -1;&lt;br /&gt;   moveX = random.nextInt(MAX) + 1;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if(y &amp;lt; 0){&lt;br /&gt;   y = 0;&lt;br /&gt;   dirY *= -1;&lt;br /&gt;   moveY = random.nextInt(MAX) + 1;&lt;br /&gt;  }else if(y &amp;gt;= canvas.getHeight()){&lt;br /&gt;   y = canvas.getHeight();&lt;br /&gt;   dirY *= -1;&lt;br /&gt;   moveY = random.nextInt(MAX) + 1;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  canvas.drawBitmap(bitmap, x-bitmap_halfWidth, y-bitmap_halfHeight, null);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void update(){&lt;br /&gt;  x += (dirX * moveX);&lt;br /&gt;  y += (dirY * moveY);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify MyForeground.java to override updateStates(), call mySprite.update() indirectly. Also note the method onDraw(); because SurfaceView will not remove the old Sprite, so we have to clear the canvas before draw the new Sprite. TO clear canvas with TRANSPARENT background, we can call the method canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR).&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.PorterDuff.Mode;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;&lt;br /&gt;public class MyForeground extends MyGameSurfaceView {&lt;br /&gt; &lt;br /&gt; Sprite mySprite;&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs) {&lt;br /&gt;  super(context, attrs);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyForeground(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;  init();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void init(){&lt;br /&gt;  mySprite = new Sprite(&lt;br /&gt;    BitmapFactory.decodeResource(getResources(), R.drawable.icon_me),&lt;br /&gt;    100, 100);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  //Clear Canvas with transparent background&lt;br /&gt;  canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);&lt;br /&gt;  &lt;br /&gt;  mySprite.draw(canvas);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void updateStates() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  mySprite.update();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/02/implement-ontouchevent-to-handle-user.html"&gt;Implement onTouchEvent() to handle user touch on SurfaceView&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-3808238725447707727?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5Tz4w0dZxYsmU_lMxmR5FDRq2gE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Tz4w0dZxYsmU_lMxmR5FDRq2gE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5Tz4w0dZxYsmU_lMxmR5FDRq2gE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Tz4w0dZxYsmU_lMxmR5FDRq2gE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/3808238725447707727/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/02/sprite-auto-run.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/3808238725447707727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/3808238725447707727?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/02/sprite-auto-run.html" title="Sprite auto-run" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-IeF6Rb9Nem4/Tzfp-2qQEUI/AAAAAAAAAgA/lz84ysmZCG4/s72-c/Sprite%2Bauto-run.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkIDQ3o-fip7ImA9WhRaEEs.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5376361918734088825</id><published>2012-02-09T13:02:00.001-08:00</published><updated>2012-02-12T08:36:12.456-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-12T08:36:12.456-08:00</app:edited><title>Introduce Sprite</title><content type="html">&lt;a href="http://4.bp.blogspot.com/-ujaKceRIOgU/TzQ0lVHkhmI/AAAAAAAAAf0/em6cQ_oCEmI/s1600/Sprite.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://4.bp.blogspot.com/-ujaKceRIOgU/TzQ0lVHkhmI/AAAAAAAAAf0/em6cQ_oCEmI/s400/Sprite.png" border="0" alt="Sprite" title="Sprite" id="BLOGGER_PHOTO_ID_5707244443713963618" /&gt;&lt;/a&gt;&lt;br /&gt;Base on last post &lt;a href="http://android-coding.blogspot.com/2012/01/create-transparent-foreground.html"&gt;Create transparent foreground SurfaceView&lt;/a&gt;, the object on foreground was draw as a bitmap. We are going to implement a Sprite class here. Sprite object keep it's own status such as location(x, y) and bitmap, and also draw itself on canvas.&lt;br /&gt;&lt;br /&gt;Add class Sprite.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;&lt;br /&gt;public class Sprite {&lt;br /&gt;private Bitmap bitmap;&lt;br /&gt;private int x;&lt;br /&gt;private int y;&lt;br /&gt;float bitmap_halfWidth, bitmap_halfHeight;&lt;br /&gt;&lt;br /&gt;public Sprite(Bitmap bm, int tx, int ty){&lt;br /&gt; bitmap = bm;&lt;br /&gt; x = tx;&lt;br /&gt; y = ty;&lt;br /&gt; bitmap_halfWidth = bitmap.getWidth()/2;&lt;br /&gt; bitmap_halfHeight = bitmap.getHeight()/2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setX(int tx){&lt;br /&gt; x = tx;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setY(int ty){&lt;br /&gt; y = ty;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getX(){&lt;br /&gt; return x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getY(){&lt;br /&gt; return y;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void draw(Canvas canvas){&lt;br /&gt; canvas.drawBitmap(bitmap, x-bitmap_halfWidth, y-bitmap_halfHeight, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify MyForeground.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;&lt;br /&gt;public class MyForeground extends MyGameSurfaceView {&lt;br /&gt;&lt;br /&gt;Sprite mySprite;&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context) {&lt;br /&gt; super(context);&lt;br /&gt; init();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context, AttributeSet attrs) {&lt;br /&gt; super(context, attrs);&lt;br /&gt; init();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt; super(context, attrs, defStyle);&lt;br /&gt; init();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void init(){&lt;br /&gt; mySprite = new Sprite(&lt;br /&gt;   BitmapFactory.decodeResource(getResources(), R.drawable.icon_me),&lt;br /&gt;   100, 100);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onDraw(Canvas canvas) {&lt;br /&gt; mySprite.draw(canvas);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/02/sprite-auto-run.html"&gt;Sprite auto-run&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5376361918734088825?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LUsLAVb2q-Mm1v0_iBsJsOHtvpA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LUsLAVb2q-Mm1v0_iBsJsOHtvpA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LUsLAVb2q-Mm1v0_iBsJsOHtvpA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LUsLAVb2q-Mm1v0_iBsJsOHtvpA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5376361918734088825/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/02/introduce-sprite.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5376361918734088825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5376361918734088825?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/02/introduce-sprite.html" title="Introduce Sprite" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ujaKceRIOgU/TzQ0lVHkhmI/AAAAAAAAAf0/em6cQ_oCEmI/s72-c/Sprite.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMBRns4eyp7ImA9WhRUF0o.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5402331977420548004</id><published>2012-01-28T11:08:00.000-08:00</published><updated>2012-01-28T11:20:57.533-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T11:20:57.533-08:00</app:edited><title>Create transparent foreground SurfaceView</title><content type="html">Start reading here: &lt;a href="http://android-coding.blogspot.com/2012/01/create-surfaceview-game-step-by-step.html"&gt;&lt;b&gt;&lt;i&gt;Create a SurfaceView Game step-by-step&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In previoud posts, we have created a custom SurfaceView(MyGameSurfaceView.java) with background thread. Now we are going to create another MyForeground class by extending our MyGameSurfaceView, with overriding code. Base on the existing MyGameSurfaceView class, it's easy to implement the new MyForeground class.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-w_qvyll5qck/TyRJGL78xRI/AAAAAAAAAfo/PgKl0rs67cM/s1600/MyForeground.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://3.bp.blogspot.com/-w_qvyll5qck/TyRJGL78xRI/AAAAAAAAAfo/PgKl0rs67cM/s400/MyForeground.png" border="0" alt="Create transparent foreground SurfaceView" title="Create transparent foreground SurfaceView" id="BLOGGER_PHOTO_ID_5702763398790169874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Create a new class: Right click to select our package (com.MyGame) in Package Explorer, select File -&amp;gt; New -&amp;gt; Class in Eclipse Menu.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-98jxxHpTL0c/TyRI3vcvduI/AAAAAAAAAfc/WIQiyyTFRn8/s1600/MyForeground_01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://4.bp.blogspot.com/-98jxxHpTL0c/TyRI3vcvduI/AAAAAAAAAfc/WIQiyyTFRn8/s400/MyForeground_01.png" border="0" alt="Create a new class" title="Create a new class" id="BLOGGER_PHOTO_ID_5702763150624913122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter class name, MyForeground, in Name field. And click Browse...&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-LL-mAx2eWus/TyRIoYzqspI/AAAAAAAAAfQ/VLrhnSpFSoQ/s1600/MyForeground_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="http://2.bp.blogspot.com/-LL-mAx2eWus/TyRIoYzqspI/AAAAAAAAAfQ/VLrhnSpFSoQ/s400/MyForeground_02.png" border="0" alt="New a MyForeground class" title="New a MyForeground class" id="BLOGGER_PHOTO_ID_5702762886849016466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Type MyGameSurfaceView in Choose a type box, and select MyGameSurfaceView - com.MyGame, click OK.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-2zDSsZPuFOU/TyRIa7jfsGI/AAAAAAAAAfE/UwLdKeVDs_E/s1600/MyForeground_03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 301px; height: 400px;" src="http://1.bp.blogspot.com/-2zDSsZPuFOU/TyRIa7jfsGI/AAAAAAAAAfE/UwLdKeVDs_E/s400/MyForeground_03.png" border="0" alt="Choose MyGameSurfaceView - com.MyGame" title="Choose MyGameSurfaceView - com.MyGame" id="BLOGGER_PHOTO_ID_5702762655658258530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Scroll down in New Java Class dialog, click to check Constructors from superclass. Click Finish.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-l1bzI9F4eVM/TyRIJYCN-0I/AAAAAAAAAe4/YvZCWJ8JU5c/s1600/MyForeground_04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 329px;" src="http://1.bp.blogspot.com/-l1bzI9F4eVM/TyRIJYCN-0I/AAAAAAAAAe4/YvZCWJ8JU5c/s400/MyForeground_04.png" border="0" alt="Create Constructors from superclass" title="Create Constructors from superclass" id="BLOGGER_PHOTO_ID_5702762354065668930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Now, we have a new class MyForeground.java under com.MyGame.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-dCnNMMo8p_Y/TyRH5R5mMEI/AAAAAAAAAes/zcaDC8w8LAs/s1600/MyForeground_05.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://2.bp.blogspot.com/-dCnNMMo8p_Y/TyRH5R5mMEI/AAAAAAAAAes/zcaDC8w8LAs/s400/MyForeground_05.png" border="0" alt="MyForeground.java" title="MyForeground.java" id="BLOGGER_PHOTO_ID_5702762077540986946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Modify MyForeground.java to override onDraw(Canvas canvas). We are going to draw each pixel on foreground, so we need not to handle the "&lt;a href="http://android-coding.blogspot.com/2012/01/flickering-problems-due-to-double.html"&gt;Flickering problems&lt;/a&gt;". For now, we simple draw a icon on a fixed location on foreground.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;&lt;br /&gt;public class MyForeground extends MyGameSurfaceView {&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context) {&lt;br /&gt; super(context);&lt;br /&gt; // TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context, AttributeSet attrs) {&lt;br /&gt; super(context, attrs);&lt;br /&gt; // TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyForeground(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt; super(context, attrs, defStyle);&lt;br /&gt; // TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onDraw(Canvas canvas) {&lt;br /&gt; Bitmap me = BitmapFactory.decodeResource(getResources(), R.drawable.icon_me);&lt;br /&gt; int loc_x = canvas.getWidth()/2;&lt;br /&gt; int loc_y = canvas.getHeight()/2;&lt;br /&gt; canvas.drawBitmap(me, loc_x, loc_y, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Modify main.xml to add a new MyForeground, overlape with original MyGameSurfaceView inside a FrameLayout.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;  android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"&lt;br /&gt;      android:text="@string/hello" /&amp;gt;&lt;br /&gt;  &amp;lt;FrameLayout&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="fill_parent"&lt;br /&gt;      &amp;gt;&lt;br /&gt;  &amp;lt;com.MyGame.MyGameSurfaceView&lt;br /&gt;      android:id="@+id/myview1"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="fill_parent" /&amp;gt;&lt;br /&gt;  &amp;lt;com.MyGame.MyForeground&lt;br /&gt;      android:id="@+id/myforeground"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="fill_parent" /&amp;gt;&lt;br /&gt;  &amp;lt;/FrameLayout&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Modify MyGameActivity.java to handle MyForeground. Please note that in order to make the MyForeground transparency, we have to add the code:&lt;br /&gt;      myForeground.setZOrderOnTop(true);&lt;br /&gt;      myForeground.getHolder().setFormat(PixelFormat.TRANSPARENT);&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.graphics.PixelFormat;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;&lt;br /&gt;public class MyGameActivity extends Activity {&lt;br /&gt;&lt;br /&gt;MyGameSurfaceView myGameSurfaceView1;&lt;br /&gt;MyForeground myForeground;&lt;br /&gt;&lt;br /&gt;  /** Called when the activity is first created. */&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.main);&lt;br /&gt;      myGameSurfaceView1 = (MyGameSurfaceView)findViewById(R.id.myview1);&lt;br /&gt;      myForeground = (MyForeground)findViewById(R.id.myforeground);&lt;br /&gt;    &lt;br /&gt;      //Set myForeground using transparent background&lt;br /&gt;      myForeground.setZOrderOnTop(true);&lt;br /&gt;      myForeground.getHolder().setFormat(PixelFormat.TRANSPARENT);&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onResume() {&lt;br /&gt; // TODO Auto-generated method stub&lt;br /&gt; super.onResume();&lt;br /&gt; myGameSurfaceView1.MyGameSurfaceView_OnResume();&lt;br /&gt; myForeground.MyGameSurfaceView_OnResume();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onPause() {&lt;br /&gt; // TODO Auto-generated method stub&lt;br /&gt; super.onPause();&lt;br /&gt; myGameSurfaceView1.MyGameSurfaceView_OnPause();&lt;br /&gt; myForeground.MyGameSurfaceView_OnPause();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5402331977420548004?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KaXV9SVCVM96rd5MQFiPV0k9sKM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KaXV9SVCVM96rd5MQFiPV0k9sKM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KaXV9SVCVM96rd5MQFiPV0k9sKM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KaXV9SVCVM96rd5MQFiPV0k9sKM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5402331977420548004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-transparent-foreground.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5402331977420548004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5402331977420548004?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-transparent-foreground.html" title="Create transparent foreground SurfaceView" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-w_qvyll5qck/TyRJGL78xRI/AAAAAAAAAfo/PgKl0rs67cM/s72-c/MyForeground.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkIFRHc-cCp7ImA9WhRUF0o.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5085868187659696388</id><published>2012-01-25T13:21:00.000-08:00</published><updated>2012-01-28T11:21:55.958-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T11:21:55.958-08:00</app:edited><title>Flickering problems due to double buffer of SurfaceView</title><content type="html">If you try the code in last post &lt;a href="http://android-coding.blogspot.com/2012/01/link-surfaceview-and-background-thread.html"&gt;Link SurfaceView and Background Thread work together&lt;/a&gt;, you can note that the screen seem to flicker between two bitmap! It's due to double buffer of Android's SurfaceView: When you draw on Buffer A, Buffer B is being displayed; then you draw on Buffer B, Buffer A is being displayed. Such that you draw random points on Buffer A and B alternatively, not a single bitmap. This feature can solve some problem of display performance - but not in our case.&lt;br /&gt;&lt;br /&gt;In order to solve the problem, you can:&lt;br /&gt;- Draw each pixel on each buffer (It's not practical in our case), OR&lt;br /&gt;- Draw on a single bitmap, then draw the bitmap on canvas.&lt;br /&gt;&lt;br /&gt;Here is how to solve the double buffer problem using the second approach:&lt;br /&gt;&lt;br /&gt;Modify the SurfaceView - MyGameSurfaceView.java&lt;br /&gt;&lt;br /&gt;In surfaceCreated(), create a bitmap(myCanvasBitmap) accroading to the dimension of the SurfaceView. (Please note that not in MyGameSurfaceView_OnResume() - because the SurfaceView may be not yet ready when MyGameSurfaceView_OnResume() is called.)  Create a new canvas(myCanvas). Then specify the bitmap(myCanvasBitmap) for the canvas(myCanvas) to draw into, by calling myCanvas.setBitmap(myCanvasBitmap) - Everything draw on myCanvas will draw on myCanvasBitmap.&lt;br /&gt;&lt;br /&gt;In onDraw(), we draw on myCanvas, NOT canvas from the method argument. So everything will be draw on myCanvasBitmap. Then, draw the bitmap on canvas (from the method argument) using identity matrix, by calling canvas.drawBitmap(myCanvasBitmap, identityMatrix, null).&lt;br /&gt;&lt;br /&gt;Such that, all we draw are draw on a single bitmap; to make both buffer consistance.&lt;br /&gt;&lt;br /&gt;MyGameSurfaceView.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Matrix;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;&lt;br /&gt;public class MyGameSurfaceView extends SurfaceView implements SurfaceHolder.Callback{&lt;br /&gt;&lt;br /&gt;SurfaceHolder surfaceHolder;&lt;br /&gt;&lt;br /&gt;MyGameThread myGameThread = null;&lt;br /&gt;&lt;br /&gt;int myCanvas_w, myCanvas_h;&lt;br /&gt;Bitmap myCanvasBitmap = null;&lt;br /&gt;Canvas myCanvas = null;&lt;br /&gt;Matrix identityMatrix;&lt;br /&gt;&lt;br /&gt;private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);&lt;br /&gt; Random random;&lt;br /&gt;&lt;br /&gt;public MyGameSurfaceView(Context context) {&lt;br /&gt;super(context);&lt;br /&gt;// TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyGameSurfaceView(Context context, AttributeSet attrs) {&lt;br /&gt;super(context, attrs);&lt;br /&gt;// TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyGameSurfaceView(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;super(context, attrs, defStyle);&lt;br /&gt;// TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;// TODO Auto-generated method stub&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;&lt;br /&gt;myCanvas_w = getWidth();&lt;br /&gt;myCanvas_h = getHeight();&lt;br /&gt;myCanvasBitmap = Bitmap.createBitmap(myCanvas_w, myCanvas_h, Bitmap.Config.ARGB_8888);&lt;br /&gt;myCanvas = new Canvas();&lt;br /&gt;myCanvas.setBitmap(myCanvasBitmap);&lt;br /&gt;&lt;br /&gt;identityMatrix = new Matrix();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;// TODO Auto-generated method stub&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void MyGameSurfaceView_OnResume(){&lt;br /&gt;&lt;br /&gt;random = new Random();&lt;br /&gt;surfaceHolder = getHolder();&lt;br /&gt;getHolder().addCallback(this);&lt;br /&gt;&lt;br /&gt;//Create and start background Thread&lt;br /&gt;myGameThread = new MyGameThread(this, 200);&lt;br /&gt;myGameThread.setRunning(true);&lt;br /&gt;myGameThread.start();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void MyGameSurfaceView_OnPause(){&lt;br /&gt;//Kill the background Thread&lt;br /&gt;boolean retry = true;&lt;br /&gt;myGameThread.setRunning(false);&lt;br /&gt;&lt;br /&gt;while(retry){&lt;br /&gt; try {&lt;br /&gt;  myGameThread.join();&lt;br /&gt;  retry = false;&lt;br /&gt; } catch (InterruptedException e) {&lt;br /&gt;  e.printStackTrace();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onDraw(Canvas canvas) {&lt;br /&gt;&lt;br /&gt;paint.setStyle(Paint.Style.STROKE);&lt;br /&gt;     paint.setStrokeWidth(3);&lt;br /&gt;  &lt;br /&gt;     //int w = myCanvas.getWidth();&lt;br /&gt;     //int h = myCanvas.getHeight();&lt;br /&gt;     int x = random.nextInt(myCanvas_w-1);&lt;br /&gt;     int y = random.nextInt(myCanvas_h-1);&lt;br /&gt;     int r = random.nextInt(255);&lt;br /&gt;     int g = random.nextInt(255);&lt;br /&gt;     int b = random.nextInt(255);&lt;br /&gt;&lt;br /&gt;     paint.setColor(0xff000000 + (r &amp;lt;&amp;lt; 16) + (g &amp;lt;&amp;lt; 8) + b);&lt;br /&gt;     myCanvas.drawPoint(x, y, paint);&lt;br /&gt;  &lt;br /&gt;     canvas.drawBitmap(myCanvasBitmap, identityMatrix, null);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void updateStates(){&lt;br /&gt;//Dummy method() to handle the States&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void updateSurfaceView(){&lt;br /&gt;//The function run in background thread, not ui thread.&lt;br /&gt;&lt;br /&gt;Canvas canvas = null;&lt;br /&gt;&lt;br /&gt;try{&lt;br /&gt; canvas = surfaceHolder.lockCanvas();&lt;br /&gt;&lt;br /&gt; synchronized (surfaceHolder) {&lt;br /&gt;  updateStates();&lt;br /&gt;  onDraw(canvas);&lt;br /&gt; }&lt;br /&gt;}finally{&lt;br /&gt; if(canvas != null){&lt;br /&gt;  surfaceHolder.unlockCanvasAndPost(canvas);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/create-transparent-foreground.html"&gt;Create transparent foreground SurfaceView&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5085868187659696388?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7XT-MnWso_cGGchNl7W4_-0Fw3c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7XT-MnWso_cGGchNl7W4_-0Fw3c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7XT-MnWso_cGGchNl7W4_-0Fw3c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7XT-MnWso_cGGchNl7W4_-0Fw3c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5085868187659696388/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/flickering-problems-due-to-double.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5085868187659696388?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5085868187659696388?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/flickering-problems-due-to-double.html" title="Flickering problems due to double buffer of SurfaceView" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEEMRHw-eSp7ImA9WhRUFU8.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-8024909852002595681</id><published>2012-01-24T13:28:00.001-08:00</published><updated>2012-01-25T13:24:45.251-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T13:24:45.251-08:00</app:edited><title>Link SurfaceView and Background Thread work together</title><content type="html">In previous posts "&lt;a href="http://android-coding.blogspot.com/2012/01/create-surfaceview-for-our-game.html"&gt;Create SurfaceView for our game&lt;/a&gt;" and "&lt;a href="http://android-coding.blogspot.com/2012/01/implement-background-thread-for-our.html"&gt;Implement background thread for our game&lt;/a&gt;", we have created DUMMY MyGameSurfaceView and MyGameThread classes, without any function, and without any interaction. In this step, we are going to modify the Java code to make them work together.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-2LM-iJAl-FI/Tx8iqtY4MgI/AAAAAAAAAeg/FAr1HPMGYdI/s1600/MyGame_01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://4.bp.blogspot.com/-2LM-iJAl-FI/Tx8iqtY4MgI/AAAAAAAAAeg/FAr1HPMGYdI/s400/MyGame_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5701313770408129026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml to include MyGameSurfaceView in the layout.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt; android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;TextView&lt;br /&gt;     android:layout_width="fill_parent"&lt;br /&gt;     android:layout_height="wrap_content"&lt;br /&gt;     android:text="@string/hello" /&amp;gt;&lt;br /&gt; &amp;lt;com.MyGame.MyGameSurfaceView&lt;br /&gt;     android:id="@+id/myview1"&lt;br /&gt;     android:layout_width="fill_parent"&lt;br /&gt;     android:layout_height="fill_parent" /&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify the main activity (MyGameActivity), call myGameSurfaceView1.MyGameSurfaceView_OnResume() in onResume() and call myGameSurfaceView1.MyGameSurfaceView_OnPause() in onPause(); to start and stop the background thread.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;&lt;br /&gt;public class MyGameActivity extends Activity {&lt;br /&gt; &lt;br /&gt; MyGameSurfaceView myGameSurfaceView1;&lt;br /&gt; &lt;br /&gt; /** Called when the activity is first created. */&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;     super.onCreate(savedInstanceState);&lt;br /&gt;     setContentView(R.layout.main);&lt;br /&gt;     myGameSurfaceView1 = (MyGameSurfaceView)findViewById(R.id.myview1);&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onResume() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  super.onResume();&lt;br /&gt;  myGameSurfaceView1.MyGameSurfaceView_OnResume();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onPause() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  super.onPause();&lt;br /&gt;  myGameSurfaceView1.MyGameSurfaceView_OnPause();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify MyGameThread.java. It's a classic structure of backgraound thread. One thing have to note is the statement parent.updateSurfaceView() in run(), it will call back the function updateSurfaceView() in it's parent object.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;public class MyGameThread extends Thread {&lt;br /&gt; &lt;br /&gt; volatile boolean running = false;&lt;br /&gt; &lt;br /&gt; MyGameSurfaceView parent;&lt;br /&gt; long sleepTime;&lt;br /&gt; &lt;br /&gt; MyGameThread(MyGameSurfaceView sv, long st){&lt;br /&gt;  super();&lt;br /&gt;  parent = sv;&lt;br /&gt;  sleepTime = st;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setRunning(boolean r){&lt;br /&gt;  running = r;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  while(running){&lt;br /&gt;&lt;br /&gt;   try {&lt;br /&gt;    sleep(sleepTime);&lt;br /&gt;    parent.updateSurfaceView();&lt;br /&gt;   } catch (InterruptedException e) {&lt;br /&gt;    // TODO Auto-generated catch block&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify MyGameSurfaceView.java. It's the main part in the code.  updateSurfaceView() is a call back function from background thread (MyGameThread.java) in pre-defined duration reached. In-directly, it call updateStates() and onDraw(canvas) to update states (not yet implemented) and draw something on screen (some random drawing is implemented). Please note that updateSurfaceView() is called from background thread, that means it run in background thread, not in UI thread. That's why we need something like surfaceHolder.lockCanvas(), surfaceHolder.unlockCanvasAndPost(canvas) and synchronized (surfaceHolder).&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.util.AttributeSet;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;&lt;br /&gt;public class MyGameSurfaceView extends SurfaceView implements SurfaceHolder.Callback{&lt;br /&gt; &lt;br /&gt; SurfaceHolder surfaceHolder;&lt;br /&gt; &lt;br /&gt; MyGameThread myGameThread = null;&lt;br /&gt; &lt;br /&gt; private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);&lt;br /&gt; Random random;&lt;br /&gt;&lt;br /&gt; public MyGameSurfaceView(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyGameSurfaceView(Context context, AttributeSet attrs) {&lt;br /&gt;  super(context, attrs);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public MyGameSurfaceView(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;  // TODO Auto-generated constructor stub&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void MyGameSurfaceView_OnResume(){&lt;br /&gt;  &lt;br /&gt;  random = new Random();&lt;br /&gt;  surfaceHolder = getHolder();&lt;br /&gt;  getHolder().addCallback(this);&lt;br /&gt;  &lt;br /&gt;  //Create and start background Thread&lt;br /&gt;  myGameThread = new MyGameThread(this, 500);&lt;br /&gt;  myGameThread.setRunning(true);&lt;br /&gt;  myGameThread.start();&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void MyGameSurfaceView_OnPause(){&lt;br /&gt;  //Kill the background Thread&lt;br /&gt;  boolean retry = true;&lt;br /&gt;  myGameThread.setRunning(false);&lt;br /&gt;  &lt;br /&gt;  while(retry){&lt;br /&gt;   try {&lt;br /&gt;    myGameThread.join();&lt;br /&gt;    retry = false; &lt;br /&gt;   } catch (InterruptedException e) {&lt;br /&gt;    e.printStackTrace(); &lt;br /&gt;   } &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  paint.setStyle(Paint.Style.STROKE);&lt;br /&gt;     paint.setStrokeWidth(3);&lt;br /&gt;      &lt;br /&gt;     int w = canvas.getWidth();&lt;br /&gt;     int h = canvas.getHeight();&lt;br /&gt;     int x = random.nextInt(w-1);&lt;br /&gt;     int y = random.nextInt(h-1);&lt;br /&gt;     int r = random.nextInt(255);&lt;br /&gt;     int g = random.nextInt(255);&lt;br /&gt;     int b = random.nextInt(255);&lt;br /&gt;  &lt;br /&gt;     paint.setColor(0xff000000 + (r &amp;lt;&amp;lt; 16) + (g &amp;lt;&amp;lt; 8) + b);&lt;br /&gt;     canvas.drawPoint(x, y, paint);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void updateStates(){&lt;br /&gt;  //Dummy method() to handle the States&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void updateSurfaceView(){&lt;br /&gt;  //The function run in background thread, not ui thread.&lt;br /&gt;  &lt;br /&gt;  Canvas canvas = null;&lt;br /&gt;   &lt;br /&gt;  try{&lt;br /&gt;   canvas = surfaceHolder.lockCanvas();&lt;br /&gt;&lt;br /&gt;   synchronized (surfaceHolder) {&lt;br /&gt;    updateStates();&lt;br /&gt;    onDraw(canvas);&lt;br /&gt;   }&lt;br /&gt;  }finally{&lt;br /&gt;   if(canvas != null){&lt;br /&gt;    surfaceHolder.unlockCanvasAndPost(canvas);&lt;br /&gt;   }&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The idea is:&lt;ul&gt;&lt;li&gt;The main.xml layout define MyGameSurfaceView.&lt;/li&gt;&lt;li&gt;MyGameSurfaceView start background thread.&lt;/li&gt;&lt;li&gt;When background thread reach the pre-defined duration, it call back updateSurfaceView() function of &lt;/li&gt;&lt;li&gt;MyGameSurfaceView to do and draw something.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/flickering-problems-due-to-double.html"&gt;Flickering problems due to double buffer of SurfaceView&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-8024909852002595681?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8Tqm8Vx3aQHwmjtykLqHZhfbbig/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Tqm8Vx3aQHwmjtykLqHZhfbbig/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8Tqm8Vx3aQHwmjtykLqHZhfbbig/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Tqm8Vx3aQHwmjtykLqHZhfbbig/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/8024909852002595681/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/link-surfaceview-and-background-thread.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8024909852002595681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8024909852002595681?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/link-surfaceview-and-background-thread.html" title="Link SurfaceView and Background Thread work together" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-2LM-iJAl-FI/Tx8iqtY4MgI/AAAAAAAAAeg/FAr1HPMGYdI/s72-c/MyGame_01.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08FRXw5fCp7ImA9WhRUEUo.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-2948723712821533070</id><published>2012-01-21T12:59:00.001-08:00</published><updated>2012-01-21T13:03:34.224-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-21T13:03:34.224-08:00</app:edited><title>Implement background thread for our game</title><content type="html">Start reading here: &lt;a href="http://android-coding.blogspot.com/2012/01/create-surfaceview-game-step-by-step.html"&gt;&lt;b&gt;&lt;i&gt;Create a SurfaceView Game step-by-step&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Click to select our package (com.MyGame) in Package Explorer. Then click File of Eclipse, -&amp;gt; New -&amp;gt; Class&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-qwocvIs2JVU/Txsn1Re5x4I/AAAAAAAAAeU/r3DeZfV8uD4/s1600/MyGameThread_01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://4.bp.blogspot.com/-qwocvIs2JVU/Txsn1Re5x4I/AAAAAAAAAeU/r3DeZfV8uD4/s400/MyGameThread_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700193549547063170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter "MyGameThread" in the Name field, then click Browse... to select Superclass.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-4aLvzznDv1s/Txsnvsj79BI/AAAAAAAAAeI/BGtT7X-MBRU/s1600/MyGameThread_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="http://3.bp.blogspot.com/-4aLvzznDv1s/Txsnvsj79BI/AAAAAAAAAeI/BGtT7X-MBRU/s400/MyGameThread_02.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700193453736719378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter Thread in the search box to choice Thread - java.lang, then click OK.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-NiFpxHV_lH4/TxsnnIwqucI/AAAAAAAAAd8/qtdS9J2XNGk/s1600/MyGameThread_03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 227px; height: 400px;" src="http://4.bp.blogspot.com/-NiFpxHV_lH4/TxsnnIwqucI/AAAAAAAAAd8/qtdS9J2XNGk/s400/MyGameThread_03.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700193306687486402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Then click Finish in the New Java Class dialog.&lt;br /&gt;&lt;br /&gt;- In the Edit Windows (with MyGameThread.java), right click on any blank space, select Source -&amp;gt; Override/Implement Methods...&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-mdrPeQxxCZI/TxsnhM9pxUI/AAAAAAAAAdw/ODTV9JFtPso/s1600/MyGameThread_04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://3.bp.blogspot.com/-mdrPeQxxCZI/TxsnhM9pxUI/AAAAAAAAAdw/ODTV9JFtPso/s400/MyGameThread_04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700193204736476482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Type "run" on In Override/Implement Methods dialog, it will search the matched method for you: the run() will be listed. Click to select run(), and click Ok.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-BivgNyQ6kxY/TxsnZ0N5ttI/AAAAAAAAAdk/LRAwY7ZbX1k/s1600/MyGameThread_05.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 326px;" src="http://2.bp.blogspot.com/-BivgNyQ6kxY/TxsnZ0N5ttI/AAAAAAAAAdk/LRAwY7ZbX1k/s400/MyGameThread_05.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700193077834659538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- It's the basic of our Thread. We will add/modify more methods later.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-vRWZrloUPMY/TxsnStbhnbI/AAAAAAAAAdY/J9n5DUYaqfY/s1600/MyGameThread_06.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://1.bp.blogspot.com/-vRWZrloUPMY/TxsnStbhnbI/AAAAAAAAAdY/J9n5DUYaqfY/s400/MyGameThread_06.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5700192955753668018" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-2948723712821533070?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OIPJnn4vpG_G9obp6Ju8006Cq88/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OIPJnn4vpG_G9obp6Ju8006Cq88/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OIPJnn4vpG_G9obp6Ju8006Cq88/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OIPJnn4vpG_G9obp6Ju8006Cq88/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/2948723712821533070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/implement-background-thread-for-our.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2948723712821533070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2948723712821533070?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/implement-background-thread-for-our.html" title="Implement background thread for our game" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-qwocvIs2JVU/Txsn1Re5x4I/AAAAAAAAAeU/r3DeZfV8uD4/s72-c/MyGameThread_01.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak4BQH4zfyp7ImA9WhRVFkk.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-8024334934715256969</id><published>2012-01-15T07:57:00.001-08:00</published><updated>2012-01-15T09:35:51.087-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-15T09:35:51.087-08:00</app:edited><title>Create SurfaceView for our game</title><content type="html">Start reading here: &lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/create-surfaceview-game-step-by-step.html"&gt;Create a SurfaceView Game step-by-step&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this step, we are going to create our dummy SurfaceView:&lt;br /&gt;&lt;br /&gt;- Click to select our package (com.MyGame) in Package Explorer. Then click File of Eclipse, -&amp;gt; New -&amp;gt; Class&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-z3oBn2X4CKE/TxL48XW-66I/AAAAAAAAAdM/61_dVrsgMIw/s1600/01_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://4.bp.blogspot.com/-z3oBn2X4CKE/TxL48XW-66I/AAAAAAAAAdM/61_dVrsgMIw/s400/01_MyGameSurfaceView.png" border="0" alt="New a class, MyGameSurfaceView.java" title="New a class, MyGameSurfaceView.java" id="BLOGGER_PHOTO_ID_5697890194523351970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter "MyGameSurfaceView" in the Name field, then click Browse... to select Superclass.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-uHflFnPk9MA/TxL4xDvFTvI/AAAAAAAAAdA/HgLLcN0M_Is/s1600/02_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://2.bp.blogspot.com/-uHflFnPk9MA/TxL4xDvFTvI/AAAAAAAAAdA/HgLLcN0M_Is/s400/02_MyGameSurfaceView.png" border="0" alt="select Superclass" title="select Superclass" id="BLOGGER_PHOTO_ID_5697890000277163762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter SurfaceView in the search box to choice SurfaceView - android.view, then click OK.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-02_EY126smo/TxL4d5EvNKI/AAAAAAAAAc0/i4cIPJ9UKxc/s1600/03_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 227px; height: 400px;" src="http://3.bp.blogspot.com/-02_EY126smo/TxL4d5EvNKI/AAAAAAAAAc0/i4cIPJ9UKxc/s400/03_MyGameSurfaceView.png" border="0" alt="Choice superclass of SurfaceView - android.view" title="Choice superclass of SurfaceView - android.view" id="BLOGGER_PHOTO_ID_5697889670997685410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Then click Finish in the New Java Class dialog.&lt;br /&gt;&lt;br /&gt;- A new class of MyGameSurfaceView.java extends SurfaceView will be generated for you. But, you will be prompted with error of undefined default constructor. Move mouse over the word with error, MyGameSurfaceView. A hints box will open for you, click to &lt;b&gt;Add constructor 'MyGameSurfaceView(Context)'&lt;/b&gt;.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-kEExXE2qHsk/TxL4NN2I4mI/AAAAAAAAAco/Em23ASqi2Fg/s1600/04_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://1.bp.blogspot.com/-kEExXE2qHsk/TxL4NN2I4mI/AAAAAAAAAco/Em23ASqi2Fg/s400/04_MyGameSurfaceView.png" border="0" alt="Add constructor 'MyGameSurfaceView(Context)'" title="Add constructor 'MyGameSurfaceView(Context)'" id="BLOGGER_PHOTO_ID_5697889384515822178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Modify the code of MyGameSurfaceView class declaration from:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public class MyGameSurfaceView extends SurfaceView&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;to:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public class MyGameSurfaceView extends SurfaceView implements SurfaceHolder.Callback&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- You will be prompt for error again: SurfaceHolder cannot be resolved! Move mouse over the word with error, SurfaceHolder. And select &lt;b&gt;Import 'SurfaceHolder'(android.view)&lt;/b&gt;.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-N9QnuVjnyyM/TxL3_yOpkaI/AAAAAAAAAcc/llJ9FI2WwbQ/s1600/05_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://1.bp.blogspot.com/-N9QnuVjnyyM/TxL3_yOpkaI/AAAAAAAAAcc/llJ9FI2WwbQ/s400/05_MyGameSurfaceView.png" border="0" alt="Import 'SurfaceHolder'(android.view)" title="Import 'SurfaceHolder'(android.view)" id="BLOGGER_PHOTO_ID_5697889153764135330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- MyGameSurfaceView will be prompt with error again: The type MyGameSurfaceView must implement the inherited abstract method SurfaceHolder.Callback.surfaceDestroyed(SurfaceHolder). Move mouse over the word with error, MyGameSurfaceView, select &lt;b&gt;Add unimplemented methods&lt;/b&gt;.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-r1upy5cA_wE/TxL3zY_zzjI/AAAAAAAAAcQ/JlzmhRp6CsU/s1600/06_MyGameSurfaceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://1.bp.blogspot.com/-r1upy5cA_wE/TxL3zY_zzjI/AAAAAAAAAcQ/JlzmhRp6CsU/s400/06_MyGameSurfaceView.png" border="0" alt="Add unimplemented methods" title="Add unimplemented methods" id="BLOGGER_PHOTO_ID_5697888940832575026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Now three Auto-generated method will be added:&lt;br /&gt;surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)&lt;br /&gt;surfaceCreated(SurfaceHolder arg0)&lt;br /&gt;surfaceDestroyed(SurfaceHolder arg0)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-tIyDJraePVE/TxL3l_lnKPI/AAAAAAAAAcE/xtPPliFOPWg/s1600/07_MyGameSurfceView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://3.bp.blogspot.com/-tIyDJraePVE/TxL3l_lnKPI/AAAAAAAAAcE/xtPPliFOPWg/s400/07_MyGameSurfceView.png" border="0" alt="Three Auto-generated method will be added" title="Three Auto-generated method will be added" id="BLOGGER_PHOTO_ID_5697888710673508594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- In order to make our code more human readable, modify arg(s) with meaningful words:&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.MyGame;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;&lt;br /&gt;public class MyGameSurfaceView extends SurfaceView implements SurfaceHolder.Callback{&lt;br /&gt;&lt;br /&gt;public MyGameSurfaceView(Context context) {&lt;br /&gt;super(context);&lt;br /&gt;// TODO Auto-generated constructor stub&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;// TODO Auto-generated method stub&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;// TODO Auto-generated method stub&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;// TODO Auto-generated method stub&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Save it in this moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-8024334934715256969?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/naeEY2NLBn-E3arkzXYEkhZ0jA0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naeEY2NLBn-E3arkzXYEkhZ0jA0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/naeEY2NLBn-E3arkzXYEkhZ0jA0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naeEY2NLBn-E3arkzXYEkhZ0jA0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/8024334934715256969/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-surfaceview-for-our-game.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8024334934715256969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/8024334934715256969?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-surfaceview-for-our-game.html" title="Create SurfaceView for our game" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-z3oBn2X4CKE/TxL48XW-66I/AAAAAAAAAdM/61_dVrsgMIw/s72-c/01_MyGameSurfaceView.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak8EQHs7fCp7ImA9WhVSEU8.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-2942116323080793709</id><published>2012-01-11T23:52:00.002-08:00</published><updated>2012-03-07T06:00:01.504-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T06:00:01.504-08:00</app:edited><title>Create a SurfaceView Game step-by-step</title><content type="html">In the coming posts, I will TRY to create a basic game, a VERY BASIC GAME: base on SurfaceView implements SurfaceHolder, display something as Sprites, running in backgroud Thread.&lt;br /&gt;&lt;br /&gt;New a project MyGame of package com.MyGame, target Android 2.2, API Level 8.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Prepare my character&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creating graph is my weakest. As a example, I decide to copy my character from Android build-in icon.&lt;br /&gt;- Create a /res/drawable folder.&lt;br /&gt;&lt;br /&gt;- Open a file explorer and browse to any Android build-in platform drawable folder (ex. /android-sdks/platforms/android-8/data/res/drawable-mdpi/), drag any icon you want to /res/drawable folder under your project.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-oE95W9gAUXc/Tw6SICAKZxI/AAAAAAAAAb4/j4p6smgSfLo/s1600/01_Drag_a_drawable.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://3.bp.blogspot.com/-oE95W9gAUXc/Tw6SICAKZxI/AAAAAAAAAb4/j4p6smgSfLo/s400/01_Drag_a_drawable.png" border="0" alt="Drag any icon" title="Drag any icon" id="BLOGGER_PHOTO_ID_5696651245344417554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Select Copy files in the coming File Operation dialog.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-da6cIwgeLIs/Tw6R7Yf_MDI/AAAAAAAAAbs/BlcVgaFS1Qw/s1600/02_copy_file.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 210px;" src="http://1.bp.blogspot.com/-da6cIwgeLIs/Tw6R7Yf_MDI/AAAAAAAAAbs/BlcVgaFS1Qw/s400/02_copy_file.png" border="0" alt="Copy files" title="Copy files" id="BLOGGER_PHOTO_ID_5696651028045180978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Rename the drawable to icon_me.png: Click to select the copied icon, click File from Eclipse menu, and Rename...&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-Ten199_Jd6w/Tw6RZXeSbwI/AAAAAAAAAbg/cpj-GNERn5E/s1600/03_rename.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://4.bp.blogspot.com/-Ten199_Jd6w/Tw6RZXeSbwI/AAAAAAAAAbg/cpj-GNERn5E/s400/03_rename.png" border="0" alt="Rename..." title="Rename..." id="BLOGGER_PHOTO_ID_5696650443654065922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the coming posts, I will show more in step-by-step.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/create-surfaceview-for-our-game.html"&gt;Create SurfaceView for our game&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/implement-background-thread-for-our.html"&gt;Implement background thread for our game&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/link-surfaceview-and-background-thread.html"&gt;Link SurfaceView and Background Thread work together&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/flickering-problems-due-to-double.html"&gt;Flickering problems due to double buffer of SurfaceView&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/01/create-transparent-foreground.html"&gt;Create transparent foreground SurfaceView&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/02/introduce-sprite.html"&gt;Introduce Sprite&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/02/sprite-auto-run.html"&gt;Sprite auto-run&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/02/implement-ontouchevent-to-handle-user.html"&gt;Implement onTouchEvent() to handle user touch on SurfaceView&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://android-coding.blogspot.com/2012/03/surfaceview-game-step-by-step-react.html"&gt;React device movement/orientation using accelerometer&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-2942116323080793709?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/90CVT-3c6pqryv7VHnWIU96WaCI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/90CVT-3c6pqryv7VHnWIU96WaCI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/90CVT-3c6pqryv7VHnWIU96WaCI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/90CVT-3c6pqryv7VHnWIU96WaCI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/2942116323080793709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-surfaceview-game-step-by-step.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2942116323080793709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2942116323080793709?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-surfaceview-game-step-by-step.html" title="Create a SurfaceView Game step-by-step" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-oE95W9gAUXc/Tw6SICAKZxI/AAAAAAAAAb4/j4p6smgSfLo/s72-c/01_Drag_a_drawable.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0QHQnk4fyp7ImA9WhRWFkw.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-20758845803694153</id><published>2012-01-03T10:25:00.001-08:00</published><updated>2012-01-03T10:28:53.737-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T10:28:53.737-08:00</app:edited><title>Create custom Theme inheriting properties from build-in Theme</title><content type="html">Refer from the previous posts:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/12/create-style-using-android-resources.html"&gt;Create style using Android Resources Tools&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/create-style-inheriting-properties-from.html"&gt;Create style inheriting properties from another style&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html"&gt;Apply style on whole application/activity as theme&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/using-android-build-in-theme.html"&gt;Using Android build-in theme&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can create our custom Theme, by inheriting properties from build-in Theme.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-4umNbqp1NIo/TwNIQFEP7eI/AAAAAAAAAbU/S3SH2wSoTKQ/s1600/AndroidTheme_05.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-4umNbqp1NIo/TwNIQFEP7eI/AAAAAAAAAbU/S3SH2wSoTKQ/s400/AndroidTheme_05.png" border="0" alt="Create custom Theme inheriting properties from build-in Theme" title="Create custom Theme inheriting properties from build-in Theme" id="BLOGGER_PHOTO_ID_5693473795001544162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create(or modify from previous post) /res/values/mystyle.xml, create our custom style (MyStyle) from build-in "@android:style/Theme.Dialog".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;   &amp;lt;style name="MyStyle"&lt;br /&gt;       parent="@android:style/Theme.Dialog"&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:layout_width"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:layout_height"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textColor"&amp;gt;#AAA&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textSize"&amp;gt;18dip&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:background"&amp;gt;#222&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:padding"&amp;gt;5dip&amp;lt;/item&amp;gt;&lt;br /&gt;   &amp;lt;/style&amp;gt;&lt;br /&gt;   &amp;lt;style name="MyStyle.GreenBold"&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textColor"&amp;gt;#00FF00&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textStyle"&amp;gt;bold&amp;lt;/item&amp;gt;&lt;br /&gt;   &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify AndroidManifest.xml using theme of our custom style, "@style/MyStyle.GreenBold".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;   package="com.AndroidStyle"&lt;br /&gt;   android:versionCode="1"&lt;br /&gt;   android:versionName="1.0" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;uses-sdk android:minSdkVersion="8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;application&lt;br /&gt;       android:icon="@drawable/ic_launcher"&lt;br /&gt;       android:label="@string/app_name"&lt;br /&gt;       android:theme="@style/MyStyle.GreenBold" &amp;gt;&lt;br /&gt;       &amp;lt;activity&lt;br /&gt;           android:name=".AndroidStyleActivity"&lt;br /&gt;           android:label="@string/app_name" &amp;gt;&lt;br /&gt;           &amp;lt;intent-filter&amp;gt;&lt;br /&gt;               &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&lt;br /&gt;               &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;           &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;       &amp;lt;/activity&amp;gt;&lt;br /&gt;   &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Main.xml&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;   android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="@string/hello" /&amp;gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="using Style inherit from Android's build-in theme" /&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-20758845803694153?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i6ewAv0hG9B-KV6wvJ755_ypwZ0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i6ewAv0hG9B-KV6wvJ755_ypwZ0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i6ewAv0hG9B-KV6wvJ755_ypwZ0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i6ewAv0hG9B-KV6wvJ755_ypwZ0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/20758845803694153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-custom-theme-inheriting.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/20758845803694153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/20758845803694153?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-custom-theme-inheriting.html" title="Create custom Theme inheriting properties from build-in Theme" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-4umNbqp1NIo/TwNIQFEP7eI/AAAAAAAAAbU/S3SH2wSoTKQ/s72-c/AndroidTheme_05.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MGRnw5fyp7ImA9WhRWFkw.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-2167449628406484169</id><published>2012-01-02T13:06:00.001-08:00</published><updated>2012-01-03T10:30:27.227-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T10:30:27.227-08:00</app:edited><title>Using Android build-in theme</title><content type="html">We can apply Android build-in theme on our app. It's a example using Theme.Dialog.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-HuyKi2XJ-Sc/TwIcfZle1JI/AAAAAAAAAbI/NLsWl0zpMBU/s1600/AndroidTheme_04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://4.bp.blogspot.com/-HuyKi2XJ-Sc/TwIcfZle1JI/AAAAAAAAAbI/NLsWl0zpMBU/s400/AndroidTheme_04.png" border="0" alt="Using Android build-in theme of Theme.Dialog" title="Using Android build-in theme of Theme.Dialog" id="BLOGGER_PHOTO_ID_5693144204719346834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify AndroidManifest.xml using android:theme="@android:style/Theme.Dialog".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;   package="com.AndroidStyle"&lt;br /&gt;   android:versionCode="1"&lt;br /&gt;   android:versionName="1.0" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;uses-sdk android:minSdkVersion="8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;application&lt;br /&gt;       android:icon="@drawable/ic_launcher"&lt;br /&gt;       android:label="@string/app_name"&lt;br /&gt;       android:theme="@android:style/Theme.Dialog" &amp;gt;&lt;br /&gt;       &amp;lt;activity&lt;br /&gt;           android:name=".AndroidStyleActivity"&lt;br /&gt;           android:label="@string/app_name" &amp;gt;&lt;br /&gt;           &amp;lt;intent-filter&amp;gt;&lt;br /&gt;               &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&lt;br /&gt;               &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;           &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;       &amp;lt;/activity&amp;gt;&lt;br /&gt;   &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;   android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="@string/hello" /&amp;gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="using Android's Theme.Dialog" /&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Related:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html"&gt;Apply style on whole application/activity as theme&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/create-custom-theme-inheriting.html"&gt;Create custom Theme inheriting properties from build-in Theme&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-2167449628406484169?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qxg4yLWAbcLj931g5ZY8FbxTbQA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qxg4yLWAbcLj931g5ZY8FbxTbQA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qxg4yLWAbcLj931g5ZY8FbxTbQA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qxg4yLWAbcLj931g5ZY8FbxTbQA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/2167449628406484169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/using-android-build-in-theme.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2167449628406484169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/2167449628406484169?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/using-android-build-in-theme.html" title="Using Android build-in theme" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-HuyKi2XJ-Sc/TwIcfZle1JI/AAAAAAAAAbI/NLsWl0zpMBU/s72-c/AndroidTheme_04.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkEDR3w6fyp7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-3485896015276643718</id><published>2012-01-01T19:33:00.001-08:00</published><updated>2012-01-02T13:11:16.217-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T13:11:16.217-08:00</app:edited><title>Apply style on whole application/activity as theme</title><content type="html">The custome style create in last posts &lt;a href="http://android-coding.blogspot.com/2011/12/create-style-using-android-resources.html"&gt;Create style using Android Resources Tools&lt;/a&gt; and &lt;a href="http://android-coding.blogspot.com/2012/01/create-style-inheriting-properties-from.html"&gt;Create style inheriting properties from another style&lt;/a&gt; can be apply on whole application/activity as theme.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-CJkFHUB_qG8/TwElo122TPI/AAAAAAAAAa8/ouQv6YqHgEI/s1600/AndroidStyle_03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-CJkFHUB_qG8/TwElo122TPI/AAAAAAAAAa8/ouQv6YqHgEI/s400/AndroidStyle_03.png" border="0" alt="Apply style on whole application/activity as theme" title="Apply style on whole application/activity as theme" id="BLOGGER_PHOTO_ID_5692872787555142898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify AndroidManifest.xml to add android:theme="@style/MyStyle.GreenBold" property inside &amp;lt;application&amp;gt; to apply the style as theme on whole application, or inside &amp;lt;activity&amp;gt; to apply on individual activity only.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt; package="com.AndroidStyle"&lt;br /&gt; android:versionCode="1"&lt;br /&gt; android:versionName="1.0" &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;uses-sdk android:minSdkVersion="8" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;application&lt;br /&gt;     android:icon="@drawable/ic_launcher"&lt;br /&gt;     android:label="@string/app_name"&lt;br /&gt;     android:theme="@style/MyStyle.GreenBold" &amp;gt;&lt;br /&gt;     &amp;lt;activity&lt;br /&gt;         android:name=".AndroidStyleActivity"&lt;br /&gt;         android:label="@string/app_name" &amp;gt;&lt;br /&gt;         &amp;lt;intent-filter&amp;gt;&lt;br /&gt;             &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&lt;br /&gt;             &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;         &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;     &amp;lt;/activity&amp;gt;&lt;br /&gt; &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml, change TextView using application/activity theme.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt; android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;TextView&lt;br /&gt;     android:layout_width="fill_parent"&lt;br /&gt;     android:layout_height="wrap_content"&lt;br /&gt;     android:text="@string/hello" /&amp;gt;&lt;br /&gt; &amp;lt;TextView&lt;br /&gt;     android:layout_width="fill_parent"&lt;br /&gt;     android:text="Default, using style of MyStyle.GreenBold defined in AndroidManifest.xml" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Related:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/using-android-build-in-theme.html"&gt;Using Android build-in theme&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-3485896015276643718?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/90OP75fU6SM66BoucZvNZ6gHUxk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/90OP75fU6SM66BoucZvNZ6gHUxk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/90OP75fU6SM66BoucZvNZ6gHUxk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/90OP75fU6SM66BoucZvNZ6gHUxk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/3485896015276643718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/3485896015276643718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/3485896015276643718?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html" title="Apply style on whole application/activity as theme" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-CJkFHUB_qG8/TwElo122TPI/AAAAAAAAAa8/ouQv6YqHgEI/s72-c/AndroidStyle_03.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MNRHw_eCp7ImA9WhRWFEo.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-4554214810841961446</id><published>2012-01-01T09:16:00.001-08:00</published><updated>2012-01-01T19:38:15.240-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T19:38:15.240-08:00</app:edited><title>Create style inheriting properties from another style</title><content type="html">Refer to the style of last post &lt;a href="http://android-coding.blogspot.com/2011/12/create-style-using-android-resources.html"&gt;Create style using Android Resources Tools&lt;/a&gt;, we can create a new style(MyStyle.GreenBold) inheriting properties from another existing style (MyStyle).&lt;br /&gt;&lt;br /&gt;Modify /res/values/strings.xml, add a new style "MyStyle.GreenBold" inherit properties from "MyStyle", change and add properties of "android:textColor" and "android:textStyle".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;    &amp;lt;style name="MyStyle"&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:layout_width"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:layout_height"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:textColor"&amp;gt;#AAA&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:textSize"&amp;gt;18dip&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:background"&amp;gt;#222&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:padding"&amp;gt;5dip&amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;    &amp;lt;style name="MyStyle.GreenBold"&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:textColor"&amp;gt;#00FF00&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item name="android:textStyle"&amp;gt;bold&amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml adding TextView using new style of "MyStyle.GreenBold".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;    android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:text="@string/hello" /&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        style="@style/MyStyle"&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:text="it's text using style" /&amp;gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        style="@style/MyStyle.GreenBold"&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:text="it's text using style of MyStyle.GreenBold" /&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-CpuGmJIE5J0/TwCU8kUuCCI/AAAAAAAAAaw/HaVPqE3yXCQ/s1600/AndroidStyle_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://3.bp.blogspot.com/-CpuGmJIE5J0/TwCU8kUuCCI/AAAAAAAAAaw/HaVPqE3yXCQ/s400/AndroidStyle_02.png" border="0" alt="Create style inheriting properties from another style" title="Create style inheriting properties from another style" id="BLOGGER_PHOTO_ID_5692713697259948066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html"&gt;Apply style on whole application/activity as theme&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-4554214810841961446?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sBUBkLeTY9ylJo9OU2-t2a3yxvI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sBUBkLeTY9ylJo9OU2-t2a3yxvI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sBUBkLeTY9ylJo9OU2-t2a3yxvI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sBUBkLeTY9ylJo9OU2-t2a3yxvI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/4554214810841961446/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-style-inheriting-properties-from.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4554214810841961446?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4554214810841961446?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2012/01/create-style-inheriting-properties-from.html" title="Create style inheriting properties from another style" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-CpuGmJIE5J0/TwCU8kUuCCI/AAAAAAAAAaw/HaVPqE3yXCQ/s72-c/AndroidStyle_02.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MFQnc5eSp7ImA9WhRWFEo.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-4796716994170218778</id><published>2011-12-28T06:57:00.001-08:00</published><updated>2012-01-01T19:36:53.921-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T19:36:53.921-08:00</app:edited><title>Create style using Android Resources Tools</title><content type="html">- Start Eclipse, create a new Android project.&lt;br /&gt;&lt;br /&gt;- Right click /res/values/ in Package Explorer, click New -&amp;gt; Other....&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-Xr-cLY29uvA/Tvswnhoi4hI/AAAAAAAAAak/c4RXSpbcekI/s1600/style_01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://2.bp.blogspot.com/-Xr-cLY29uvA/Tvswnhoi4hI/AAAAAAAAAak/c4RXSpbcekI/s400/style_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691196009714213394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Expand Android, and select Android XML Values File, click Next.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-N2giIkewEr8/TvswegyODKI/AAAAAAAAAaY/KoFKC2XxkOs/s1600/style_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://2.bp.blogspot.com/-N2giIkewEr8/TvswegyODKI/AAAAAAAAAaY/KoFKC2XxkOs/s400/style_02.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195854867532962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter file name, mystyle.xml.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-GCtWlAMqa64/TvswWczf2II/AAAAAAAAAaM/9nNAVp8sTSo/s1600/style_03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 400px;" src="http://2.bp.blogspot.com/-GCtWlAMqa64/TvswWczf2II/AAAAAAAAAaM/9nNAVp8sTSo/s400/style_03.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195716360198274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Click Finish.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-oxRuTXl7O5c/TvswNAIBD9I/AAAAAAAAAaA/20DhvYqDHsM/s1600/style_04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 400px;" src="http://3.bp.blogspot.com/-oxRuTXl7O5c/TvswNAIBD9I/AAAAAAAAAaA/20DhvYqDHsM/s400/style_04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195554042810322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- The generated file will be opened in Resources mode. Click the tab with file name, mystyle.xml, to view in edit mode. The wizard should have create a root of &amp;lt;resources&amp;gt; for you.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-TMsKQW5LjoI/TvswFTAKPMI/AAAAAAAAAZ0/D4LboHShQl8/s1600/style_05.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://1.bp.blogspot.com/-TMsKQW5LjoI/TvswFTAKPMI/AAAAAAAAAZ0/D4LboHShQl8/s400/style_05.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195421671177410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Switch back to Resources mode by clicking on Resources tab.&lt;br /&gt;&lt;br /&gt;- Click on the Add button.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-zFI-CjatQpo/Tvsv9dufjdI/AAAAAAAAAZo/SZnnBQEexBo/s1600/style_06.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://2.bp.blogspot.com/-zFI-CjatQpo/Tvsv9dufjdI/AAAAAAAAAZo/SZnnBQEexBo/s400/style_06.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195287110913490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Select Style/Theme, and click OK.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-ghUFyGfKtTg/Tvsv1vtrrPI/AAAAAAAAAZc/J2cAwVFl4UE/s1600/style_07.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 348px;" src="http://3.bp.blogspot.com/-ghUFyGfKtTg/Tvsv1vtrrPI/AAAAAAAAAZc/J2cAwVFl4UE/s400/style_07.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195154500398322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter "MyStyle" in the name field.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-rnAGijtJcZk/TvsvtUDZCHI/AAAAAAAAAZQ/RCsfZKYfKaI/s1600/style_08.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://4.bp.blogspot.com/-rnAGijtJcZk/TvsvtUDZCHI/AAAAAAAAAZQ/RCsfZKYfKaI/s400/style_08.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691195009636305010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Click on Add button.&lt;br /&gt;&lt;br /&gt;- Select Item and click OK.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-B_xVQ7tZqg8/TvsvkVGjOgI/AAAAAAAAAZE/YodlQ9771BA/s1600/style_09.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 394px;" src="http://2.bp.blogspot.com/-B_xVQ7tZqg8/TvsvkVGjOgI/AAAAAAAAAZE/YodlQ9771BA/s400/style_09.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691194855299168770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Enter "android:layout_width" in Name field, and "wrap_content" in Value field.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-oihggWhGQvg/TvsvZ8KPdYI/AAAAAAAAAY4/RKncLPzoKJc/s1600/style_10.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://4.bp.blogspot.com/-oihggWhGQvg/TvsvZ8KPdYI/AAAAAAAAAY4/RKncLPzoKJc/s400/style_10.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691194676805072258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Click on mystyle.xml tab to view in edit mode. The wizard have already filled in the item.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-5zD09hdwW6A/TvsvR9lMUoI/AAAAAAAAAYs/gFKLTxCT5UI/s1600/style_11.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://1.bp.blogspot.com/-5zD09hdwW6A/TvsvR9lMUoI/AAAAAAAAAYs/gFKLTxCT5UI/s400/style_11.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691194539747594882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Repeat to fill in others.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;   &amp;lt;style name="MyStyle"&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:layout_width"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:layout_height"&amp;gt;wrap_content&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textColor"&amp;gt;#AAA&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:textSize"&amp;gt;18dip&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:background"&amp;gt;#222&amp;lt;/item&amp;gt;&lt;br /&gt;       &amp;lt;item name="android:padding"&amp;gt;5dip&amp;lt;/item&amp;gt;&lt;br /&gt;   &amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-BVwm2b4W05w/TvsvHnsbc5I/AAAAAAAAAYg/ZcGBj6najz0/s1600/style_12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://3.bp.blogspot.com/-BVwm2b4W05w/TvsvHnsbc5I/AAAAAAAAAYg/ZcGBj6najz0/s400/style_12.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691194362073674642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-8T20YUZTeA8/TvsvEjapNhI/AAAAAAAAAYU/3es319UWMdE/s1600/style_13.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://1.bp.blogspot.com/-8T20YUZTeA8/TvsvEjapNhI/AAAAAAAAAYU/3es319UWMdE/s400/style_13.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691194309385729554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Save It.&lt;br /&gt;&lt;br /&gt;- Modify main.xml to add a TextView using MyStyle.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;   android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="@string/hello" /&amp;gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       style="@style/MyStyle"&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:text="it's text using style" /&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Finished!&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-ulCnV5eP6Tk/TvsujO873TI/AAAAAAAAAYI/tknS8dETqVE/s1600/AndroidStyle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-ulCnV5eP6Tk/TvsujO873TI/AAAAAAAAAYI/tknS8dETqVE/s400/AndroidStyle.png" border="0" alt="TextView with style" title="TextView with style" id="BLOGGER_PHOTO_ID_5691193736956730674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/create-style-inheriting-properties-from.html"&gt;Create style inheriting properties from another style&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2012/01/apply-style-on-whole.html"&gt;Apply style on whole application/activity as theme&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-4796716994170218778?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KLGzOc0ffCqKus75pyuilVk4Hd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KLGzOc0ffCqKus75pyuilVk4Hd8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KLGzOc0ffCqKus75pyuilVk4Hd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KLGzOc0ffCqKus75pyuilVk4Hd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/4796716994170218778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2011/12/create-style-using-android-resources.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4796716994170218778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/4796716994170218778?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2011/12/create-style-using-android-resources.html" title="Create style using Android Resources Tools" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Xr-cLY29uvA/Tvswnhoi4hI/AAAAAAAAAak/c4RXSpbcekI/s72-c/style_01.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkMHRHw9fip7ImA9WhRXE00.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-551699695505093223</id><published>2011-12-19T06:01:00.004-08:00</published><updated>2011-12-19T06:20:35.266-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T06:20:35.266-08:00</app:edited><title>Create your own London 2012 App</title><content type="html">London 2012 Olympic is coming! Official site of the London 2012 Olympic (&lt;a href="http://www.london2012.com/"&gt;http://www.london2012.com/&lt;/a&gt;) have a very nice designed mobile version. You will be redirected to mobile version if you browse &lt;a href="http://www.london2012.com/"&gt;http://www.london2012.com/&lt;/a&gt; using mobile device.&lt;br /&gt;&lt;br /&gt;So, you can easily create your own London 2012 App for Android by embedding WebView.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-eYgDJMo-1MI/Tu9FwfSWBaI/AAAAAAAAAX8/5jM7rI7_wPM/s1600/myLondon2012.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://1.bp.blogspot.com/-eYgDJMo-1MI/Tu9FwfSWBaI/AAAAAAAAAX8/5jM7rI7_wPM/s400/myLondon2012.png" alt="" id="BLOGGER_PHOTO_ID_5687841553726703010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify main.xml to embed a WebView.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt; android:orientation="vertical" &amp;gt;&lt;br /&gt;&amp;lt;RelativeLayout&lt;br /&gt;  android:layout_width="fill_parent"&lt;br /&gt;  android:layout_height="fill_parent"&lt;br /&gt;  android:orientation="vertical" &amp;gt;&lt;br /&gt;  &amp;lt;TextView&lt;br /&gt;      android:id="@+id/myblog"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="wrap_content"&lt;br /&gt;      android:text="@string/my_blog"&lt;br /&gt; android:padding="5dp"&lt;br /&gt; android:autoLink="web"&lt;br /&gt; android:gravity="center_horizontal"&lt;br /&gt;      android:layout_alignParentBottom="true"/&amp;gt;&lt;br /&gt;  &amp;lt;WebView&lt;br /&gt;      android:id="@+id/webview"&lt;br /&gt;      android:layout_width="fill_parent"&lt;br /&gt;      android:layout_height="fill_parent"&lt;br /&gt;      android:layout_alignParentTop="true"&lt;br /&gt;      android:layout_above="@id/myblog"/&amp;gt;&lt;br /&gt;&amp;lt;/RelativeLayout&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify /res/values/strings.xml to add String of "my_blog", to advertise me:)&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;string name="hello"&amp;gt;Hello World, MyLondon2012Activity!&amp;lt;/string&amp;gt;&lt;br /&gt; &amp;lt;string name="app_name"&amp;gt;MyLondon2012&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;lt;string name="my_blog"&amp;gt;http://android-coding.blogspot.com/&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Modify main activity to handle WebView.&lt;br /&gt;&lt;pre class="brush: java"&gt;package android.coding.myLondon2012;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.Window;&lt;br /&gt;import android.webkit.WebChromeClient;&lt;br /&gt;import android.webkit.WebView;&lt;br /&gt;import android.webkit.WebViewClient;&lt;br /&gt;&lt;br /&gt;public class MyLondon2012Activity extends Activity {&lt;br /&gt;&lt;br /&gt;WebView webView;&lt;br /&gt;final String London2012_URL = "http://www.london2012.com/";&lt;br /&gt;&lt;br /&gt; /** Called when the activity is first created. */&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;     super.onCreate(savedInstanceState);&lt;br /&gt;     getWindow().requestFeature(Window.FEATURE_PROGRESS);&lt;br /&gt;     setContentView(R.layout.main);&lt;br /&gt;     webView = (WebView)findViewById(R.id.webview);&lt;br /&gt;     webView.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;     webView.setWebViewClient(new MyWebViewClient());&lt;br /&gt;     webView.loadUrl(London2012_URL);&lt;br /&gt;  &lt;br /&gt;     final Activity activity = this;&lt;br /&gt;     webView.setWebChromeClient(new WebChromeClient() {&lt;br /&gt;    &lt;br /&gt;      public void onProgressChanged(WebView view, int progress) {&lt;br /&gt;       // Activities and WebViews measure progress with different scales.&lt;br /&gt;       // The progress meter will automatically disappear when we reach 100%&lt;br /&gt;       activity.setProgress(progress * 100);&lt;br /&gt;      }});&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;public class MyWebViewClient extends WebViewClient {&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean shouldOverrideUrlLoading(WebView view, String url) {&lt;br /&gt; view.loadUrl(url);&lt;br /&gt;         return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Save the icon in /res/drawable/london2012.png&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-hTUm8-Vn4IE/Tu9E021dAXI/AAAAAAAAAXw/WnZheBNe6XQ/s1600/london2012.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 186px; height: 186px;" src="http://2.bp.blogspot.com/-hTUm8-Vn4IE/Tu9E021dAXI/AAAAAAAAAXw/WnZheBNe6XQ/s200/london2012.png" alt="" id="BLOGGER_PHOTO_ID_5687840529255825778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modify AndroidManifest.xml to enable "android.permission.INTERNET".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt; package="android.coding.myLondon2012"&lt;br /&gt; android:versionCode="1"&lt;br /&gt; android:versionName="1.0" &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;uses-sdk android:minSdkVersion="8" /&amp;gt;&lt;br /&gt; &amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;application&lt;br /&gt;     android:icon="@drawable/london2012"&lt;br /&gt;     android:label="@string/app_name" &amp;gt;&lt;br /&gt;     &amp;lt;activity&lt;br /&gt;         android:name=".MyLondon2012Activity"&lt;br /&gt;         android:label="@string/app_name" &amp;gt;&lt;br /&gt;         &amp;lt;intent-filter&amp;gt;&lt;br /&gt;             &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&lt;br /&gt;             &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;         &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;     &amp;lt;/activity&amp;gt;&lt;br /&gt; &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Download Eclipse project of myLondon2012: &lt;a href="http://goo.gl/tg18O"&gt;http://goo.gl/tg18O&lt;/a&gt;&lt;br /&gt;Download Installable APK Android package of myLondon2012: &lt;a href="http://goo.gl/28tnz"&gt;http://goo.gl/28tnz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related Post:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/07/androidwebkitwebview.html"&gt;android.webkit.WebView&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/08/more-on-webview-override-url-loading.html"&gt;More on WebView, override url loading&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/08/enable-javascript-and-built-in-zoom.html"&gt;Enable JavaScript and built-in zoom control of WebView&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/08/display-progress-bar-on-webview-when.html"&gt;Display Progress Bar on WebView when loading&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/08/handle-back-button-in-webview-to-back.html"&gt;Handle the Back button in WebView, to back in history&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-551699695505093223?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0_X_A1-HYVr9mcKZRIp4U2xILuw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0_X_A1-HYVr9mcKZRIp4U2xILuw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0_X_A1-HYVr9mcKZRIp4U2xILuw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0_X_A1-HYVr9mcKZRIp4U2xILuw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/551699695505093223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2011/12/create-your-own-london-2012-app.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/551699695505093223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/551699695505093223?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2011/12/create-your-own-london-2012-app.html" title="Create your own London 2012 App" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-eYgDJMo-1MI/Tu9FwfSWBaI/AAAAAAAAAX8/5jM7rI7_wPM/s72-c/myLondon2012.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUcGRnwyfyp7ImA9WhRQGEU.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5978852217987761007</id><published>2011-12-14T10:22:00.001-08:00</published><updated>2011-12-14T10:23:47.297-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-14T10:23:47.297-08:00</app:edited><title>Copy part of Bitmap</title><content type="html">Last post &lt;a href="http://android-coding.blogspot.com/2011/12/copy-bitmap-using-getpixels-and.html"&gt;Copy bitmap using getPixels() and setPixels()&lt;/a&gt; show how to copy a whole Bitmap using getPixels() and setPixels(). It can be used to copy part of a Bitmap.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-6JEstwMpCe4/Tujpd8KkyPI/AAAAAAAAAXk/QmRqjekonMc/s1600/CopyBitmap_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://2.bp.blogspot.com/-6JEstwMpCe4/Tujpd8KkyPI/AAAAAAAAAXk/QmRqjekonMc/s400/CopyBitmap_02.png" alt="Copy part of Bitmap" title="Copy part of Bitmap" id="BLOGGER_PHOTO_ID_5686051230131210482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidCopyBitmap;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Matrix;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ImageView;&lt;br /&gt;&lt;br /&gt;public class AndroidCopyBitmapActivity extends Activity {&lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        ImageView image1 = (ImageView)findViewById(R.id.image1);&lt;br /&gt;        ImageView image2 = (ImageView)findViewById(R.id.image2);&lt;br /&gt;        &lt;br /&gt;        Bitmap oldBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);&lt;br /&gt;        &lt;br /&gt;        int orgWidth = oldBitmap.getWidth();&lt;br /&gt;        int orgHeight = oldBitmap.getHeight();&lt;br /&gt;        &lt;br /&gt;        int firstx, firsty;&lt;br /&gt;        int halfWidth = orgWidth/2;&lt;br /&gt;        int halfHeight = orgHeight/2;&lt;br /&gt;        &lt;br /&gt;        //Create a same size Bitmap&lt;br /&gt;        Bitmap newBitmap = Bitmap.createBitmap(orgWidth, orgHeight, Bitmap.Config.ARGB_8888);&lt;br /&gt;        //Create a pixel of 1/4 size, to copy part of the bitmap&lt;br /&gt;        int[] pixels = new int[halfWidth * halfHeight];&lt;br /&gt;        &lt;br /&gt;        //Copy Upper-Left part to Bottom-Right&lt;br /&gt;        oldBitmap.getPixels(pixels, 0, halfWidth, 0, 0, halfWidth, halfHeight);&lt;br /&gt;        newBitmap.setPixels(pixels, 0, halfWidth, halfWidth, halfHeight, halfWidth, halfHeight);&lt;br /&gt;         &lt;br /&gt;        //Copy Bottom-Right to Upper-Left part&lt;br /&gt;        oldBitmap.getPixels(pixels, 0, halfWidth, halfWidth, halfHeight, halfWidth, halfHeight);&lt;br /&gt;        newBitmap.setPixels(pixels, 0, halfWidth, 0, 0, halfWidth, halfHeight);&lt;br /&gt;        &lt;br /&gt;        //Copy Bottom-Left part to Upper-Right&lt;br /&gt;        oldBitmap.getPixels(pixels, 0, halfWidth, 0, halfHeight, halfWidth, halfHeight);&lt;br /&gt;        newBitmap.setPixels(pixels, 0, halfWidth, halfWidth, 0, halfWidth, halfHeight);&lt;br /&gt;         &lt;br /&gt;        //Copy Upper-Right to Bottom-Left part&lt;br /&gt;        oldBitmap.getPixels(pixels, 0, halfWidth, halfWidth, 0, halfWidth, halfHeight);&lt;br /&gt;        newBitmap.setPixels(pixels, 0, halfWidth, 0, halfHeight, halfWidth, halfHeight);&lt;br /&gt;         &lt;br /&gt;        image1.setImageBitmap(oldBitmap);&lt;br /&gt;        image2.setImageBitmap(newBitmap);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5978852217987761007?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0Rmx1bKnDOsesHODI1JUxk7UH6w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0Rmx1bKnDOsesHODI1JUxk7UH6w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0Rmx1bKnDOsesHODI1JUxk7UH6w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0Rmx1bKnDOsesHODI1JUxk7UH6w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5978852217987761007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2011/12/copy-part-of-bitmap.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5978852217987761007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5978852217987761007?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2011/12/copy-part-of-bitmap.html" title="Copy part of Bitmap" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6JEstwMpCe4/Tujpd8KkyPI/AAAAAAAAAXk/QmRqjekonMc/s72-c/CopyBitmap_02.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUYAQH0yfyp7ImA9WhRQGEU.&quot;"><id>tag:blogger.com,1999:blog-2865777313825124004.post-5383711081884910643</id><published>2011-12-13T00:25:00.001-08:00</published><updated>2011-12-14T10:25:41.397-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-14T10:25:41.397-08:00</app:edited><title>Copy bitmap using getPixels() and setPixels()</title><content type="html">Example of copy bitmap using Bitmap.getPixels() and Bitmap.setPixels().&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-AIMX-xF12I8/TucMYcIc9KI/AAAAAAAAAXY/eiVFnjNhaKc/s1600/CopyBitmap.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 400px;" src="http://3.bp.blogspot.com/-AIMX-xF12I8/TucMYcIc9KI/AAAAAAAAAXY/eiVFnjNhaKc/s400/CopyBitmap.png" alt="Copy bitmap using getPixels() and setPixels()" title="Copy bitmap using getPixels() and setPixels()" id="BLOGGER_PHOTO_ID_5685526668586579106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.AndroidCopyBitmap;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Matrix;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ImageView;&lt;br /&gt;&lt;br /&gt;public class AndroidCopyBitmapActivity extends Activity {&lt;br /&gt;   /** Called when the activity is first created. */&lt;br /&gt;   @Override&lt;br /&gt;   public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;       super.onCreate(savedInstanceState);&lt;br /&gt;       setContentView(R.layout.main);&lt;br /&gt;       ImageView image1 = (ImageView)findViewById(R.id.image1);&lt;br /&gt;       ImageView image2 = (ImageView)findViewById(R.id.image2);&lt;br /&gt;      &lt;br /&gt;       Bitmap oldBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);&lt;br /&gt;      &lt;br /&gt;       int orgWidth = oldBitmap.getWidth();&lt;br /&gt;       int orgHeight = oldBitmap.getHeight();&lt;br /&gt;       &lt;br /&gt;       Bitmap newBitmap = Bitmap.createBitmap(orgWidth, orgHeight, Bitmap.Config.ARGB_8888);&lt;br /&gt;       int[] pixels = new int[orgWidth * orgHeight];&lt;br /&gt;       oldBitmap.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight);&lt;br /&gt;       newBitmap.setPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight);&lt;br /&gt;       &lt;br /&gt;       image1.setImageBitmap(oldBitmap);&lt;br /&gt;       image2.setImageBitmap(newBitmap);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout 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"&lt;br /&gt;   android:orientation="vertical" &amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;TextView&lt;br /&gt;       android:layout_width="fill_parent"&lt;br /&gt;       android:layout_height="wrap_content"&lt;br /&gt;       android:text="@string/hello" /&amp;gt;&lt;br /&gt;   &amp;lt;ImageView&lt;br /&gt;       android:id="@+id/image1"&lt;br /&gt;       android:layout_width="wrap_content"&lt;br /&gt;       android:layout_height="wrap_content" /&amp;gt;&lt;br /&gt;   &amp;lt;ImageView&lt;br /&gt;       android:id="@+id/image2"&lt;br /&gt;       android:layout_width="wrap_content"&lt;br /&gt;       android:layout_height="wrap_content" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;next:&lt;br /&gt;- &lt;a href="http://android-coding.blogspot.com/2011/12/copy-part-of-bitmap.html"&gt;Copy part of Bitmap&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2865777313825124004-5383711081884910643?l=android-coding.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j4fYbjJjEv2nixKJLaRqeA8s19I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j4fYbjJjEv2nixKJLaRqeA8s19I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j4fYbjJjEv2nixKJLaRqeA8s19I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j4fYbjJjEv2nixKJLaRqeA8s19I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://android-coding.blogspot.com/feeds/5383711081884910643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://android-coding.blogspot.com/2011/12/copy-bitmap-using-getpixels-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5383711081884910643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2865777313825124004/posts/default/5383711081884910643?v=2" /><link rel="alternate" type="text/html" href="http://android-coding.blogspot.com/2011/12/copy-bitmap-using-getpixels-and.html" title="Copy bitmap using getPixels() and setPixels()" /><author><name>Eric@android-coding.blogspot.com</name><uri>http://www.blogger.com/profile/01269407937760285746</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://3.bp.blogspot.com/_sfxUTOTXTng/TPGM31dQWEI/AAAAAAAAAAM/uwFYEaWfv4o/S220/android.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-AIMX-xF12I8/TucMYcIc9KI/AAAAAAAAAXY/eiVFnjNhaKc/s72-c/CopyBitmap.png" height="72" width="72" /><thr:total>0</thr:total></entry></feed>

