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(180, 191, 210, 85);
int startRight= Color.rgb(191, 210, 85);
int endRight = Color.rgb(147, 186, 43);
Shader rightShader = new LinearGradient(0, 0, width, arrow_width* (float) 0.835, startRight, endRight, Shader.TileMode.REPEAT);
//rightPaint.setShader(rightShader);
leftPaint = new Paint();
leftPaint.setStyle(Style.FILL);
leftPaint.setStrokeWidth(1);
leftPaint.setAntiAlias(true);
leftPaint.setARGB(180, 147, 186, 228);
int startLeft = Color.rgb(147, 186, 228);
int endLeft = Color.rgb( 95, 121, 150);
Shader leftShader = new LinearGradient(0, 0, width, arrow_width * (float) 0.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;
}
}