2017-02-07 2 views
2

Я пытаюсь сделать мой раунд ImageView. Я написал следующий код, чтобы он выглядел круглым, но каким-то образом он все еще показывает квадрат ImageView. [Использование Picasso для извлечения изображения]Код Android, чтобы сделать изображениеView круглым не работает

Java кода:

ImageView iv = (ImageView) addLinkDialog.findViewById(R.id.group_icon_jsoup); 
Picasso.with(getBaseContext()).load(GroupImageUrl).into(iv); 
iv.setBackgroundResource(R.drawable.icon_img); 

ImageView код:

<ImageView 
    android:id="@+id/group_icon_jsoup" 
    android:layout_width="75dp" 
    android:layout_height="75dp" 
    android:layout_gravity="center" 
    android:layout_margin="8dp" 
    android:background="@drawable/icon_img" /> 

@ вытяжка/icon_img.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:drawable="@drawable/circle"/> 
</layer-list> 

@ вытяжка/круга. xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:innerRadius="0dp" 
    android:shape="ring" 
    android:thicknessRatio="1.9" 
    android:useLevel="false" > 
<solid android:color="@android:color/transparent" /> 

<stroke 
    android:width="10dp" 
    android:color="@android:color/white" /> 
</shape> 
+1

http://stackoverflow.com/questions/22105775/imageview-in-circular-through-xml –

+0

@GaneshPatil Я взял код с того же места. Он не работает. Может быть, потому, что я устанавливаю изображение, используя пикассо. –

+0

попробуйте это одно закругленное изображение с picaso http://stackoverflow.com/questions/26112150/android-create-circular-image-with-picasso –

ответ

1

Основная проблема будет при использовании Пикассо, чтобы установить изображение снова установить на imageView просмотра границ не на ее фоне, который вы создаете.

Если вы программно установите один, он переопределит ваш фон!

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="false"> 
     <shape android:shape="oval"> 
      <solid android:color="@color/colorPrimary"/> 
     </shape> 
    </item> 
</selector> 

Вы можете установить в качестве фона ваших view.Then пытаются использовать view.setBackgroundResource(R.drawable.icon_img);. вы заметите изменение!

Вы можете пройти через Add a background image to shape in xml Android

Mask ImageView with round corner background

проверить различные способы люди пытались здесь!

Но с Picasso вы можете сделать это напрямую с другими третьими сторонами.

final ImageView imageView = (ImageView) findViewById(R.id.group_icon_jsoup); 
    Picasso.with(YourActivity.this).load("http://i.imgur.com/DvpvklR.png") 
      .resize(100, 100) 
      .into(imageView, new Callback() { 
       @Override 
       public void onSuccess() { 
        Bitmap imageBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 
        RoundedBitmapDrawable imageDrawable = RoundedBitmapDrawableFactory.create(getResources(), imageBitmap); 
        imageDrawable.setCircular(true); 
        imageDrawable.setCornerRadius(Math.max(imageBitmap.getWidth(), imageBitmap.getHeight())/2.0f); 
        imageView.setImageDrawable(imageDrawable); 
       } 
       @Override 
       public void onError() { 
        imageView.setImageResource(R.drawable.amanda); 
       } 
      }); 
+0

Не идеальный, хотя. Это дает мне странную некруглую границу, которая видна, если я поставлю темный цвет в родительском макете. Но это похоже на проблему вычисления пикселей в библиотеке picasso. Мой просмотр изображений не будет принимать новые изображения за один жизненный цикл активности, так что это сработает для меня на данный момент. –

+1

@Srujan Barai вы можете получить идеальное решение, используя краску или маскируя изображение, и ваша проблема может быть вызвана тем, что значение изменения размера на моем примере –

3

Вы хотите использовать только код, или вы тоже в библиотеке? Если вы в порядке с библиотекой, я могу предложить библиотеку this, мне очень помогли. Если вы не хотите использовать библиотеку, вы можете использовать RoundedBitmapDrawable:

RoundedBitmapDrawable drawable = 
     RoundedBitmapDrawableFactory.create(context.getResources(), bitmap) 

drawable.setCircular(true); 

Используйте эту вытяжку в вашем ImageView.

+1

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

+0

@SrujanBarai Хорошо, дайте мне несколько минут. Я обновлю ответ. –

+3

, когда ссылка нарушена, ваш ответ не имеет значения –

4

Почему бы не использовать третье лицо?

Попробуйте этот код

Bitmap picture = BitmapFactory.decodeResource(getResources(), R.mipmap.add_image); 

ImageView imageView = (ImageView) findViewById(R.id.imgProfilePicture); 
imageView.setImageBitmap(getRoundedBitmap(picture)); 

public Bitmap getRoundedBitmap(Bitmap bitmap){ 
     Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
     BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     Paint paint = new Paint(); 
     paint.setShader(shader); 
     paint.setAntiAlias(true); 
     Canvas c = new Canvas(circleBitmap); 
     c.drawCircle(bitmap.getWidth()/2, bitmap.getHeight()/2, bitmap.getWidth()/2, paint); 
     return circleBitmap; 
    } 

Ваш файл XML

