forked from hzuapps/android-labs-2019
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d1052d5
commit 31e7dd9
Showing
25 changed files
with
970 additions
and
6 deletions.
There are no files selected for viewing
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
239 changes: 239 additions & 0 deletions
239
...80902219/app/src/main/java/edu/hzuapps/androidlabs/Soft1714080902219/CircleImageView.java
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
package edu.hzuapps.androidlabs.Soft1714080902219; | ||
|
||
import android.content.Context; | ||
import android.content.res.TypedArray; | ||
import android.graphics.Bitmap; | ||
import android.graphics.BitmapShader; | ||
import android.graphics.Canvas; | ||
import android.graphics.Color; | ||
import android.graphics.Matrix; | ||
import android.graphics.Paint; | ||
import android.graphics.Rect; | ||
import android.graphics.RectF; | ||
import android.graphics.Shader; | ||
import android.graphics.SweepGradient; | ||
import android.graphics.drawable.BitmapDrawable; | ||
import android.graphics.drawable.ColorDrawable; | ||
import android.graphics.drawable.Drawable; | ||
import android.net.Uri; | ||
import android.text.TextPaint; | ||
import android.util.AttributeSet; | ||
import android.util.FloatMath; | ||
import android.widget.ImageView; | ||
|
||
public class CircleImageView extends android.support.v7.widget.AppCompatImageView { | ||
|
||
|
||
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; | ||
|
||
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; | ||
private static final int COLORDRAWABLE_DIMENSION = 1; | ||
|
||
private static final int DEFAULT_BORDER_WIDTH = 0; | ||
private static final int DEFAULT_BORDER_COLOR = Color.BLACK; | ||
|
||
private final RectF mDrawableRect = new RectF(); | ||
private final RectF mBorderRect = new RectF(); | ||
|
||
private final Matrix mShaderMatrix = new Matrix(); | ||
private final Paint mBitmapPaint = new Paint(); | ||
private final Paint mBorderPaint = new Paint(); | ||
|
||
private int mBorderColor = DEFAULT_BORDER_COLOR; | ||
private int mBorderWidth = DEFAULT_BORDER_WIDTH; | ||
|
||
private Bitmap mBitmap; | ||
private BitmapShader mBitmapShader; | ||
private int mBitmapWidth; | ||
private int mBitmapHeight; | ||
|
||
private float mDrawableRadius; | ||
private float mBorderRadius; | ||
|
||
private boolean mReady; | ||
private boolean mSetupPending; | ||
|
||
public CircleImageView(Context context) { | ||
super(context); | ||
} | ||
|
||
public CircleImageView(Context context, AttributeSet attrs) { | ||
this(context, attrs, 0); | ||
} | ||
|
||
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { | ||
super(context, attrs, defStyle); | ||
super.setScaleType(SCALE_TYPE); | ||
|
||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); | ||
|
||
mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); | ||
mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR); | ||
|
||
a.recycle(); | ||
|
||
mReady = true; | ||
|
||
if (mSetupPending) { | ||
setup(); | ||
mSetupPending = false; | ||
} | ||
} | ||
|
||
@Override | ||
public ScaleType getScaleType() { | ||
return SCALE_TYPE; | ||
} | ||
|
||
@Override | ||
public void setScaleType(ScaleType scaleType) { | ||
if (scaleType != SCALE_TYPE) { | ||
throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); | ||
} | ||
} | ||
|
||
@Override | ||
protected void onDraw(Canvas canvas) { | ||
if (getDrawable() == null) { | ||
return; | ||
} | ||
|
||
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint); | ||
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint); | ||
} | ||
|
||
@Override | ||
protected void onSizeChanged(int w, int h, int oldw, int oldh) { | ||
super.onSizeChanged(w, h, oldw, oldh); | ||
setup(); | ||
} | ||
|
||
public int getBorderColor() { | ||
return mBorderColor; | ||
} | ||
|
||
public void setBorderColor(int borderColor) { | ||
if (borderColor == mBorderColor) { | ||
return; | ||
} | ||
|
||
mBorderColor = borderColor; | ||
mBorderPaint.setColor(mBorderColor); | ||
invalidate(); | ||
} | ||
|
||
public int getBorderWidth() { | ||
return mBorderWidth; | ||
} | ||
|
||
public void setBorderWidth(int borderWidth) { | ||
if (borderWidth == mBorderWidth) { | ||
return; | ||
} | ||
|
||
mBorderWidth = borderWidth; | ||
setup(); | ||
} | ||
|
||
@Override | ||
public void setImageBitmap(Bitmap bm) { | ||
super.setImageBitmap(bm); | ||
mBitmap = bm; | ||
setup(); | ||
} | ||
|
||
@Override | ||
public void setImageDrawable(Drawable drawable) { | ||
super.setImageDrawable(drawable); | ||
mBitmap = getBitmapFromDrawable(drawable); | ||
setup(); | ||
} | ||
|
||
@Override | ||
public void setImageResource(int resId) { | ||
super.setImageResource(resId); | ||
mBitmap = getBitmapFromDrawable(getDrawable()); | ||
setup(); | ||
} | ||
|
||
private Bitmap getBitmapFromDrawable(Drawable drawable) { | ||
if (drawable == null) { | ||
return null; | ||
} | ||
|
||
if (drawable instanceof BitmapDrawable) { | ||
return ((BitmapDrawable) drawable).getBitmap(); | ||
} | ||
|
||
try { | ||
Bitmap bitmap; | ||
|
||
if (drawable instanceof ColorDrawable) { | ||
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); | ||
} else { | ||
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); | ||
} | ||
|
||
Canvas canvas = new Canvas(bitmap); | ||
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); | ||
drawable.draw(canvas); | ||
return bitmap; | ||
} catch (OutOfMemoryError e) { | ||
return null; | ||
} | ||
} | ||
|
||
private void setup() { | ||
if (!mReady) { | ||
mSetupPending = true; | ||
return; | ||
} | ||
|
||
if (mBitmap == null) { | ||
return; | ||
} | ||
|
||
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); | ||
|
||
mBitmapPaint.setAntiAlias(true); | ||
mBitmapPaint.setShader(mBitmapShader); | ||
|
||
mBorderPaint.setStyle(Paint.Style.STROKE); | ||
mBorderPaint.setAntiAlias(true); | ||
mBorderPaint.setColor(mBorderColor); | ||
mBorderPaint.setStrokeWidth(mBorderWidth); | ||
|
||
mBitmapHeight = mBitmap.getHeight(); | ||
mBitmapWidth = mBitmap.getWidth(); | ||
|
||
mBorderRect.set(0, 0, getWidth(), getHeight()); | ||
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2); | ||
|
||
mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth); | ||
mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2); | ||
|
||
updateShaderMatrix(); | ||
invalidate(); | ||
} | ||
|
||
private void updateShaderMatrix() { | ||
float scale; | ||
float dx = 0; | ||
float dy = 0; | ||
|
||
mShaderMatrix.set(null); | ||
|
||
if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { | ||
scale = mDrawableRect.height() / (float) mBitmapHeight; | ||
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; | ||
} else { | ||
scale = mDrawableRect.width() / (float) mBitmapWidth; | ||
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; | ||
} | ||
|
||
mShaderMatrix.setScale(scale, scale); | ||
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth); | ||
|
||
mBitmapShader.setLocalMatrix(mShaderMatrix); | ||
} | ||
} |
Oops, something went wrong.