2015-03-02 56 views
3

我正在尝试使用支持库v4的RoundedBitmapDrawable为了显示在ImageViews中异步加载的圆角位图,圆圈或圆角矩形。
但是,它看起来像RoundedBitmapDrawable不LayerDrawable网非常好:
如果我尝试类似:RoundedBitmapDrawable与TransitionDrawable

if (previousDrawable != null) { 
       final Drawable[] layers = new Drawable[2]; 
       layers[0] = previousDrawable;         
       layers[1] = roundedDrawable; 
       TransitionDrawable drawable = new TransitionDrawable(layers); 
       view.setImageDrawable(drawable); 
       drawable.startTransition(3000); 
      } else { 
       view.setImageDrawable(roundedDrawable); 
      } 

的TransitionDrawable启动,但它不尊重RoundedBitmapDrawable无法正确显示:它的尺寸似乎移位以某种方式,如果我将其设置为用圆圈:

RoundedBitmapDrawable roundedDrawable = RoundedBitmapDrawableFactory 
        .create(getResources(), bitmap); 
      roundedDrawable.setCornerRadius(bitmap.getHeight()/2); 
      roundedDrawable.setAntiAlias(true); 

如果我使用ImageView.setImageDrawable()它被正确地显示出来,但它会导致一圆角矩形如果TransitionDrawable显示它。

有没有人知道为什么会出现这种显示问题?

回答

-3
public static Bitmap getRoundedCornerBitmap(Context context, Bitmap input, int pixels , int w , int h , boolean squareTL, boolean squareTR, boolean squareBL, boolean squareBR ) { 

    Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 
    final float densityMultiplier = context.getResources().getDisplayMetrics().density; 

    final int color = 0xff424242; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, w, h); 
    final RectF rectF = new RectF(rect); 

    //make sure that our rounded corner is scaled appropriately 
    final float roundPx = pixels*densityMultiplier; 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 


    //draw rectangles over the corners we want to be square 
    if (squareTL){ 
     canvas.drawRect(0, 0, w/2, h/2, paint); 
    } 
    if (squareTR){ 
     canvas.drawRect(w/2, 0, w, h/2, paint); 
    } 
    if (squareBL){ 
     canvas.drawRect(0, h/2, w/2, h, paint); 
    } 
    if (squareBR){ 
     canvas.drawRect(w/2, h/2, w, h, paint); 
    } 

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(input, 0,0, paint); 

    return output; 

}

,或者你可以看到this also

-1

这是我的解决方案来创建一个圆形的图像:

package com.campusapp; 

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.Paint; 
import android.graphics.Shader; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

public class CircularImageView extends ImageView { 

    private int borderWidth; 
    private int canvasSize; 
    private Bitmap image; 
    private Paint paint; 
    private Paint paintBorder; 

    public CircularImageView(final Context context) { 
     this(context, null); 
    } 

    public CircularImageView(Context context, AttributeSet attrs) { 
     this(context, attrs, R.attr.circularImageViewStyle); 
    } 

    public CircularImageView(Context context, AttributeSet attrs, int defStyle) 
{ 


     super(context, attrs, defStyle); 

     // init paint 
     paint = new Paint(); 
     paint.setAntiAlias(true); 

     paintBorder = new Paint(); 
     paintBorder.setAntiAlias(true); 

     // load the styled attributes and set their properties 
     TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0); 

     if(attributes.getBoolean(R.styleable.CircularImageView_border, true)) 
{ 

    int defaultBorderSize = (int) (4 * getContext().getResources().getDisplayMetrics().density + 0.5f); 
      setBorderWidth(attributes.getDimensionPixelOffset(R.styleable.CircularImageView_border_width, defaultBorderSize)); 
      setBorderColor(attributes.getColor(R.styleable.CircularImageView_border_color, Color.WHITE)); 


     } 

     if(attributes.getBoolean(R.styleable.CircularImageView_shadow, false)) 
      addShadow(); 



    } 



    public void setBorderWidth(int borderWidth) 
{ 

     this.borderWidth = borderWidth; 
     this.requestLayout(); 
     this.invalidate(); 

    } 

    public void setBorderColor(int borderColor) 


{ 
     if (paintBorder != null) 
      paintBorder.setColor(borderColor); 
     this.invalidate(); 


    } 

    public void addShadow() 


{ 
     setLayerType(LAYER_TYPE_SOFTWARE, paintBorder); 
     paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK); 


    } 

    @Override 
    public void onDraw(Canvas canvas) 


{ 
     // load the bitmap 
     image = drawableToBitmap(getDrawable()); 

     // init shader 
     if (image != null) 


{ 

      canvasSize = canvas.getWidth(); 
      if(canvas.getHeight()<canvasSize) 
       canvasSize = canvas.getHeight(); 

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

      // 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 circleCenter = (canvasSize - (borderWidth * 2))/2; 
      canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2))/2) + borderWidth - 4.0f, paintBorder); 
      canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2))/2) - 4.0f, paint); 


     } 



    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 


{ 
     int width = measureWidth(widthMeasureSpec); 
     int height = measureHeight(heightMeasureSpec); 
     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) 


{ 
      // The parent has determined an exact size for the child. 
      result = specSize; 


} 

else if (specMode == MeasureSpec.AT_MOST) 


{ 
      // The child can be as large as it wants up to the specified size. 
      result = specSize; 


     } 


else 

{ 
      // The parent has not imposed any constraint on the child. 
      result = canvasSize; 

     } 

     return result; 


    } 

    private int measureHeight(int measureSpecHeight) 



{ 
     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 if (specMode == MeasureSpec.AT_MOST) 


{ 
      // The child can be as large as it wants up to the specified size. 
      result = specSize; 


     } 

else 

{ 
      // Measure the text (beware: ascent is a negative number) 
      result = canvasSize; 


     } 

     return (result + 2); 


    } 

    public Bitmap drawableToBitmap(Drawable drawable) 



{ 

     if (drawable == null) 


{ 
      return null; 


     } 

else if (drawable instanceof BitmapDrawable) 

{ 

      return ((BitmapDrawable) drawable).getBitmap(); 

} 


     Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), 
       drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 


     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
     drawable.draw(canvas); 

     return bitmap; 

    } 


} 

创建类后,用下面的代码替换您ImageView

<com.yourpkg.CircularImageView 
    android:layout_width="150dp" 
    android:layout_height="150dp" 
    android:src="@drawable/your_image" 
    app:border_color="#EEEEEE" 
    app:border_width="4dp" 
    app:shadow="true" /> 
+0

当然你可以添加代码!点击答案下方的“编辑”,然后点击“{}”按钮插入代码。 – David 2015-03-24 08:01:35

+0

谢谢!为了进一步改进你的答案,你可能还想解释你的代码的作用。一般来说,最好不要粘贴整个文件,而应包含一个最小的工作示例。 – David 2015-03-24 10:42:36

0

设置

roundedDrawable.setCircular(真);

那么它工作正常