Created
September 16, 2016 04:22
-
-
Save ManzzBaria/e967d290a3f830d0c7f629a157add6a9 to your computer and use it in GitHub Desktop.
Make ImageView as circle view
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.Shader; | |
import android.graphics.drawable.BitmapDrawable; | |
import android.util.AttributeSet; | |
import android.widget.ImageView; | |
/** | |
* Created by Manzz Baria on 9/16/2016. | |
*/ | |
public class RoundImageView extends ImageView | |
{ | |
private int borderWidth = 1; | |
private int viewWidth; | |
private int viewHeight; | |
private Bitmap image; | |
private Paint paint; | |
private Paint paintBorder; | |
private BitmapShader shader; | |
public RoundImageView(Context context) | |
{ | |
super(context); | |
setup(); | |
} | |
public RoundImageView(Context context, AttributeSet attrs) | |
{ | |
super(context, attrs); | |
setup(); | |
} | |
public RoundImageView(Context context, AttributeSet attrs, int defStyle) | |
{ | |
super(context, attrs, defStyle); | |
setup(); | |
} | |
private void setup() | |
{ | |
// init paint | |
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, 0.0f, 2.0f, Color.BLACK); | |
paintBorder.setShadowLayer(0.0f, 0.0f, 0.0f, Color.BLACK); | |
} | |
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 loadBitmap() | |
{ | |
BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); | |
if (bitmapDrawable != null) | |
image = bitmapDrawable.getBitmap(); | |
} | |
@SuppressLint("DrawAllocation") | |
@Override | |
public void onDraw(Canvas canvas) | |
{ | |
// load the bitmap | |
loadBitmap(); | |
// init shader | |
if (image != null) | |
{ | |
shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); | |
paint.setShader(shader); | |
int circleCenter = viewWidth / 2; | |
// circleCenter is the x or y of the view's center | |
// radius is the radius in pixels of the cirle to be drawn | |
// paint contains the shader that will texture the shape | |
int borderWidth = 0; | |
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 0.0f, paintBorder); | |
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 0.0f, paint); | |
} | |
} | |
@Override | |
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) | |
{ | |
int width = measureWidth(widthMeasureSpec); | |
int height = measureHeight(heightMeasureSpec, widthMeasureSpec); | |
viewWidth = width - (borderWidth * 2); | |
viewHeight = height - (borderWidth * 2); | |
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) | |
{ | |
// We were told how big to be | |
result = specSize; | |
} | |
else | |
{ | |
// Measure the text | |
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) | |
{ | |
// We were told how big to be | |
result = specSize; | |
} | |
else | |
{ | |
// Measure the text (beware: ascent is a negative number) | |
result = viewHeight; | |
} | |
return (result + 2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment