diff --git a/android-draw-happy-face/AndroidManifest.xml b/android-draw-happy-face/AndroidManifest.xml new file mode 100644 index 0000000..e810661 --- /dev/null +++ b/android-draw-happy-face/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + e + + + + + + + + + + diff --git a/android-draw-happy-face/res/drawable-hdpi/ic_launcher.png b/android-draw-happy-face/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000..288b665 Binary files /dev/null and b/android-draw-happy-face/res/drawable-hdpi/ic_launcher.png differ diff --git a/android-draw-happy-face/res/drawable-hdpi/woodgraybg.jpg b/android-draw-happy-face/res/drawable-hdpi/woodgraybg.jpg new file mode 100644 index 0000000..54ebe7d Binary files /dev/null and b/android-draw-happy-face/res/drawable-hdpi/woodgraybg.jpg differ diff --git a/android-draw-happy-face/res/layout/activity_main.xml b/android-draw-happy-face/res/layout/activity_main.xml new file mode 100644 index 0000000..f3ae368 --- /dev/null +++ b/android-draw-happy-face/res/layout/activity_main.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/android-draw-happy-face/res/values/attrs.xml b/android-draw-happy-face/res/values/attrs.xml new file mode 100644 index 0000000..d2383bf --- /dev/null +++ b/android-draw-happy-face/res/values/attrs.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android-draw-happy-face/res/values/dimens.xml b/android-draw-happy-face/res/values/dimens.xml new file mode 100644 index 0000000..55c1e59 --- /dev/null +++ b/android-draw-happy-face/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/android-draw-happy-face/res/values/strings.xml b/android-draw-happy-face/res/values/strings.xml new file mode 100644 index 0000000..81bedf0 --- /dev/null +++ b/android-draw-happy-face/res/values/strings.xml @@ -0,0 +1,8 @@ + + + + DrawFace + Hello world! + Settings + + diff --git a/android-draw-happy-face/res/values/styles.xml b/android-draw-happy-face/res/values/styles.xml new file mode 100644 index 0000000..845fb57 --- /dev/null +++ b/android-draw-happy-face/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/android-draw-happy-face/src/com/hmkcode/drawing/FaceView.java b/android-draw-happy-face/src/com/hmkcode/drawing/FaceView.java new file mode 100644 index 0000000..e6a7165 --- /dev/null +++ b/android-draw-happy-face/src/com/hmkcode/drawing/FaceView.java @@ -0,0 +1,97 @@ +package com.hmkcode.drawing; + + +import com.hmkcode.drawing.shapes.Face; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +public class FaceView extends View { + private float radius; + Face face; + public FaceView(Context context, AttributeSet attrs) { + super(context, attrs); + + // get radius value + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, + R.styleable.FaceView, + 0, 0 + ); + + try { + radius = a.getDimension(R.styleable.FaceView_radius, 20.0f); + } finally { + a.recycle(); + } + + // initiate Face class + face = new Face(radius); + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + face.draw(canvas); + + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int desiredWidth = (int) radius*2+(int) Math.ceil((radius/1.70)); + int desiredHeight = (int) radius*2+(int)Math.ceil((radius/1.70)); + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + int width; + int height; + + //Measure Width + if (widthMode == MeasureSpec.EXACTLY) { + //Must be this size + width = widthSize; + } else if (widthMode == MeasureSpec.AT_MOST) { + //Can't be bigger than... + width = Math.min(desiredWidth, widthSize); + Log.d("Width AT_MOST", "width: "+width); + } else { + //Be whatever you want + width = desiredWidth; + Log.d("Width ELSE", "width: "+width); + + } + + //Measure Height + if (heightMode == MeasureSpec.EXACTLY) { + //Must be this size + height = heightSize; + } else if (heightMode == MeasureSpec.AT_MOST) { + //Can't be bigger than... + height = Math.min(desiredHeight, heightSize); + } else { + //Be whatever you want + height = desiredHeight; + } + + //MUST CALL THIS + setMeasuredDimension(width, height); + } + public float getRadius() { + return radius; + } + + public void setRadius(float radius) { + this.radius = radius; + } + +} diff --git a/android-draw-happy-face/src/com/hmkcode/drawing/MainActivity.java b/android-draw-happy-face/src/com/hmkcode/drawing/MainActivity.java new file mode 100644 index 0000000..818f6bd --- /dev/null +++ b/android-draw-happy-face/src/com/hmkcode/drawing/MainActivity.java @@ -0,0 +1,13 @@ +package com.hmkcode.drawing; + + +import android.app.Activity; + +public class MainActivity extends Activity { + + protected void onCreate(android.os.Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } + +} diff --git a/android-draw-happy-face/src/com/hmkcode/drawing/shapes/Face.java b/android-draw-happy-face/src/com/hmkcode/drawing/shapes/Face.java new file mode 100644 index 0000000..06ae5dd --- /dev/null +++ b/android-draw-happy-face/src/com/hmkcode/drawing/shapes/Face.java @@ -0,0 +1,96 @@ +package com.hmkcode.drawing.shapes; + +import android.graphics.Canvas; +import android.graphics.CornerPathEffect; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +public class Face { + + Paint facePaint; + Paint mePaint; + + + float radius; + float adjust; + + float mouthLeftX, mouthRightX, mouthTopY, mouthBottomY; + RectF mouthRectF; + Path mouthPath; + + RectF eyeLeftRectF, eyeRightRectF; + float eyeLeftX, eyeRightx, eyeTopY, eyeBottomY; + + + public Face(float radius){ + this.radius= radius; + + facePaint = new Paint(); + facePaint.setColor(0xfffed325); // yellow + facePaint.setDither(true); + facePaint.setStrokeJoin(Paint.Join.ROUND); + facePaint.setStrokeCap(Paint.Cap.ROUND); + facePaint.setPathEffect(new CornerPathEffect(10) ); + facePaint.setAntiAlias(true); + facePaint.setShadowLayer(4, 2, 2, 0x80000000); + + mePaint = new Paint(); + mePaint.setColor(0xff2a2a2a); + mePaint.setDither(true); + mePaint.setStyle(Paint.Style.STROKE); + mePaint.setStrokeJoin(Paint.Join.ROUND); + mePaint.setStrokeCap(Paint.Cap.ROUND); + mePaint.setPathEffect(new CornerPathEffect(10) ); + mePaint.setAntiAlias(true); + mePaint.setStrokeWidth(radius / 14.0f); + + + + adjust = radius / 3.2f; + + + // Left Eye + eyeLeftX = radius-(radius*0.43f); + eyeRightx = eyeLeftX+ (radius*0.3f); + eyeTopY = radius-(radius*0.5f); + eyeBottomY = eyeTopY + (radius*0.4f); + + eyeLeftRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust); + + // Right Eye + eyeLeftX = eyeRightx + (radius*0.3f); + eyeRightx = eyeLeftX + (radius*0.3f); + + eyeRightRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust); + + + // Smiley Mouth + mouthLeftX = radius-(radius/2.0f); + mouthRightX = mouthLeftX+ radius; + mouthTopY = radius - (radius*0.2f); + mouthBottomY = mouthTopY + (radius*0.5f); + + mouthRectF = new RectF(mouthLeftX+adjust,mouthTopY+adjust,mouthRightX+adjust,mouthBottomY+adjust); + mouthPath = new Path(); + + mouthPath.arcTo(mouthRectF, 30, 120, true); + } + + public void draw(Canvas canvas) { + + // 1. draw face + canvas.drawCircle(radius+adjust, radius+adjust, radius, facePaint); + + // 2. draw mouth + mePaint.setStyle(Paint.Style.STROKE); + + canvas.drawPath(mouthPath, mePaint); + + // 3. draw eyes + mePaint.setStyle(Paint.Style.FILL); + canvas.drawArc(eyeLeftRectF, 0, 360, true, mePaint); + canvas.drawArc(eyeRightRectF, 0, 360, true, mePaint); + + } +}