【问题标题】:How to make an image fit into a circular frame in android如何使图像适合android中的圆形框架
【发布时间】:2012-12-12 14:45:54
【问题描述】:

我有一个ListView,其中有一个ImageView,ImageView 中的图像在从服务器获取后动态加载。 现在,我希望这些任何尺寸的图像都适合圆形框架,该怎么做? 这是我想要的示例图片

【问题讨论】:

标签: android bitmap imageview


【解决方案1】:

在先前答案的帮助下,我想出了这个解决方案。希望它可以帮助其他人:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.widget.ImageView;



public class CircleImage extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.circle_layout);
    ImageView img1 = (ImageView) findViewById(R.id.imageView1);
    Bitmap bm = BitmapFactory.decodeResource(getResources(),
            R.drawable.hair_four);
    Bitmap resized = Bitmap.createScaledBitmap(bm, 100, 100, true);
    Bitmap conv_bm = getRoundedRectBitmap(resized, 100);
    img1.setImageBitmap(conv_bm);
    // TODO Auto-generated method stub
}

public static Bitmap getRoundedRectBitmap(Bitmap bitmap, int pixels) {
    Bitmap result = null;
    try {
        result = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);

        int color = 0xff424242;
        Paint paint = new Paint();
        Rect rect = new Rect(0, 0, 200, 200);

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawCircle(50, 50, 50, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

    } catch (NullPointerException e) {
    } catch (OutOfMemoryError o) {
    }
    return result;
}

 }

【讨论】:

  • 如需更高效的实现,请参阅 Romain Guy 最近的 Android Recipe #1, image with rounded corners 博客文章。主要区别在于它使用BitmapShader 直接控制可见的“纹理”区域,从而将绘图逻辑简化为单个绘图调用。
  • Hey Sanghita,我遇到了同样的要求,碰巧使用了你的代码,尽管它在显示图像时工作正常,但我有问题。我用我的代码替换了以下代码行以增加图像查看为 canvas.drawCircle(90, 90,90, paint);由于 canvas.drawCircle(50, 50,50, paint);给出了一个小的显示视图。但是图像视图中只显示了四分之一的图像。你能帮忙吗?
  • 将以下行更改为:Bitmap resized = Bitmap.createScaledBitmap(bm, 600, 600, true);位图 conv_bm = getRoundedRectBitmap(resized, 600);结果 = Bitmap.createBitmap(950, 950, Bitmap.Config.ARGB_8888);矩形矩形 = 新矩形 (0, 0, 650, 650); canvas.drawCircle(300, 300, 300, 油漆);
  • @Sanghita,是否有必要在此处指定尺寸。因为我的目标是多个设备尺寸,我不想像你提到的那样设置尺寸,因为它占用固定尺寸。图像可以设置为根据 xml 文件中定义的图像视图的大小?我也更改为这个 canvas.drawCircle(130, 130,130, paint);但我不明白如何操作其他参数;这样做不会渲染整个图像。
  • @joy-由于圆是通过编码创建的 match_parent/wrap_content 将不可用,仅更改您的画布大小不会影响图像的大小
【解决方案2】:

试试这个代码:

public static Bitmap getRoundedRectBitmap(Bitmap bitmap, int pixels) {
try {
result = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
canvas = new Canvas(result);

color = 0xff424242;
paint = new Paint();
rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
rectF = new RectF(rect);
roundPx = pixels;

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

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
} catch (NullPointerException e) {
// return bitmap;
} catch (OutOfMemoryError o){}
return result;
}

如果你想要一个实际的圆,那么你可以传递100px 作为参数。

【讨论】:

  • 非常感谢您的帮助,您提供的解决方案是用于圆角矩形中的图片,无需修改大小。只需要几行更改
  • @ricintech-你们能解释一下如何改变用这段代码绘制的圆圈的大小!图像裁剪和其他一切都很完美,但不明白如何增加或减少圆的半径
【解决方案3】:

更新

Github 上有一个CircleImageView。

您可以从Maven repository 获取最新版本作为 gradle 依赖项添加。

【讨论】:

    【解决方案4】:
    【解决方案5】:

    我们可以通过 xml 代码管理图像的高度和宽度,并从 java 代码中绘制圆形/椭圆形

        <ImageView
                android:id="@+id/imageView1"
                android:layout_width="@dimen/width"
                android:layout_height="@dimen/height"
                />
    

    椭圆形视图

    ImageView img1 = (ImageView) findViewById(R.id.imageView1);
    Bitmap bm = BitmapFactory.decodeResource(getResources(),
            R.drawable.user_image);
    Bitmap conv_bm = getRoundedBitmap(bm);
    img1.setImageBitmap(conv_bm);
    
    
    public static Bitmap getRoundedBitmap(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(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
    
        bitmap.recycle();
    
        return output;
      }
    
     }
    

    【讨论】:

      【解决方案6】:

      添加以下依赖项

       implementation 'jp.wasabeef:picasso-transformations:2.2.1'
       implementation 'de.hdodenhof:circleimageview:3.0.0'
      

      如果图像看起来不正确,CircularImageView 也可用于适合圆形的图像。resize 用于在圆形图像视图中调整图像大小。

          CircleImageView img;
          String Imageid; 
      
          Imageid="ImageName"; //String is not compulsary it may be drawable  
      
          Picasso.with(mContext)
                  .load(Imageid.get(position)) //Load the image
                  .error(R.drawable.ic_launcher_background) //Image resource for error
                  .resize(20, 20)  // Post processing - Resizing the image
                  .into(img); // View where image is loaded.
      

      【讨论】:

        【解决方案7】:
         public static Bitmap getCircleBitmap(Bitmap bitmap) {
                final Bitmap circuleBitmap = Bitmap.createBitmap(bitmap.getWidth(),
                        bitmap.getWidth(), Bitmap.Config.ARGB_8888);
                final Canvas canvas = new Canvas(circuleBitmap);
        
                final int color = Color.RED;
                final Paint paint = new Paint();
                final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getWidth());
                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 circuleBitmap;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多