web-dev-qa-db-ja.com

androidで画像を円形フレームに収める方法

ListViewがあるImageViewがあり、ImageView内の画像はサーバーから取得された後に動的にロードされます。さて、どんなサイズのこれらの画像も円形フレームに収まるようにしたいのですが、どうすればいいですか?ここに私が欲しいもののサンプル写真があります

enter image description here

25
Sanghita

以前の回答の助けを借りて、私はこの解決策を思いつきました。

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;
}

 }
24
Sanghita

このコードを試してください:

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をパラメーターとして渡すことができます。

9
Ricky Khatri

更新

Githubで利用可能な CircleImageView があります。

最新バージョンは Mavenリポジトリ から取得でき、gradle依存関係として追加できます。

8
S.D.

これに関して多くのチュートリアルがあります。役立つと思います。

https://github.com/lopspower/CircularImageView

https://github.com/wisemandesigns/CircularImageView

https://coderwall.com/p/hmzf4w

4
Yogendra

xmlコードから画像の高さと幅を管理し、Java code likeから円/楕円を描くことができます

    <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;
  }

 }
1
ranjan