title: Horizontal Scroll View with Custom View child
body: <p>I am trying to implement a custom view inside of a HorizontalScrollView parent. The custom view repeatedly draws a line to its Canvas based on timing from a Handler. I want to set the <strong>visible</strong> width of the Custom view to be 1207px x 548px, but I want the line to be able to extend beyond what is visible and I want to allow the user to then be able to horizontally scroll to see more of the line. Before I was just surrounding my Custom View class with a frame layout with a fixed width and height, which obviously didn't allow any scrolling. Now when I try using the layout below, everything just comes out black (the background on the Custom View is white).</p>
  
  <p>I am developing on an ASUS Transformer with Honeycomb.</p>
  
  <p>Here's the relevant part of the layout I'm using:</p>
  
  <pre><code>&lt;HorizontalScrollView
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="548dp" &gt;
  
      &lt;maavapp.layout.CustomDraw
          android:id="@+id/custom_draw"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent" &gt;
      &lt;/maavapp.layout.CustomDraw&gt;
  &lt;/HorizontalScrollView&gt;
  </code></pre>
  
  <p>And here is the code for the CustomDraw class in case that's necessary:</p>
  
  <pre><code>public class CustomDraw extends View {
  private static int mSelected;
  private ArrayList&lt;Coordinate&gt; measure1;
  private ArrayList&lt;Coordinate&gt; measure2;
  private ArrayList&lt;Coordinate&gt; measure3;
  private boolean north = false, east = true, south = true, west = false;
  private DrawHandler dh = new DrawHandler();
  private boolean draw = true;
  private int width;
  private int height;
  private int m2;
  
  public CustomDraw(Context context) {
      super(context);
      init();
  
  }
  
  public CustomDraw(Context context, AttributeSet attrs) {
      super(context, attrs);
      init();
  }
  
  public CustomDraw(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      init();
  }
  
  public void init() {        
      measure1 = new ArrayList&lt;Coordinate&gt;();
      measure2 = new ArrayList&lt;Coordinate&gt;();
      measure3 = new ArrayList&lt;Coordinate&gt;();
  
      mSelected = Constants.MEASURE_1;
      width = 0;
      height = 0;
      m2 = 0;
  }
  
  public void setMeasure(int measure) {
      mSelected = measure;
  }
  
  public void toggleDraw() {
      draw = !draw;
      if(draw) {
          updateLine();
      }
  }
  
  public boolean isDrawing() {
      return draw;
  }
  
  public void updateLine() {
      // grab new coordinates for each measure
      /*new_coord(measure1);
      new_coord(measure2);
      new_coord(measure3);*/
  
      if(measure1.isEmpty() &amp;&amp; measure2.isEmpty() &amp;&amp; measure3.isEmpty()) {
          measure1.add(new Coordinate(0, 0));
          measure2.add(new Coordinate(0, 0));
          measure3.add(new Coordinate(0, 0));
      } else {
          Coordinate last_coord = measure1.get(measure1.size() - 1);
  
          measure2.add(new Coordinate(++m2, 25));
  
          if(last_coord.x &gt;= width) {
              east = false;
              west = true;
          } else if(last_coord.x &lt;= 0) {
              east = true;
              west = false;
          }
  
          if(last_coord.y &gt;= height) {
              south = false;
              north = true;
          } else if(last_coord.y &lt;= 0) {
              south = true;
              north = false;
          }
  
          Log.d("MAAV", "last_coord.x + 3: " + (last_coord.x + 3));
          Log.d("MAAV", "last_coord.y + 3: " + (last_coord.y + 3));
  
          if(south &amp;&amp; east) {
              measure1.add(new Coordinate(last_coord.x + 3, last_coord.y + 3));
          } else if(south &amp;&amp; west) {
              measure1.add(new Coordinate(last_coord.x - 3, last_coord.y + 3));
          } else if(north &amp;&amp; east) {
              measure1.add(new Coordinate(last_coord.x + 3, last_coord.y - 3));
          } else if(north &amp;&amp; west) {
              measure1.add(new Coordinate(last_coord.x - 3, last_coord.y - 3));
          }
      }
  
      if(draw) {
          dh.sleep(10);
      }
  }
  
  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
      this.width = w;
      this.height = h;
      super.onSizeChanged(w, h, oldw, oldh);
  }
  
  @Override
  public void onDraw(Canvas c) {
      super.onDraw(c);
      Paint p = new Paint();
      p.setStyle(Paint.Style.FILL);
  
      p.setColor(Color.WHITE);
      c.drawPaint(p);
      p.setColor(Color.BLACK);
  
      switch(mSelected) {
      case Constants.MEASURE_1:
          for(int i = 0; i &lt; measure1.size(); i++) {
              Coordinate coord = measure1.get(i);
              Log.d("MAAV", "drawing coord.x, coord.y: " + (coord.x) + ", " + (coord.y));
              c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);  
          }
          break;
      case Constants.MEASURE_2:
          for(int i = 0; i &lt; measure2.size(); i++) {
              Coordinate coord = measure2.get(i);
              c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
          }
          break;
      case Constants.MEASURE_3:
          for(int i = 0; i &lt; measure2.size(); i++) {
              Coordinate coord = measure2.get(i);
              c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
          }
          break;
      }
  
  }
  
  class DrawHandler extends Handler {
  
      @Override
      public void handleMessage(Message msg) {
          CustomDraw.this.updateLine();
          CustomDraw.this.invalidate();
      }
  
      public void sleep(long delayMillis) {
          this.removeMessages(0);
          sendMessageDelayed(obtainMessage(0), delayMillis);
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Thanks for any help!</p>