package net.avenwu.support.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; /** * Created by chaobin on 12/25/14. */ public class PolygonWithQuadraticBezirView extends View { Paint mCirclePaint; float mPointOneX; float mPointOneY; float mPointTwoX; float mPointTwoY; float mPointOneRadius; float mPointTwoRadius; Path mPath; Paint mShape; float MAX_HORIZOTNAL_DISTANCE; float MAX_VERTICAL_DISTANCE; public PolygonWithQuadraticBezirView(Context context) { this(context, null); } public PolygonWithQuadraticBezirView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PolygonWithQuadraticBezirView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setColor(0xff00bcd4); DisplayMetrics metrics = context.getResources().getDisplayMetrics(); MAX_HORIZOTNAL_DISTANCE = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, metrics); MAX_VERTICAL_DISTANCE = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, metrics); mPointOneX = MAX_VERTICAL_DISTANCE * 0.4f; mPointOneY = mPointOneX; mPointTwoX = mPointOneX * 1.75f; mPointTwoY = MAX_HORIZOTNAL_DISTANCE * 0.5f; mPointOneRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, metrics); mPointTwoRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, metrics); mPath = new Path(); mShape = new Paint(Paint.ANTI_ALIAS_FLAG); mShape.setColor(Color.RED); mShape.setStyle(Paint.Style.STROKE); mShape.setStrokeWidth(1); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.TRANSPARENT); canvas.drawCircle(mPointOneX, mPointOneY, mPointOneRadius, mCirclePaint); canvas.drawCircle(mPointTwoX, mPointTwoY, mPointTwoRadius, mCirclePaint); mPath.reset(); float d = (float) Math.sqrt(Math.pow(mPointTwoX - mPointOneX, 2) + Math.pow(mPointTwoY - mPointOneY, 2)); float midX = (mPointOneX + mPointTwoX) / 2.0f; float midY = (mPointOneY + mPointTwoY) / 2.0f; float k = (mPointTwoY - mPointOneY) / (mPointTwoX - mPointOneX); float offsetX = (float) (mPointOneRadius * Math.sin(Math.atan(k))); float offsetY = (float) (mPointOneRadius * Math.cos(Math.atan(k))); float offsetX2 = (float) (mPointTwoRadius * Math.sin(Math.atan(k))); float offsetY2 = (float) (mPointTwoRadius * Math.cos(Math.atan(k))); float x1 = mPointOneX - offsetX; float y1 = mPointOneY + offsetY; float x2 = mPointTwoX - offsetX2; float y2 = mPointTwoY + offsetY2; float x3 = mPointTwoX + offsetX2; float y3 = mPointTwoY - offsetY2; float x4 = mPointOneX + offsetX; float y4 = mPointOneY - offsetY; mPath.moveTo(x1, y1); mPath.quadTo(midX, midY, x2, y2); mPath.lineTo(x3, y3); mPath.quadTo(midX, midY, x4, y4); mPath.lineTo(x1, y1); canvas.drawPath(mPath, mShape); } public void setFilled(boolean fill) { if (fill) { mShape.setStyle(Paint.Style.FILL); mShape.setColor(mCirclePaint.getColor()); } else { mShape.setStyle(Paint.Style.STROKE); mShape.setColor(Color.RED); } invalidate(); } public void moveHorizontal(float percent) { mPointTwoX = MAX_HORIZOTNAL_DISTANCE * percent; invalidate(); } public void moveVertical(float percent) { mPointTwoY = MAX_VERTICAL_DISTANCE * percent; invalidate(); } }