Skip to content

Instantly share code, notes, and snippets.

@AnderWeb
Created October 7, 2014 10:49
Show Gist options
  • Save AnderWeb/face86a92e28fe32983a to your computer and use it in GitHub Desktop.
Save AnderWeb/face86a92e28fe32983a to your computer and use it in GitHub Desktop.

Revisions

  1. AnderWeb created this gist Oct 7, 2014.
    84 changes: 84 additions & 0 deletions HexagonDrawable.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    package org.adw.drawables;

    import android.graphics.Canvas;
    import android.graphics.ColorFilter;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.util.FloatMath;

    /**
    * Created by AnderWeb (Gustavo Claramunt) on 7/10/14.
    */
    public class HexagonDrawable extends Drawable {

    public static final int SIDES = 6;
    private Path hexagon = new Path();
    private Path temporal = new Path();
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    public HexagonDrawable(int color) {
    paint.setColor(color);
    hexagon.setFillType(Path.FillType.EVEN_ODD);
    }

    @Override
    public void draw(Canvas canvas) {
    canvas.drawPath(hexagon, paint);
    }

    @Override
    public void setAlpha(int alpha) {
    paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
    paint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
    return paint.getAlpha();
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
    super.onBoundsChange(bounds);
    computeHex(bounds);
    invalidateSelf();
    }

    public void computeHex(Rect bounds) {

    final int width = bounds.width();
    final int height = bounds.height();
    final int size = Math.min(width, height);
    final int centerX = bounds.left + (width / 2);
    final int centerY = bounds.top + (height / 2);

    hexagon.reset();
    hexagon.addPath(createHexagon(size, centerX, centerY));
    hexagon.addPath(createHexagon((int) (size * .8f), centerX, centerY));
    }

    private Path createHexagon(int size, int centerX, int centerY) {
    final float section = (float) (2.0 * Math.PI / SIDES);
    int radius = size / 2;
    Path hex = temporal;
    hex.reset();
    hex.moveTo(
    (centerX + radius * FloatMath.cos(0)),
    (centerY + radius * FloatMath.sin(0)));

    for (int i = 1; i < SIDES; i++) {
    hex.lineTo(
    (centerX + radius * FloatMath.cos(section * i)),
    (centerY + radius * FloatMath.sin(section * i)));
    }

    hex.close();
    return hex;
    }
    }