<de.hdodenhof.circleimageview.CircleImageView 
     android:id="@+id/imgProfilePicture" 
     android:layout_width="110dp" 
     android:layout_height="110dp" 
     android:layout_marginBottom="20dp" 
     app:civ_border_width="3dp" 
     app:civ_border_color="@color/light_gray" /> 

и добавить в build.gradle

compile 'de.hdodenhof:circleimageview:2.1.0' 

Cirular ImageView Сделано!

enter image description here

+0

Я хотел знать, что мой код не работает. Использование lib только для того, чтобы установить imagview round, не показалось мне хорошим. –

+0

Почему вы не можете использовать стороннюю библиотеку? Когда дело доходит до юридического стандарта, доступность использования существенно зависит от лицензии, предоставляемой разработчиком сторонней библиотеки. – JoxTraex

0

Надеется, что это поможет вам Виль:

круглого button.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="false"> 
    <shape android:shape="oval"> 
     <solid android:color="@color/colorPrimary"/> 
    </shape> 
</item> 
<item android:state_pressed="true"> 
    <shape android:shape="oval"> 
     <solid android:color="#c20586"/> 
    </shape> 
</item> 
</selector> 

использовать это в вашем ImageView

<ImageView 
    android:layout_width="120dp" 
    android:layout_height="120dp" 
    android:padding="10dp" 
    android:src="@drawable/your_Image" 
    android:background="@drawable/round_button" 
    /> 
0

Попробуйте это,

ImageView iv = (ImageView) addLinkDialog.findViewById(R.id.group_icon_jsoup); 

Picasso.with(getBaseContext()).load(GroupImageUrl).transform(new RoundedTransformation(5,15, Color.parseColor("#27a3cb"))).fit().into(iv); 



public class RoundedTransformation implements Transformation { 


private int mBorderSize; 
private int mCornerRadius = 0; 
private int mColor; 

public RoundedTransformation(int borderSize, int color) { 
    this.mBorderSize = borderSize; 
    this.mColor = color; 
} 

public RoundedTransformation(int borderSize, int cornerRadius, int color) { 
    this.mBorderSize = borderSize; 
    this.mCornerRadius = cornerRadius; 
    this.mColor = color; 
} 

@Override 
public Bitmap transform(Bitmap source) { 
    int width = source.getWidth(); 
    int height = source.getHeight(); 

    Bitmap image = Bitmap.createBitmap(width, height, source.getConfig()); 
    Canvas canvas = new Canvas(image); 
    canvas.drawARGB(0, 0, 0, 0); 

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    Rect rect = new Rect(0, 0, width, height); 


    if(this.mCornerRadius == 0) { 
     canvas.drawRect(rect, paint); 
    } 
    else { 
     canvas.drawRoundRect(new RectF(rect),this.mCornerRadius, this.mCornerRadius, paint); 
    } 

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

    Bitmap output; 

    if(this.mBorderSize == 0) { 
     output = image; 
    } 
    else { 
     width = width + this.mBorderSize * 2; 
     height = height + this.mBorderSize * 2; 

     output = Bitmap.createBitmap(width, height, source.getConfig()); 
     canvas.setBitmap(output); 
     canvas.drawARGB(0, 0, 0, 0); 

     rect = new Rect(0, 0, width, height); 

     paint.setXfermode(null); 
     paint.setColor(this.mColor); 
     paint.setStyle(Paint.Style.FILL); 

     canvas.drawRoundRect(new RectF(rect), this.mCornerRadius, this.mCornerRadius, paint); 

     canvas.drawBitmap(image, this.mBorderSize, this.mBorderSize, null); 
    } 

    if(source != output) source.recycle(); 

    return output; 
} 

@Override 
public String key() { 
    return "bitmapBorder(" + 
      "borderSize=" + this.mBorderSize + ", " + 
      "cornerRadius=" + this.mCornerRadius + ", " + 
      "color=" + this.mColor +")"; 
} 

}

1

Здравствуйте @Surjan вот код, который поможет создать образ в любой форме, которую вы хотите только вам нужно изображение вашей формы выбора с прозрачной и комбинации любого другого цвета, следующий был пример :

protected Bitmap getPinnedImage(Bitmap original, int shapeImage) { 
     if (original == null) { 
      original = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_round_shape); 
     } 
     Bitmap mask = BitmapFactory.decodeResource(context.getResources(), shapeImage); 

     original = Bitmap.createScaledBitmap(original, mask.getWidth(), mask.getHeight(), true); 

     Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas mCanvas = new Canvas(result); 

     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
     mCanvas.drawBitmap(original, 0, 0, null); 
     mCanvas.drawBitmap(mask, 0, 0, paint); 
     paint.setXfermode(null); 
     return result; 
    } 

Здесь параметр буксировки первого один исходный битовый массив, а вторые из них является вашей форма вытяжки, как был следующей формой Pin

enter image description here , теперь проходящий после этого рисования, вы можете получить изображение в форме булавки, не нужно обращаться к какой-либо третьей стороне библиотеки.

+0

Я не пробовал это, как уже нашел временное решение моей проблемы. Это кажется хорошим решением, но я не работал с холстом. Будет использовать, если я сталкиваюсь с проблемами с моим текущим решением. –

+0

Тогда не проблема, но если вам когда нужна сложная форма, вы можете ее использовать, и спасибо за голосование. –

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