2015-06-08 3 views
20

Я знаю, что есть много ссылок, которые можно сделать, чтобы сделать ImageView Round Corner. Но я использую Picasso Библиотека для загрузки изображений .. Я обращаюсь к link, чтобы получить результат. Но проблема в том, что я использую его в ListView и для LIstView's первый элемент ImageView его работа прекрасна, но для оставшегося преобразования не работает.Сделать ImageView с круглым углом Использование picasso

+0

Вы пробовали это преобразование? https: //gist.github.com/aprock/6213395 Использование: Picasso.with (context) .load (url) .transform (new RoundedTransformation()). в (imageView) –

+0

@RoiDivon Я только что использовал ссылку, которую вы предоставили, но она также давала то же самое эффект .. – Akshay

ответ

29

Я использую это преобразование: https://gist.github.com/julianshen/5829333

Picasso.with(activity).load(url).transform(new CircleTransform()).into(imageView); 
+2

Superb !!! Большое спасибо ... Я просто заменю 'canvas.drawCircle (r, r, r, paint);' с 'canvas.drawRoundRect (новый RectF (0, 0, source.getWidth(), source.getHeight()), r, r, paint); 'to round round rect – Akshay

+1

Вы забыли сказать, что r нужно изменить, чтобы это работало, иначе это сделает круг из RoundRect, потому что радиус слишком велик. – stevyhacker

+0

И оба забыли сказать, что вам нужно изменить r для 0 и size.getHeight(), чтобы он работал (в моем случае). Это окончательный код: 'canvas.drawRoundRect (новый RectF (0, 0, source.getWidth(), source.getHeight()), 0, source.getHeight(), paint);' –

17

Вы можете использовать RoundedCornersTransformation класс picasso-transformations библиотеки.

Пример:

final int radius = 5; 
final int margin = 5; 
final Transformation transformation = new RoundedCornersTransformation(radius, margin); 
Picasso.with(activity).load(url).transform(transformation).into(imageView); 
+6

, если мы установим 'android: scaleType = "centerCrop" 'в' ImageView', а изображение масштабируется, чтобы заполнить представление, тогда ваш метод не будет иметь никакого эффекта, потому что закругленные углы не видны – Choletski

+0

@ Choltski также использует CropTransformation (int width, int height) перед RoundedCornersTransformation – NickUnuchek

+0

@ Choltski, возможно, 'centerCrop()' может помочь: 'Picasso.with (getContext()). load (uri) .centerCrop(). resize (ширина, высота) .transform (transform) .into (imageView) ; '. – CoolMind

17

Вы можете использовать этот класс, чтобы сделать скругленные углы прямоугольника вид изображения с Пикассо, использовать его как этот

Picasso.with(activity).load(url).transform(new RoundedCornersTransform(this)).into(imageView); 

Вот класс RoundedCornersTransform.

package com.demo.picasso; 

import android.graphics.Bitmap; 
import android.graphics.BitmapShader; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 

import com.squareup.picasso.Transformation; 


public class RoundedCornersTransform implements Transformation { 
@Override 
public Bitmap transform(Bitmap source) { 
    int size = Math.min(source.getWidth(), source.getHeight()); 

    int x = (source.getWidth() - size)/2; 
    int y = (source.getHeight() - size)/2; 

    Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); 
    if (squaredBitmap != source) { 
     source.recycle(); 
    } 

    Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); 

    Canvas canvas = new Canvas(bitmap); 
    Paint paint = new Paint(); 
    BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); 
    paint.setShader(shader); 
    paint.setAntiAlias(true); 

    float r = size/8f; 
    canvas.drawRoundRect(new RectF(0, 0, source.getWidth(), source.getHeight()), r, r, paint); 
    squaredBitmap.recycle(); 
    return bitmap; 
} 

@Override 
public String key() { 
    return "rounded_corners"; 
    } 
} 
+0

Это короткое n идеальное решение во всех сообщениях о закругленном угловом преобразовании на SO. Большое спасибо :) – Atul

