9

Я хочу отображать круговой аватар из контактов пользователя в виде большого значка уведомления - например, при получении текста или почты. Когда я устанавливаю большой значок в качестве изображения этого контакта, это приводит к значку квадрата.Сделать уведомление Large Icon Round

Я ищу, чтобы включить то, что выглядит как верхний значок (квадрат аватара), выглядят как большой значок на уведомление по электронной почте (округление аватара):

enter image description here

Как я сделать его круглым?

+0

Я хотел бы сослаться на эту ссылку: http://stackoverflow.com/questions/11932805/cropping-circular-area-from-bitmap-in-android – Vijay

ответ

13

С setLargeIcon() принимает Bitmap, все что вам нужно сделать, это создать циркуляр Bitmap от источника.

Ниже приведен код от Create a circle bitmap in Android (не пробовал себя).

private Bitmap getCircleBitmap(Bitmap bitmap) { 
    final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), 
      bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(output); 

    final int color = Color.RED; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    final RectF rectF = new RectF(rect); 

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

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    bitmap.recycle(); 

    return output; 
} 
+0

я понял, что это, вероятно, способ сделать это. Спасибо за ссылку, она работает. Я немного поработаю с кодом. –

+0

@ItaiHanski, Добро пожаловать! – Egor

7

Ответ Егора отлично подойдет. Проводка код здесь упаковывает ссылку исчезает:

private Bitmap getCircleBitmap(Bitmap bitmap) { 
final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), 
    bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
final Canvas canvas = new Canvas(output); 

final int color = Color.RED; 
final Paint paint = new Paint(); 
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
final RectF rectF = new RectF(rect); 

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

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
canvas.drawBitmap(bitmap, rect, rect, paint); 

bitmap.recycle(); 

return output; 
} 
+0

Вместо этого лучше обновить ответ только для ссылок. В любом случае, ваши усилия приветствуются. :) – Sufian

+0

@Sufian Спасибо, Брюс. – Micro

+0

Если вы используете его для показа изображения с уведомлением, необходимо удалить 'bitmap.recycle()'. В моем коде выглядит: .setLargeIcon (getCircleBitmap (Picasso.with (this.context) .load (pictureUrl) .get())). Надеюсь, эта помощь. –

4

Принятого ответ требует ввод растрового изображения идеального квадрата (тот же высоту и ширину). Если ваш растровый рисунок имеет прямоугольную форму, он вернет овал. Я изменил код, чтобы принимать растровые изображения любой формы и возвращать круги, центрированные в середине входного растрового изображения.

public static Bitmap getCircleBitmap(Bitmap bitmap) { 
    Bitmap output; 
    Rect srcRect, dstRect; 
    float r; 
    final int width = bitmap.getWidth(); 
    final int height = bitmap.getHeight(); 

    if (width > height){ 
     output = Bitmap.createBitmap(height, height, Bitmap.Config.ARGB_8888); 
     int left = (width - height)/2; 
     int right = left + height; 
     srcRect = new Rect(left, 0, right, height); 
     dstRect = new Rect(0, 0, height, height); 
     r = height/2; 
    }else{ 
     output = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888); 
     int top = (height - width)/2; 
     int bottom = top + width; 
     srcRect = new Rect(0, top, width, bottom); 
     dstRect = new Rect(0, 0, width, width); 
     r = width/2; 
    } 

    Canvas canvas = new Canvas(output); 

    final int color = 0xff424242; 
    final Paint paint = new Paint(); 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawCircle(r, r, r, paint); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, srcRect, dstRect, paint); 

    bitmap.recycle(); 

    return output; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^