Android Hexagon ImageView

custom shape imageview android
rounded corner imageview android library
custom imageview android
triangle imageview android
hexagon shape android
android hexagon shape button
square imageview android github
custom shape android

how can I achieve the hexagon imageview that is shown below.

http://imgur.com/1PEGuQu

Note that I tried the solution which is at this question: How to give hexagon shape to ImageView

And I also tried this solution: Masking(crop) image in frame

But I don't want to fill a color outside of the hexagon. I want it to be transparent, so the views and images behind can be seen.

By the way I tried, BitmapShader, PorterDuffXFermode etc. but cannot managed to get the result I wanted.

Thanks in advance.

I at last solved my problem. I find a very useful library that specifically does the trick I wanted. It is masking the imageview with a svg type vector image.

Library:

CustomShapeImageView

Result:

Screenshot

Edit: I also want to share the hexagonal svg with you, in case of necessity.

<svg width="205" height="237" xmlns="http://www.w3.org/2000/svg">
<title>hexagon</title>
<metadata id="metadata3064">image/svg+xml</metadata>
<g>
<title>Layer 1</title>
<polygon points="0,59.27092742919922 0,177.8127899169922 102.66026306152344,237.08370971679688 205.3205108642578,177.8127899169922 205.3205108642578,59.27092742919922 102.66026306152344,0 " id="svg_1" fill="#000000"/>
</g>
</svg>

Example hexagon image view · GitHub, import android.graphics.drawable.Drawable;. import android.util.AttributeSet;. import android.widget.ImageView;. public class HexagonImageView extends  Home » Android » android – How to give hexagon shape to ImageView android – How to give hexagon shape to ImageView Posted by: admin May 10, 2020 Leave a comment

Here is my code for this, this supports shadows to:

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class HexagonImageView extends ImageView {

    private Path hexagonPath;
    private Path hexagonBorderPath;
    private float radius;
    private Bitmap image;
    private int viewWidth;
    private int viewHeight;
    private Paint paint;
    private BitmapShader shader;
    private Paint paintBorder;
    private int borderWidth = 4;

    public HexagonImageView(Context context) {
        super(context);
        setup();
    }

    public HexagonImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup();
    }

    public HexagonImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setup();
    }

    private void setup() {
        paint = new Paint();
        paint.setAntiAlias(true);

        paintBorder = new Paint();
        setBorderColor(Color.WHITE);
        paintBorder.setAntiAlias(true);
        this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
        paintBorder.setShadowLayer(4.0f, 1.0f, 1.0f, Color.BLACK);

        hexagonPath = new Path();
        hexagonBorderPath = new Path();
    }

    public void setRadius(float r) {
        this.radius = r;
        calculatePath();
    }

    public void setBorderWidth(int borderWidth)  {
        this.borderWidth = borderWidth;
        this.invalidate();
    }

    public void setBorderColor(int borderColor)  {
        if (paintBorder != null)
            paintBorder.setColor(borderColor);

        this.invalidate();
    }

    private void calculatePath() {

        float triangleHeight = (float) (Math.sqrt(3) * radius / 2);
        float centerX = viewWidth/2;
        float centerY = viewHeight/2;

        hexagonBorderPath.moveTo(centerX, centerY + radius);
        hexagonBorderPath.lineTo(centerX - triangleHeight, centerY + radius/2);
        hexagonBorderPath.lineTo(centerX - triangleHeight, centerY - radius/2);
        hexagonBorderPath.lineTo(centerX, centerY - radius);
        hexagonBorderPath.lineTo(centerX + triangleHeight, centerY - radius/2);
        hexagonBorderPath.lineTo(centerX + triangleHeight, centerY + radius/2);
        hexagonBorderPath.moveTo(centerX, centerY + radius);

        float radiusBorder = radius - borderWidth;    
        float triangleBorderHeight = (float) (Math.sqrt(3) * radiusBorder / 2);

        hexagonPath.moveTo(centerX, centerY + radiusBorder);
        hexagonPath.lineTo(centerX - triangleBorderHeight, centerY + radiusBorder/2);
        hexagonPath.lineTo(centerX - triangleBorderHeight, centerY - radiusBorder/2);
        hexagonPath.lineTo(centerX, centerY - radiusBorder);
        hexagonPath.lineTo(centerX + triangleBorderHeight, centerY - radiusBorder/2);
        hexagonPath.lineTo(centerX + triangleBorderHeight, centerY + radiusBorder/2);
        hexagonPath.moveTo(centerX, centerY + radiusBorder);

        invalidate();
    }

    private void loadBitmap()  {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();

        if (bitmapDrawable != null)
            image = bitmapDrawable.getBitmap();
    }

    @SuppressLint("DrawAllocation")
    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);

        loadBitmap();

        // init shader
        if (image != null) {

            canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

            shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            paint.setShader(shader);

            canvas.drawPath(hexagonBorderPath, paintBorder);
            canvas.drawPath(hexagonPath, paint);
        }

    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = measureWidth(widthMeasureSpec);
        int height = measureHeight(heightMeasureSpec, widthMeasureSpec);

        viewWidth = width - (borderWidth * 2);
        viewHeight = height - (borderWidth * 2);

        radius = height / 2 - borderWidth;

        calculatePath();

        setMeasuredDimension(width, height);
    }

    private int measureWidth(int measureSpec)   {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY)  {
            result = specSize;
        }
        else {
            result = viewWidth;
        }

        return result;
    }

    private int measureHeight(int measureSpecHeight, int measureSpecWidth)  {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpecHeight);
        int specSize = MeasureSpec.getSize(measureSpecHeight);

        if (specMode == MeasureSpec.EXACTLY) {
            result = specSize;
        }
        else {
            result = viewHeight;
        }

        return (result + 2);
    }


}

