| package org.sflphone.views; |
| |
| import org.sflphone.R; |
| |
| import android.content.Context; |
| import android.graphics.Bitmap; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| import android.graphics.Paint; |
| import android.graphics.RectF; |
| import android.graphics.drawable.BitmapDrawable; |
| import android.util.AttributeSet; |
| import android.widget.ImageView; |
| |
| public class HalfCircleImageView extends ImageView |
| { |
| private int borderWidth = 0; |
| private int viewWidth; |
| private int viewHeight; |
| private Bitmap image; |
| private Paint paint; |
| private Paint paintBorder; |
| private Paint backgroundPaint; |
| private RectF viewBounds; |
| |
| |
| public HalfCircleImageView(Context context) |
| { |
| super(context); |
| setup(); |
| } |
| |
| public HalfCircleImageView(Context context, AttributeSet attrs) |
| { |
| super(context, attrs); |
| setup(); |
| } |
| |
| public HalfCircleImageView(Context context, AttributeSet attrs, int defStyle) |
| { |
| super(context, attrs, defStyle); |
| setup(); |
| } |
| |
| private void setup() |
| { |
| backgroundPaint = new Paint(); |
| backgroundPaint.setColor(getResources().getColor(R.color.sfl_dark_blue)); |
| |
| // init paint |
| paint = new Paint(); |
| paint.setAntiAlias(true); |
| |
| viewBounds = new RectF(); |
| |
| 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); |
| } |
| |
| 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(); |
| } |
| |
| @Override |
| public void onDraw(Canvas canvas) |
| { |
| // load the bitmap |
| loadBitmap(); |
| |
| canvas.drawArc(viewBounds, 180, 180, false, backgroundPaint); |
| |
| // 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 |
| // canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder); |
| canvas.drawBitmap(image, viewWidth / 2 - image.getWidth() / 2, viewHeight / 3 - image.getHeight() / 2, 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); |
| |
| viewBounds.set(0, 0, width, height); |
| |
| 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); |
| } |
| |
| } |