diff --git a/android-canvas-donut-chart/AndroidManifest.xml b/android-canvas-donut-chart/AndroidManifest.xml new file mode 100644 index 0000000..d363509 --- /dev/null +++ b/android-canvas-donut-chart/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/android-canvas-donut-chart/res/layout/activity_main.xml b/android-canvas-donut-chart/res/layout/activity_main.xml new file mode 100644 index 0000000..8a52374 --- /dev/null +++ b/android-canvas-donut-chart/res/layout/activity_main.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/android-canvas-donut-chart/res/values/attrs.xml b/android-canvas-donut-chart/res/values/attrs.xml new file mode 100644 index 0000000..485e118 --- /dev/null +++ b/android-canvas-donut-chart/res/values/attrs.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android-canvas-donut-chart/res/values/dimens.xml b/android-canvas-donut-chart/res/values/dimens.xml new file mode 100644 index 0000000..55c1e59 --- /dev/null +++ b/android-canvas-donut-chart/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/android-canvas-donut-chart/res/values/strings.xml b/android-canvas-donut-chart/res/values/strings.xml new file mode 100644 index 0000000..004653b --- /dev/null +++ b/android-canvas-donut-chart/res/values/strings.xml @@ -0,0 +1,8 @@ + + + + Donut Chart + Hello world! + Settings + + diff --git a/android-canvas-donut-chart/res/values/styles.xml b/android-canvas-donut-chart/res/values/styles.xml new file mode 100644 index 0000000..845fb57 --- /dev/null +++ b/android-canvas-donut-chart/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/android-canvas-donut-chart/src/com/hmkcode/views/DonutChart.java b/android-canvas-donut-chart/src/com/hmkcode/views/DonutChart.java new file mode 100644 index 0000000..42e851d --- /dev/null +++ b/android-canvas-donut-chart/src/com/hmkcode/views/DonutChart.java @@ -0,0 +1,168 @@ +package com.hmkcode.views; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; + +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RadialGradient; +import android.graphics.RectF; +import android.graphics.Shader.TileMode; +import android.util.AttributeSet; +import android.view.View; + +public class DonutChart extends View { + + + private float radius; + + Paint paint; + Paint shadowPaint; + + Path myPath; + Path shadowPath; + + RectF outterCircle; + RectF innerCircle; + RectF shadowRectF; + + public DonutChart(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, + R.styleable.DonutChart, + 0, 0 + ); + + try { + radius = a.getDimension(R.styleable.DonutChart_radius, 20.0f); + } finally { + a.recycle(); + } + + paint = new Paint(); + paint.setDither(true); + paint.setStyle(Paint.Style.FILL); + paint.setStrokeJoin(Paint.Join.ROUND); + paint.setStrokeCap(Paint.Cap.ROUND); + paint.setAntiAlias(true); + paint.setStrokeWidth(radius / 14.0f); + + shadowPaint = new Paint(); + shadowPaint.setColor(0xf0000000); + shadowPaint.setStyle(Paint.Style.STROKE); + shadowPaint.setAntiAlias(true); + shadowPaint.setStrokeWidth(6.0f); + shadowPaint.setMaskFilter(new BlurMaskFilter(4, BlurMaskFilter.Blur.SOLID)); + + + myPath = new Path(); + shadowPath = new Path(); + + + outterCircle = new RectF(); + innerCircle = new RectF(); + shadowRectF = new RectF(); + + float adjust = (.019f*radius); + shadowRectF.set(adjust, adjust, radius*2-adjust, radius*2-adjust); + + adjust = .038f * radius; + outterCircle.set(adjust, adjust, radius*2-adjust, radius*2-adjust); + + adjust = .276f * radius; + innerCircle.set(adjust, adjust, radius*2-adjust, radius*2-adjust); + + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // draw shadow + paint.setShader(null); + float adjust = (.0095f*radius); + paint.setShadowLayer(8, adjust, -adjust, 0xaa000000); + drawDonut(canvas,paint, 0,359.9f); + + + // green + setGradient(0xff84BC3D,0xff5B8829); + drawDonut(canvas,paint, 0,60); + + //red + setGradient(0xffe04a2f,0xffB7161B); + drawDonut(canvas,paint, 60,60); + + // blue + setGradient(0xff4AB6C1,0xff2182AD); + drawDonut(canvas,paint, 120,60); + + // yellow + setGradient(0xffFFFF00,0xfffed325); + drawDonut(canvas,paint, 180,180); + + + + } + + public void drawDonut(Canvas canvas, Paint paint, float start,float sweep){ + + myPath.reset(); + myPath.arcTo(outterCircle, start, sweep, false); + myPath.arcTo(innerCircle, start+sweep, -sweep, false); + myPath.close(); + canvas.drawPath(myPath, paint); + } + + public void setGradient(int sColor, int eColor){ + paint.setShader(new RadialGradient(radius, radius, radius-5, + new int[]{sColor,eColor}, + new float[]{.6f,.95f},TileMode.CLAMP) ); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int desiredWidth = (int) radius*2; + int desiredHeight = (int) radius*2; + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + int width; + int height; + + //70dp exact + if (widthMode == MeasureSpec.EXACTLY) { + width = widthSize; + }else if (widthMode == MeasureSpec.AT_MOST) { + //wrap content + width = Math.min(desiredWidth, widthSize); + } else { + width = desiredWidth; + } + + //Measure Height + if (heightMode == MeasureSpec.EXACTLY) { + height = heightSize; + } else if (heightMode == MeasureSpec.AT_MOST) { + height = Math.min(desiredHeight, heightSize); + } else { + height = desiredHeight; + } + + //MUST CALL THIS + setMeasuredDimension(width, height); + } + + +} diff --git a/android-canvas-donut-chart/src/com/hmkcode/views/MainActivity.java b/android-canvas-donut-chart/src/com/hmkcode/views/MainActivity.java new file mode 100644 index 0000000..58b95bb --- /dev/null +++ b/android-canvas-donut-chart/src/com/hmkcode/views/MainActivity.java @@ -0,0 +1,14 @@ +package com.hmkcode.views; + +import android.app.Activity; +import android.os.Bundle; + + +public class MainActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} diff --git a/sh.exe.stackdump b/sh.exe.stackdump index 677c12c..c842b86 100644 --- a/sh.exe.stackdump +++ b/sh.exe.stackdump @@ -1,9 +1,9 @@ MSYS-1.0.12 Build:2012-07-05 14:56 -Exception: STATUS_ACCESS_VIOLATION at eip=02437968 -eax=00000001 ebx=0028F0C4 ecx=024B4C5C edx=00830000 esi=0028F0C8 edi=00000000 +Exception: STATUS_ACCESS_VIOLATION at eip=030E7968 +eax=00000001 ebx=0028F0C4 ecx=03164C5C edx=010C0000 esi=0028F0C8 edi=00000000 ebp=0028F09C esp=0028EF24 program=C:\Users\HMK\AppData\Local\GitHub\PortableGit_69703d1db91577f4c666e767a6ca5ec50a48d243\bin\sh.exe cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B Stack trace: Frame Function Args -0028F09C 02437968 (06430600, 00000000, 00000000, 00000001) +0028F09C 030E7968 (06430600, 00000000, 00000000, 00000001) End of stack trace \ No newline at end of file