title: Getting all points in Path in android - FingerPaint.java
body: <p>I tried to get all the x,y coordinates that are drawn in the path on the canvas. But i couldn't get the points. I am getting only a few points. Why is that?</p>
  
  <p>Is there any way i can get all the x and y points?</p>
  
  <p>I use FingerPaint.java as a starting point.</p>
  
  <p><a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html" rel="nofollow">Link to Original FingerPaint.java</a></p>
  
  <p>Here is the code i modified and using:</p>
  
  <pre><code>package com.schogini.whiteboard;
  
  import java.util.ArrayList;
  import java.util.StringTokenizer;
  
  import android.app.Activity;
  import android.content.Context;
  import android.graphics.*;
  import android.os.Bundle;
  import android.util.DisplayMetrics;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuInflater;
  import android.view.MenuItem;
  import android.view.MotionEvent;
  import android.view.View;
  //import android.widget.Toast;
  
  public class FingerPaint extends Activity  implements ColorPickerDialog.OnColorChangedListener {
      //color - ARGB
      int a = 255;
      int r = 255;
      int g = 0;
      int b = 0;
  
      //erase Flag
      boolean eraseFlag=false;
      //Internet Posting
      static String toSend;
      static String parseStr;
  
      //array for storing x,y,r,g,b,a
      static ArrayList&lt;String&gt; rArray,gArray,bArray,alphaArray,xPointArray,yPointArray;
      //ArrayList&lt;String&gt; rArray_in,gArray_in,bArray_in,alphaArray_in,xPointArray_in,yPointArray_in;
  
      //Drawing types
      private static Paint mPaint;
      private MaskFilter  mEmboss;
      private MaskFilter  mBlur;
  
      //touch - Path Coordinates
      private static float mX;
      private static float mY;
  
      //MyView object
      MyView m;
  
      //point populate
      float dx,dy,distance;
      int dd,ii;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          m = new MyView(FingerPaint.this);
          setContentView(m);
  
          //move to appropriate module
          rArray = new ArrayList&lt;String&gt;(); 
          gArray = new ArrayList&lt;String&gt;();
          bArray = new ArrayList&lt;String&gt;();
          alphaArray = new ArrayList&lt;String&gt;();
          xPointArray = new ArrayList&lt;String&gt;();
          yPointArray = new ArrayList&lt;String&gt;();
  
          mPaint = new Paint();
          mPaint.setAntiAlias(true);
          mPaint.setDither(true);
          mPaint.setColor(0xFFFF0000);
          mPaint.setStyle(Paint.Style.STROKE);
          mPaint.setStrokeJoin(Paint.Join.ROUND);
          mPaint.setStrokeCap(Paint.Cap.ROUND);
  
          //width of the drawing brush
          mPaint.setStrokeWidth(12);
  
          mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);
          mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
      }
  
      public void parsing(String str22){
           //example string received from server
  //      parseStr = "255,0,0,1.0,88.0,100.0||255,0,0,1.0,88.0,101.0||255,0,0,1.0,88.0,102.0||255,0,0,1.0,88.0,103.0||255,0,0,1.0,88.0,104.0||255,0,0,1.0,88.0,105.0||255,0,0,1.0,88.0,106.0||255,0,0,1.0,88.0,107.0||255,0,0,1.0,88.0,108.0," +
  //              "||255,0,0,1.0,88.0,109.0||255,0,0,1.0,88.0,110.0||255,0,0,1.0,88.0,111.0||255,0,0,1.0,88.0,112.0||255,0,0,1.0,88.0,113.0||255,0,0,1.0,88.0,114.0||255,0,0,1.0,88.0,115.0||255,0,0,1.0,88.0,116.0||255,0,0,1.0,88.0,117.0," +
  //              "||255,0,0,1.0,88.0,118.0||255,0,0,1.0,88.0,119.0||255,0,0,1.0,88.0,120.0||255,0,0,1.0,80.0,100.0||255,0,0,1.0,81.0,100.0||255,0,0,1.0,82.0,100.0||255,0,0,1.0,83.0,100.0||255,0,0,1.0,84.0,100.0||255,0,0,1.0,85.0,100.0," +
  //              "||255,0,0,1.0,86.0,100.0||255,0,0,1.0,87.0,100.0||255,0,0,1.0,88.0,100.0||255,0,0,1.0,89.0,100.0||255,0,0,1.0,91.0,100.0||255,0,0,1.0,92.0,100.0||255,0,0,1.0,93.0,100.0||255,0,0,1.0,94.0,100.0||255,0,0,1.0,95.0,100.0," +
  //              "||255,0,0,1.0,96.0,100.0||255,0,0,1.0,97.0,100.0||255,0,0,1.0,98.0,100.0||255,0,0,1.0,99.0,100.0||255,0,0,1.0,100.0,100.0||255,0,0,1.0,101.0,100.0||255,0,0,1.0,102.0,100.0||255,0,0,1.0,103.0,100.0,";
          parseStr="255,0,0,255,85.351585,90.17996||255,0,0,255,85.351585,90.17996||255,0,0,255,123.97784,80.883064||255,0,0,255,164.47311,71.58616||255,0,0,255,182.22874,65.543175||255,0,0,255,233.9381,48.3439||255,0,0,255,247.95567,42.30091||255,0,0,255,252.62822,40.441532||255,0,0,255,252.62822,40.441532||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,151.70154,133.41057||255,0,0,255,190.3278,118.07068||255,0,0,255,235.18411,98.54717||255,0,0,255,248.57867,92.03935||255,0,0,255,256.36627,89.71512||255,0,0,255,257.30078,89.250275||255,0,0,255,257.30078,89.250275||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,116.50179,258.91876||255,0,0,255,152.63605,240.7898||255,0,0,255,209.95244,215.68816||255,0,0,255,239.23363,199.41858||255,0,0,255,249.8247,192.4459||255,0,0,255,261.35028,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,48.905834,62.7541||255,0,0,255,39.56077,133.87541||255,0,0,255,44.856304,185.93808||255,0,0,255,53.578365,266.82114||255,0,0,255,53.578365,287.27435||255,0,0,255,51.70935,301.6845||255,0,0,255,51.39785,303.07904||255,0,0,255,51.086346,303.5439||255,0,0,255,51.086346,303.5439||255,0,0,255,90.02411,362.57922||255,0,0,255,88.155106,355.14172||255,0,0,255,109.02575,317.0244||255,0,0,255,133.01141,323.53226||255,0,0,255,155.43958,340.26666||255,0,0,255,166.65363,344.91513||255,0,0,255,185.03226,338.4073||255,0,0,255,193.13133,326.78616||255,0,0,255,210.26395,292.38763||255,0,0,255,228.01956,296.10638||255,0,0,255,259.7928,283.09073||255,0,0,255,266.33432,263.5672||255,0,0,255,267.58032,258.91876||255,0,0,255,269.76086,256.1297||255,0,0,255,271.94138,255.20001||255,0,0,255,284.71295,248.22733||255,0,0,255,294.3695,232.42259||255,0,0,255,297.48453,212.8991||255,0,0,255,297.48453,212.8991||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,113.07527,194.77013||255,0,0,255,141.73346,178.9654||255,0,0,255,144.8485,179.43024||255,0,0,255,166.96513,192.4459||255,0,0,255,170.70317,195.23497||255,0,0,255,193.75432,195.69983||255,0,0,255,201.85338,185.93808||255,0,0,255,212.75597,146.42624||255,0,0,255,217.4285,136.19965||255,0,0,255,231.44609,135.26996||255,0,0,255,241.41415,136.66449||255,0,0,255,250.13622,136.19965||255,0,0,255,279.41742,128.76212||255,0,0,255,312.12512,100.406555||255,0,0,255,312.12512,100.406555||255,0,0,255,92.20462,52.527508||255,0,0,255,92.20462,52.527508||255,0,0,255,159.48909,44.160294||255,0,0,255,186.90128,34.398544||255,0,0,255,242.97165,20.918034||255,0,0,255,269.13785,13.48051||255,0,0,255,288.76245,11.62113||255,0,0,255,288.76245,11.62113,";
  
          StringTokenizer tokens = new StringTokenizer(parseStr, "||");
          while(tokens.hasMoreTokens())
          {
              String second = tokens.nextToken();
              StringTokenizer tempTokens = new StringTokenizer(second, ",");
              int index = 0;
              while(tempTokens.hasMoreTokens())
              {
                  String splitStr = tempTokens.nextToken();
                  switch (index%6) {
                  case 0:
                      rArray.add(splitStr);
                      break;
                  case 1:
                      gArray.add(splitStr);
                      break;
                  case 2:
                      bArray.add(splitStr);
                      break;
                  case 3:
                      alphaArray.add(splitStr);
                      break;
                  case 4:
                      xPointArray.add(splitStr);
                      break;
                  case 5:
                      yPointArray.add(splitStr);
                      break;
                  default:
                      break;
                  }
                  index++;
                  Log.v("String44"," value = "+splitStr);
              }
          }
          m.redraw();
      }
  
      public void colorChanged(int color) {
          mPaint.setColor(color);
  
          //method to convert integer color to r g b a
          b = (color)&amp;0xFF;
          g = (color&gt;&gt;8)&amp;0xFF;
          r = (color&gt;&gt;16)&amp;0xFF;
          a = Math.round(((color&gt;&gt;&gt;24)/255)*10);
      }
  
      public class MyView extends View {
  
          private Bitmap mBitmap;
          private Canvas mCanvas;
          public Path mPath;
          public Paint mBitmapPaint;
  
          public MyView(Context c) {
              super(c);
  
              // reading screen size (for device Independence)
              DisplayMetrics displaymetrics = new DisplayMetrics();
              getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
  
              mBitmap = Bitmap.createBitmap(displaymetrics.widthPixels,displaymetrics.heightPixels, Bitmap.Config.ARGB_8888);
              mCanvas = new Canvas(mBitmap);
              mPath = new Path();
              mBitmapPaint = new Paint(Paint.DITHER_FLAG);
          }
  
          @Override
          protected void onSizeChanged(int w, int h, int oldw, int oldh) {
              super.onSizeChanged(w, h, oldw, oldh);
          }
  
          @Override
          protected void onDraw(Canvas canvas) {
              //background -- White
              canvas.drawColor(0xFFFFFFFF);
  
              //draw the bitmap from 0,0 the firstpoint in device's screen
              canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
              canvas.drawPath(mPath, mPaint);
          }
  
          public void touch_start(float x, float y) {
              //reset touch so that a new path is to be drawn
              mPath.reset();
              mPath.moveTo(x, y);
              mX = x;
              mY = y;
          }
  
          public void touch_move(float x, float y) {
              mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
  
  
              //point tracing
              tracePoints((int)x, (int)y,(int)mX,(int)mY);
              mX = x;
              mY = y;
          }
  
          public void touch_up() {
              mPath.lineTo(mX, mY);
              // commit the path to our offscreen
              mCanvas.drawPath(mPath, mPaint);
              // kill this so we don't double draw
              mPath.reset();
          }
  
          public void arrayPopulate(float atx,float aty){
  
              if(eraseFlag==false){
                  //entering points into arrayLists
                  xPointArray.add(""+atx); 
                  yPointArray.add(""+aty);
  
                  //add color as well
                  alphaArray.add(""+a); 
                  rArray.add(""+r);
                  gArray.add(""+g); 
                  bArray.add(""+b);
  
  //              if(toSend==null){
  //                  toSend=""+r+","+g+","+b+","+a+","+atx+","+aty+"||";
  //              }
  //              else{
  //                  toSend+=""+r+","+g+","+b+","+a+","+atx+","+aty+"||";
  //              }
  
                  //add data to a queue for sending to server
  
                 // Log.v("touch", toSend);
                  //send data here to server
                  //eraseFlag is true ends
              }
          }
  
          @Override
          public boolean onTouchEvent(MotionEvent event) {
              float x = event.getX();
              float y = event.getY();
              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                      touch_start(x, y);
                      arrayPopulate(x, y);
                      invalidate();
                      break;
                  case MotionEvent.ACTION_MOVE:
                      touch_move(x, y);
                      invalidate();
                      break;
                  case MotionEvent.ACTION_UP:
                      touch_up();
                      arrayPopulate(x, y);
                      invalidate();
                      break;
              }
              return true;
          }
  
          public void redraw() {
              int arraysize = FingerPaint.rArray.size();
  
              int index=0;
              float xx,yy;
  
              //setting properties of tPaint
              Paint tPaint= new Paint();
              tPaint.setAntiAlias(true);
              tPaint.setDither(true);
              tPaint.setStyle(Paint.Style.STROKE);
              tPaint.setStrokeJoin(Paint.Join.ROUND);
              tPaint.setStrokeCap(Paint.Cap.ROUND);
              tPaint.setColor(-16777216);
              tPaint.setStrokeWidth(12);
  
              while(index&lt;arraysize){
                      //tPaint.setARGB(Integer.parseInt(alphaArray.get(0)), Integer.parseInt(rArray.get(0)), Integer.parseInt(gArray.get(0)), Integer.parseInt(bArray.get(0)));
                      //tPaint.setColor(Color.argb(Integer.parseInt(alphaArray.get(0)), Integer.parseInt(rArray.get(0)), Integer.parseInt(gArray.get(0)), Integer.parseInt(bArray.get(0))));
  
                      xx=Float.parseFloat(xPointArray.get(index));
                      yy=Float.parseFloat(yPointArray.get(index));
  
                      m.mCanvas.drawPoint(xx,yy,tPaint);
                      m.invalidate();
                      index++;
                      Log.d("__REDRAW__", "X="+xx+"   Y="+yy);
                }
          }
      }
  
      //creating Options Menu - Inflater
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);
      return true;
      }
  
      //Option Menu Selection - Actions
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          mPaint.setXfermode(null);
          mPaint.setAlpha(255);
  
          switch (item.getItemId()) {
              case R.id.COLOR:
                  this.eraseFlag=false;
                  new ColorPickerDialog(this, this, mPaint.getColor()).show();
                  return true;
              case R.id.EMBOSS:
                  this.eraseFlag=false;
                  if (mPaint.getMaskFilter() != mEmboss) {
                      mPaint.setMaskFilter(mEmboss);
                  } else {
                      mPaint.setMaskFilter(null);
                  }
                  return true;
              case R.id.BLUR:
                  this.eraseFlag=false;
                  if (mPaint.getMaskFilter() != mBlur) {
                      mPaint.setMaskFilter(mBlur);
                  } else {
                      mPaint.setMaskFilter(null);
                  }
                  return true;
              case R.id.ERASE:
                  //for toggle detection
                  this.eraseFlag=true;
                  //reset blurr &amp; Emboss
                  mPaint.setMaskFilter(null);
                  mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                  return true;
              case R.id.REDRAW:
                  this.eraseFlag=false;
                  //redraw the drawn points
                  m.redraw();
                  return true;
          }
         return super.onOptionsItemSelected(item);
      }
  
      //Bressenham's mid-point algorithm for finding all points between any two points --- Straight line
      public void tracePoints(int xxx,int yyy,int x2, int y2) {
          int w = x2 - xxx ;
          int h = y2 - yyy ;
          int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ;
          if (w&lt;0) dx1 = -1 ; else if (w&gt;0) dx1 = 1 ;
          if (h&lt;0) dy1 = -1 ; else if (h&gt;0) dy1 = 1 ;
          if (w&lt;0) dx2 = -1 ; else if (w&gt;0) dx2 = 1 ;
          int longest = Math.abs(w) ;
          int shortest = Math.abs(h) ;
          if (!(longest&gt;shortest)) {
              longest = Math.abs(h) ;
              shortest = Math.abs(w) ;
              if (h&lt;0) dy2 = -1 ; else if (h&gt;0) dy2 = 1 ;
              dx2 = 0 ;            
          }
          int numerator = longest &gt;&gt; 1 ;
          for (int i=0;i&lt;=longest;i++) {
              m.arrayPopulate((float)xxx,(float)yyy) ;
              numerator += shortest ;
              if (!(numerator&lt;longest)) {
                  numerator -= longest ;
                  xxx += dx1 ;
                  yyy += dy1 ;
              } else {
                  xxx += dx2 ;
                  yyy += dy2 ;
              }
          }
      }
  }
  </code></pre>