parent
6c8d212481
commit
19968bc6ea
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.hmkcode.views"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="8"
|
||||||
|
android:targetSdkVersion="19" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/AppTheme" >
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:label="@string/app_name" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:customviews="http://schemas.android.com/apk/res/com.hmkcode.views"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
tools:context="com.hmkcode.views.MainActivity"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.hmkcode.views.DonutChart
|
||||||
|
android:id="@+id/donutChart"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
customviews:radius="90dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
<resources>
|
||||||
|
<declare-styleable name="DonutChart">
|
||||||
|
<attr name="radius" format="dimension"/>
|
||||||
|
</declare-styleable>
|
||||||
|
</resources>
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">Donut Chart</string>
|
||||||
|
<string name="hello_world">Hello world!</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme, dependent on API level. This theme is replaced
|
||||||
|
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
|
||||||
|
<!--
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Application theme. -->
|
||||||
|
<style name="AppTheme" parent="AppBaseTheme">
|
||||||
|
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +1,9 @@
|
|||||||
MSYS-1.0.12 Build:2012-07-05 14:56
|
MSYS-1.0.12 Build:2012-07-05 14:56
|
||||||
Exception: STATUS_ACCESS_VIOLATION at eip=02437968
|
Exception: STATUS_ACCESS_VIOLATION at eip=030E7968
|
||||||
eax=00000001 ebx=0028F0C4 ecx=024B4C5C edx=00830000 esi=0028F0C8 edi=00000000
|
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
|
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
|
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
|
||||||
Stack trace:
|
Stack trace:
|
||||||
Frame Function Args
|
Frame Function Args
|
||||||
0028F09C 02437968 (06430600, 00000000, 00000000, 00000001)
|
0028F09C 030E7968 (06430600, 00000000, 00000000, 00000001)
|
||||||
End of stack trace
|
End of stack trace
|
||||||
Loading…
Reference in New Issue