2017-09-19 13 views

回答

0

我认为,鉴于不能圆(我的意思是:具有宽度和高度,它是矩形)。如果您只想将imageView,海图图库称为hdodenhof,即可称为CircleImageView。

0

如果你想有一个圈子,你可以重写的ImageView

公共类CircleImageView扩展的ImageView {

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); 
} 
0

我觉得here对你是一个完美的解决方案。但也许你不会喜欢这样做,因为它可以为形状提供额外的图像。但我认为通过使用这个库你将得到一个解决所有类型的形状。只需要为图像提供确切的形状(比如说,您将图像放置为三角形形状,而不是图像视图上的图像就是这样)。这是另一回事,如果你想使用这个库,你必须使用ImageView。