android How to give hexagon shape to ImageView?, Region; import android.util.AttributeSet; import android.widget.ImageView; public class HexagonMaskView extends ImageView { private Path hexagonPath;  Android Open Source - android-shape-imageview Hexagon Image View. Back to Development/imageview ↑ From Project. Back to project page android-shape-imageview.. License. The source code is released under:

I've read this and looks valid. They even have a video tutorial: http://www.41post.com/4794/programming/android-rendering-a-path-with-a-bitmap-fill on how to fill a shape with a texture

Android Open Source, Android Open Source - android-shape-imageview Hexagon Image View. SvgShader; public class HexagonImageView extends ShaderImageView { public​  Today I am sharing an article for custom shape image-view in android using canvas. There is no library needed, using canvas you can make any type of shape with simple java code. You can make any shape like- circle, oval, triangle, Hexagonal or any thing else. Below is the code copy to them according to your need.

Android Example - ImageView, Android Example ImageView - Circular, Hexagonal, Triangular, Bubble, Star Imageviews (with inline Java code). Basically I just needed the bitmap mask shape which is already a rounded hexagon ronzohan closed this Oct 15, 2015 Sign up for free to join this conversation on GitHub .

android-shape-imageview, Shape Image View provides a set of custom shaped android imageview Diamond ImageView, Android Pentagon ImageView, Android Hexagon ImageView  Shape Image View. Provides a set of custom shaped android imageview components, and a framework to define more shapes. Implements both shader and bitmap mask based image views. Shader based one uses canvas draw methods and Path class, Mask based one uses xfermode to draw image on bitmaps defined by android shape XML's or resource bitmaps.

Android Hexagon ImageView, AttributeSet; import android.widget.ImageView; public class HexagonImageView extends ImageView { private Path hexagonPath; private Path  Example hexagon image view. GitHub Gist: instantly share code, notes, and snippets.

Comments
  • Hi. SafaOrhan, The svg has to be saved in which folder and which extension?
  • @Jack You can put it into /res/raw folder without any extension.
  • I don't want to fill with a color. I want to mask it so the views those behind it, can be seen.
  • Using their tut you can create a transparent image with a textured shape.