2017-04-12 88 views
-1

我想在我的应用程序中使用圆形ImageView。我发现了一些代码,但这只是圆角图像而不是圆圈。这是我的代码。同时检查图像。Android中的Circular Imageview

enter image description here

public class CircularImageView extends android.support.v7.widget.AppCompatImageView { 

public CircularImageView(Context context) { 
    super(context); 
} 

public CircularImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

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

@Override 
protected void onDraw(Canvas canvas) { 

    Drawable drawable = getDrawable(); 

    if (drawable == null) { 
     return; 
    } 

    if (getWidth() == 0 || getHeight() == 0) { 
     return; 
    } 
    Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); 

    int w = getWidth(), h = getHeight(); 

    Bitmap roundBitmap = getRoundBitmap(bitmap, w); 
    canvas.drawBitmap(roundBitmap, 0, 0, null); 

} 

public static Bitmap getRoundBitmap(Bitmap bmp, int radius) { 
    Bitmap sBmp; 

    if (bmp.getWidth() != radius || bmp.getHeight() != radius) { 
     float smallest = Math.min(bmp.getWidth(), bmp.getHeight()); 
     float factor = smallest/radius; 
     sBmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth()/factor), (int)(bmp.getHeight()/factor), false); 
    } else { 
     sBmp = bmp; 
    } 

    Bitmap output = Bitmap.createBitmap(radius, radius, 
      Bitmap.Config.ARGB_8888); 


    Canvas canvas = new Canvas(output); 

    final int color = 0xffa19774; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, radius, radius); 

    paint.setAntiAlias(true); 
    paint.setFilterBitmap(true); 
    paint.setDither(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(Color.parseColor("#BAB399")); 
    canvas.drawCircle(radius/2 + 0.7f, 
      radius/2 + 0.7f, radius/2 + 0.1f, paint); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(sBmp, rect, rect, paint); 

    return output; 
} 

} 

,这里是xml文件

<com.example.CircularImageView 
      android:layout_width="70dp" 
      android:layout_height="70dp" 
      app:srcCompt="@drawable/dummy /> 

我读了计算器,但没有很多答案,根据我的要求找到。我不想使用任何我想创建自己的代码的库。
我是新来的android可以请让我知道我想我的代码中缺少。

+3

“我发现了一些代码,但这只是圆形图像不能圈出来的 - ”请解释一下这个区别。您可能会考虑在某处上传图片并从您的“问题”链接到该图片。 “根据我的要求找不到任何东西” - 请详细解释**,**,你的“要求”是什么。 – CommonsWare

+0

@CommonsWare请检查我更新我的问题。圆形意味着它只是圆角 –

+0

好吧,当我在Google上搜索“android imageview圆角”时,我找到了各种解决方案。显然,你必须做出类似的搜索。当你尝试[这些答案](http://stackoverflow.com/q/20743859/115145)和[这篇博客文章](http://www.viralandroid.com/2015/11/how-to-make-imageview -image-rounded-corner-in-android.html)等等,你遇到了什么问题? – CommonsWare

回答

1
  1. 尝试从ImageView而不是android.support.v7.widget.AppCompatImageView扩展CircularImageView

CircularImageView.java

package com.ferdous.stackoverflowanswer; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

public class CircularImageView extends ImageView { 

    public CircularImageView(Context context) { 
     super(context); 
    } 

    public CircularImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

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

    @Override 
    protected void onDraw(Canvas canvas) { 

     Drawable drawable = getDrawable(); 

     if (drawable == null) { 
      return; 
     } 

     if (getWidth() == 0 || getHeight() == 0) { 
      return; 
     } 
     Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
     Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); 

     int w = getWidth(), h = getHeight(); 

     Bitmap roundBitmap = getRoundBitmap(bitmap, w); 
     canvas.drawBitmap(roundBitmap, 0, 0, null); 

    } 

    public static Bitmap getRoundBitmap(Bitmap bmp, int radius) { 
     Bitmap sBmp; 

     if (bmp.getWidth() != radius || bmp.getHeight() != radius) { 
      float smallest = Math.min(bmp.getWidth(), bmp.getHeight()); 
      float factor = smallest/radius; 
      sBmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth()/factor), (int)(bmp.getHeight()/factor), false); 
     } else { 
      sBmp = bmp; 
     } 

     Bitmap output = Bitmap.createBitmap(radius, radius, 
       Bitmap.Config.ARGB_8888); 


     Canvas canvas = new Canvas(output); 

     final String color = "#BAB399"; 
     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, radius, radius); 

     paint.setAntiAlias(true); 
     paint.setFilterBitmap(true); 
     paint.setDither(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(Color.parseColor(color)); 
     canvas.drawCircle(radius/2 + 0.7f, radius/2 + 0.7f, radius/2 + 0.1f, paint); 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(sBmp, rect, rect, paint); 

     return output; 
    } 

} 
  • 在XML,尝试使用属性android:src代替app:srcCompt

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:orientation="vertical" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:gravity="center"> 
    
        <com.ferdous.stackoverflowanswer.CircularImageView 
         android:layout_width="200dp" 
         android:layout_height="200dp" 
         android:src="@drawable/dummy" 
         android:background="#ff0000"/> 
    
    </LinearLayout> 
    
  • 输出:

    enter code here

    希望这将有助于〜

    +0

    我也试过它,但结果相同。 –

    +0

    @FiverrProjects我已经更新了我的答案。看到我的代码输出附加的图像。希望这会有所帮助 – FAT

    +0

    @FiverrProjects如果我的回答看起来有用,那么请投票赞成。提前致谢 :) – FAT

    0

    您可以使用fresco lib作圆形图像http://frescolib.org/docs/using-drawees-xml.html。您需要按照文档添加属性fresco:roundAsCircle =“true”int xml布局。此外,该库对于从Web上加载异步图像非常有用。

    +0

    我不想使用任何库 –

    0

    使用Piccasso是很受欢迎

    库在你gradle这个

    compile 'com.makeramen:roundedimageview:2.2.1' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    

    在您的代码:

    Transformation transformation = new RoundedTransformationBuilder() 
          .cornerRadiusDp(40) 
          .oval(false) 
          .build(); 
    
        Picasso.with(getApplicationContext()) 
          .load(//Your url image or bitmap) 
          .fit() 
          .transform(transformation) 
          .into(//Your imageview);