+1

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

+1

@ Lion789: В библиотеке [picasso-transformations] (https://github.com/wasabeef/picasso-transformations/blob/master/transformations/src/main/java/jp/wasabeef/picasso/transformations/RoundedCornersTransformation. Java) mentionded ниже, можно точно установить углы, которые вы хотите округлый, например: Пикассо .с (mContext) .load (mUrl) .resize (200, 200) .centerCrop() . transform (новый RoundedCornersTransformation (2, 0, RoundedCornersTransformation.CornerType.LEFT)) .into (mImageView); –

5

я использовал RoundedCornersTransformation класс picasso-transformations библиотеки. У меня был пользовательский адаптер с шаблоном держателя вида в моем списке. Я добавил ниже зависимость в моем build.gradle:

dependencies { 
     compile 'jp.wasabeef:picasso-transformations:2.1.0' 
} 

И в моем customArrayAdapter.java, я добавил:

Picasso.with(getContext()).load(path).transform(new RoundedCornersTransformation(10,10)).resize(175,300).into(viewHolder.ivImage);
Это как изменение размера и дать закругленные углы для вас изображений.

1

После @stevyhacker's answer и this related one, я пришел с этим:

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 

import com.squareup.picasso.Transformation; 


public class RoundedCornersTransform implements Transformation { 
    private static Bitmap createRoundedRectBitmap(Bitmap bitmap, 
                float topLeftCorner, float topRightCorner, 
                float bottomRightCorner, float bottomLeftCorner) { 
     Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), 
       Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     final int color = Color.WHITE; 
     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     final RectF rectF = new RectF(rect); 
     Path path = new Path(); 
     float[] radii = new float[]{ 
       topLeftCorner, bottomLeftCorner, 
       topRightCorner, topRightCorner, 
       bottomRightCorner, bottomRightCorner, 
       bottomLeftCorner, bottomLeftCorner 
     }; 

     paint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(color); 
     path.addRoundRect(rectF, radii, Path.Direction.CW); 
     canvas.drawPath(path, paint); 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(bitmap, rect, rect, paint); 
     return output; 
    } 

    @Override 
    public Bitmap transform(Bitmap source) { 
     int size = Math.min(source.getWidth(), source.getHeight()); 

     int x = (source.getWidth() - size)/2; 
     int y = (source.getHeight() - size)/2; 

     Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); 
     if (squaredBitmap != source) { 
      source.recycle(); 
     } 

     float r = size/4f; 

     Bitmap roundedBitmap = createRoundedRectBitmap(squaredBitmap, r, r, r, r); 

     squaredBitmap.recycle(); 

     return roundedBitmap; 
    } 

    @Override 
    public String key() { 
     return "rounded_corners"; 
    } 
} 

Используйте это так:

Picasso.with(context).load(url).transform(new RoundedCornersTransform()).into(imageView); 

Вероятно нуждается некоторые улучшения, хотя, так что следите!

2

Как указано here. Вы можете использовать MaskTransformation класс библиотеки picasso-transformations.

Пример:

final Transformation transformation = new MaskTransformation(getContext(), R.drawable.rounded_convers_transformation); 
Picasso.with(activity).load(url).transform(transformation).into(imageView); 

Рез/рисуем/rounded_convers_transformation.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
    <corners android:radius="5dp"/> 
    <solid android:color="@color/black"/> 
</shape> 

UPDATE: Но обратите внимание, что вы должны также .resize(w,h) изображение, потому что, если изображение будет большой круглый будет не могут быть определены

+0

Хорошее решение. Также обратите внимание, что перед тем, как применить это преобразование, «ImageView» должен быть видимым (в другом случае преобразование не будет применено). И да, вы можете написать 'Picasso.with (getContext()). Load (uri) .centerCrop(). Resize (ширина, высота) .transform (transform) .into (imageView);' для обрезанных изображений. – CoolMind

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