LayerTrack.java :  » Utilities » tripcomputer » pl » tripcomputer » layers » Android Open Source

Android Open Source » Utilities » tripcomputer 
tripcomputer » pl » tripcomputer » layers » LayerTrack.java
package pl.tripcomputer.layers;

import android.graphics.*;
import pl.tripcomputer.MainDraw;
import pl.tripcomputer.R;
import pl.tripcomputer.common.CommonActivity;
import pl.tripcomputer.loader.TrackItem;
import pl.tripcomputer.map.*;


public class LayerTrack extends Layer
{
  //fields
  private final static int iPointRadius = 5;
  
  //fields
  private Paint mPaintTrack = new Paint();
  private Paint mPaintPoint = new Paint();  
  private Paint mPointLabel = new Paint();
  
  private CornerPathEffect pathEffectCorner = new CornerPathEffect(6);
  
  private Typeface tfBold = Typeface.create((String)null, Typeface.BOLD);
  
  private Path mPath = new Path();
  
  private ScreenPoint screenPoint = new ScreenPoint();
  private ScreenPoint screenPointStart = new ScreenPoint();
  private ScreenPoint screenPointFinish = new ScreenPoint();
  
  private RectF rtPoint = new RectF();
  private Rect rtLabelStart = new Rect(0, 0, 0, 0);
  private Rect rtLabelFinish = new Rect(0, 0, 0, 0);
  
  private Boolean bResetViewPort = false;
  private Boolean bUpdateDrawPath = false;
  
  private String sLabelStart = null;
  private String sLabelFinish = null;
  private String sLabelLastPosition = null;

  private GeoPoint pointStart = null;
  private GeoPoint pointFinish = null;
  
  //fields
  private TrackItem trackItem = null;  
  

  //methods
  public LayerTrack(CommonActivity parent, Screen screen, TrackItem trackItem)
  {
    super(parent, screen);
    
    this.trackItem = trackItem;
    
    //get strings
    sLabelStart = parent.getString(R.string.label_track_point_start);
    sLabelFinish = parent.getString(R.string.label_track_point_finish);
    sLabelLastPosition = parent.getString(R.string.label_track_point_last_position);
    
    //paint track
    mPaintTrack.setAntiAlias(true);
    mPaintTrack.setARGB(255, 0, 0, 0);
    mPaintTrack.setStrokeWidth(4);
    mPaintTrack.setStyle(Paint.Style.STROKE);
    mPaintTrack.setStrokeCap(Paint.Cap.ROUND);
    mPaintTrack.setStrokeJoin(Paint.Join.ROUND);
    
    //paint point
    mPaintPoint.setAntiAlias(true);
    mPaintPoint.setColor(0xff000000);
    mPaintPoint.setStrokeWidth(1);
    mPaintPoint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaintPoint.setStrokeCap(Paint.Cap.ROUND);
    mPaintPoint.setStrokeJoin(Paint.Join.ROUND);
    
    //paint label    
    mPointLabel.setAntiAlias(true);
    mPointLabel.setTextSize(12);
    
    //get text bounds
    mPointLabel.getTextBounds(sLabelStart, 0, sLabelStart.length(), rtLabelStart);
    mPointLabel.getTextBounds(sLabelFinish, 0, sLabelFinish.length(), rtLabelFinish);
  }

  public void initData()
  {
  }
  
  public void surfaceSizeChanged(int width, int height, int iScreenOrientation)
  {
  }
  
  public void setUpdateDrawPath()
  {
    synchronized(bUpdateDrawPath)
    {
      bUpdateDrawPath = true;
    }
  }

  public void setResetViewPort()
  {
    synchronized(bResetViewPort)
    {
      if (parent.getMainState().allowObjectResetView())
      {
        bResetViewPort = true;
      }
    }
  }

  private void resetViewPort()
  {
    if (trackItem.isEmpty())
      return;

    synchronized(trackItem.trackPoints)
    {
      if (trackItem.isSelected())
      {
        screen.resetViewPort(trackItem.trackPoints, Screen.RESET_VIEWPORT_MODE_TRACK);
      }
    }
  }
  
