Project: CityBikes
package net.homelinux.penecoptero.android.citybikes.view;
 
import net.homelinux.penecoptero.android.citybikes.utils.CircleHelper; 
import android.R; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.LinearGradient; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.Path; 
import android.graphics.Point; 
import android.graphics.RectF; 
import android.graphics.Shader; 
import android.util.AttributeSet; 
import android.view.View; 
 
public class FlingTooltip extends View { 
 private Paint rightPaint; 
 private Paint leftPaint; 
 private int height, width; 
 private float scale; 
  
 private static final float LINE_WIDTH = 3
 private static final float MARGINS = 50
 private static final float ARROW_WIDTH = 20
 private static final int DIRECTION_RIGHT = 0
 private static final int DIRECTION_LEFT = 1
  
 private int line_width; 
 private int margins; 
 private int arrow_width; 
  
 private int direction; 
  
 public FlingTooltip(Context context) { 
  super(context); 
  init(context); 
  // TODO Auto-generated constructor stub 
 
 
 public FlingTooltip(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  init(context); 
  // TODO Auto-generated constructor stub 
 
  
 public void setDirection (int direction){ 
  this.direction = direction; 
 
  
 private void init(Context context){ 
  height = getMeasuredHeight(); 
  width = getMeasuredWidth(); 
  scale = context.getResources().getDisplayMetrics().density; 
   
  line_width = CircleHelper.dip2px(LINE_WIDTH, scale); 
  margins = CircleHelper.dip2px(MARGINS, scale); 
  arrow_width = CircleHelper.dip2px(ARROW_WIDTH, scale); 
   
  rightPaint = new Paint(); 
  rightPaint.setStyle(Style.FILL); 
  rightPaint.setStrokeWidth(1); 
  rightPaint.setAntiAlias(true); 
  rightPaint.setARGB(18019121085); 
  int startRight= Color.rgb(19121085); 
  int endRight = Color.rgb(14718643); 
  Shader rightShader = new LinearGradient(00, width, arrow_width* (float0.835, startRight, endRight, Shader.TileMode.REPEAT); 
  //rightPaint.setShader(rightShader); 
   
  leftPaint = new Paint(); 
  leftPaint.setStyle(Style.FILL); 
  leftPaint.setStrokeWidth(1); 
  leftPaint.setAntiAlias(true); 
  leftPaint.setARGB(180147186228); 
  int startLeft = Color.rgb(147186228); 
  int endLeft = Color.rgb( 95121150); 
  Shader leftShader = new LinearGradient(00, width, arrow_width * (float0.835 , startLeft, endLeft, Shader.TileMode.REPEAT); 
  //leftPaint.setShader(leftShader); 
   
   
 
 
 @Override 
    protected void dispatchDraw(Canvas canvas) { 
  Paint paint; 
  if (direction == DIRECTION_RIGHT){ 
   paint = rightPaint; 
  else { 
   paint = rightPaint; 
  
  canvas.drawPath( 
    createArrow( 
      new Point(margins,height/2), 
      new Point(width-margins, height/2),  
      arrow_width, line_width, direction), paint); 
  super.dispatchDraw(canvas); 
 
  
 public static Path createArrow(Point left, Point right, int width, int line_width, int direction) 
 
  Path path = new Path(); 
  if (direction == DIRECTION_LEFT){ 
   Point tmp = right; 
   right = left; 
   left = tmp; 
  }else
    
  
  float radius = (float) (width * 0.45); 
  double angle = Math.atan2(right.y - left.y, right.x - left.x); 
  path.setFillType(Path.FillType.WINDING); 
  RectF oval = new RectF(left.x-radius, left.y - radius, left.x + radius, left.y + radius); 
  path.addOval(oval, Path.Direction.CCW); 
  if (direction == DIRECTION_LEFT){ 
   RectF line = new RectF(left.x, left.y - line_width, right.x+width/2, right.y + line_width); 
   path.addRect(line, Path.Direction.CW); 
  }else
   RectF line = new RectF(left.x, left.y - line_width, right.x-width/2, right.y + line_width); 
   path.addRect(line, Path.Direction.CCW); 
  
    
  path.moveTo(left.x, left.y); 
  path.moveTo(right.x, right.y); 
  path.lineTo(right.x - width * (float) Math.cos(angle - Math.PI / 6) ,right.y - width * (float) Math.sin(angle - Math.PI / 6) ); 
  path.moveTo(right.x, right.y); 
  path.lineTo(right.x - width * (float) Math.cos(angle + Math.PI / 6) ,right.y - width * (float) Math.sin(angle + Math.PI / 6) ); 
  path.lineTo(right.x - width * (float) Math.cos(angle - Math.PI / 6) ,right.y - width * (float) Math.sin(angle - Math.PI / 6) ); 
   
  return path; 
   
 
  
  @Override 
  protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
   // TODO Auto-generated method stub 
   super.onSizeChanged(w, h, oldw, oldh); 
   height = h; 
   width = w; 
  
}