使用TransitionDrawable的RoundedBitmapDrawable

时间:2015-03-02 16:10:40

标签: android

我正在尝试使用支持lib v4' RoundedBitmapDrawable来显示在ImageViews中异步加载的圆形位图,圆圈或圆角矩形。
但是,看起来RoundedBitmapDrawable与LayerDrawable不能很好地匹配:
如果我尝试这样的话:

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显示它,则会生成圆角矩形。

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

4 个答案:

答案 0 :(得分:0)

设置

roundedDrawable.setCircular(真);

然后它工作正常

答案 1 :(得分:-1)

使用通用图片加载程序修复您的问题

https://github.com/nostra13/Android-Universal-Image-Loader

答案 2 :(得分:-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" />

答案 3 :(得分:-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