  private void updateDrawPath()
  {
    if (trackItem.isEmpty())
      return;
    
    synchronized(trackItem.trackPoints)
    {    
      //process path
      synchronized(mPath)
      {
        mPath.reset();
        for (int i = 0; i < trackItem.trackPoints.size(); i++)
        {
          screen.toScreenPoint(trackItem.trackPoints.get(i), screenPoint);                            
          if (i == 0)
          {
            mPath.moveTo(screenPoint.x, screenPoint.y);
          } else {
            mPath.lineTo(screenPoint.x, screenPoint.y);
          }
        }
      }
      
      //get start and finish points      
      pointStart = null;
      pointFinish = null;
      
      pointStart = trackItem.trackPoints.get(0);
            
      final int iPointsCount = trackItem.trackPoints.size();      
      if (iPointsCount > 1)
      {        
        pointFinish = trackItem.trackPoints.get(iPointsCount - 1);
      }
    }
  }
  
  public void doDraw(Canvas cs, Rect rtBounds)
  {  
    synchronized(bResetViewPort)
    {
      if (bResetViewPort)
      {
        bResetViewPort = false;
        resetViewPort();
      }
    }
    
    synchronized(bUpdateDrawPath)
    {
      if (bUpdateDrawPath)
      {
        bUpdateDrawPath = false;
        updateDrawPath();
      }
    }

    //set track color
    if (trackItem.isSelected())
    {
      if (trackItem.isRecording())
      {
        mPaintTrack.setColor(0xffff0000);    
      } else {
        mPaintTrack.setColor(0xff888888);        
      }
    } else {
      if (trackItem.isRecording())
      {
        mPaintTrack.setColor(0xffff8888);
      } else {
        mPaintTrack.setColor(0xffcccccc);
      }
    }

    //draw track
    synchronized(mPath)
    {
      mPaintTrack.setPathEffect(pathEffectCorner);
      
      MainDraw.compassRotation.set(cs);
      
      cs.drawPath(mPath, mPaintTrack);
      
      MainDraw.compassRotation.clear(cs);
      
      mPaintTrack.setPathEffect(null);
    }

    //draw start and finish points
    drawLimitPoints(cs);
  }
  
  private void drawLimitPoints(Canvas cs)
  {
    if (trackItem.isEmpty())
      return;
    
    mPointLabel.setTypeface(tfBold);
    
    synchronized(trackItem.trackPoints)
    {
      //draw start point
      if (pointStart != null)
      {
        screen.toScreenPoint(pointStart, screenPointStart);
        drawPoint(cs, screenPointStart, true, sLabelStart, rtLabelStart);        
      }
            
      //draw finish point
      if (pointFinish != null)
      {
        screen.toScreenPoint(pointFinish, screenPointFinish);
        
        if (trackItem.isClosed())
          drawPoint(cs, screenPointFinish, false, sLabelFinish, rtLabelFinish);
        else
          drawPoint(cs, screenPointFinish, false, sLabelLastPosition, rtLabelFinish);        
      }      
    }
  }
  
  private void drawPoint(Canvas cs, ScreenPoint coords, boolean bStartPoint, String sLabel, Rect rtLabel)
  {    
    //transform point with compass rotation
    MainDraw.compassRotation.transformPoint(coords);

    //draw border
    rtPoint.set(coords.x - iPointRadius, coords.y - iPointRadius, coords.x + iPointRadius, coords.y + iPointRadius);

    mPaintPoint.setColor(0xff000000);
    cs.drawOval(rtPoint, mPaintPoint);

    //fill inner
    rtPoint.inset(2, 2);
    
    mPaintPoint.setColor(0xffcccccc);
    cs.drawOval(rtPoint, mPaintPoint);

    //draw point label
    if (bStartPoint)
    {
      mPointLabel.setColor(0xff442200);
    } else {
      if (trackItem.isRecording())
      {
        mPointLabel.setColor(0xffff4444);        
      } else {
        mPointLabel.setColor(0xffff8800);
      }
    }
    
    cs.drawText(sLabel, coords.x + 8, coords.y + rtLabel.height() + 3, mPointLabel);
  }
    
  public void updateObjectsState()
  {
  }
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.