web-dev-qa-db-ja.com

Android-角が1つだけ丸いImageView

このようなImageViewを作成したい(画像の右側):

enter image description here

CardViewレイアウトでそれを持っているので、カードの角を丸めましたが、画像の左下隅だけを(または右上で)丸める必要があります。

私はいくつかのオプションを試しましたが、何も正しく動作しません。

これどうやってするの?ヒントはありますか?

5
Pepa Zapletal

Material Components Library を使用できます。
バージョンあり1.2.0-alpha03新しいShapeableImageViewがあります。

レイアウトで使用するだけです:

  <com.google.Android.material.imageview.ShapeableImageView
      app:srcCompat="@drawable/..."
      ../>

そして、あなたのコードでShapeAppearanceModelを次のように適用します:

float radius = getResources().getDimension(R.dimen.default_corner_radius);
imageView.setShapeAppearanceModel(imageView.getShapeAppearanceModel()
    .toBuilder()
    .setTopRightCorner(CornerFamily.ROUNDED,radius)
    .setBottomLeftCorner(CornerFamily.ROUNDED,radius)
    .build());

enter image description here

1

これを試して :

<androidx.cardview.widget.CardView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_margin="16dp"
    app:cardCornerRadius="20dp">

    <ImageView
        Android:id="@+id/image_view"
        Android:layout_width="150dp"
        Android:layout_height="150dp"
        Android:layout_gravity="top|right"
        Android:scaleType="fitXY"
        Android:src="@drawable/person" />
</androidx.cardview.widget.CardView>

そしてあなたの活動で:

 ImageView image = findViewById(R.id.image_view);
        Bitmap bitImg = BitmapFactory.decodeResource(getResources(),
                R.drawable.person);
        image.setImageBitmap(createRoundedRectBitmap(bitImg, 0, 20, 0, 20));
    }


    private static Bitmap createRoundedRectBitmap(@NonNull 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;
    }
0

これは単純で、ドローアブルリソースファイルを作成するだけですtext_logo_fix.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#fff"/>
    <corners Android:bottomLeftRadius="30dp" Android:topRightRadius="30dp"/>
</shape>

この描画可能ファイルをImageViewプロパティAndroid:backgroundに設定します

<ImageView
            Android:id="@+id/imageView"
            Android:layout_width="100dp"
            Android:layout_height="100dp"
            Android:background="@drawable/herenamedrawableresourcefile"
            Android:layout_gravity="center_horizontal"
            Android:src="@drawable/text_logo_fix" />

またはあなたはこのように見えることができます

<LinearLayout
            Android:padding="10dp"
            Android:layout_marginTop="20dp"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:background="@drawable/herenamedrawableresourcefile">
            <ImageView
                Android:id="@+id/imageView"
                Android:layout_width="100dp"
                Android:layout_height="100dp"
                Android:layout_gravity="center_horizontal"
                Android:src="@drawable/text_logo_fix" />
        </LinearLayout>
0
Ramadanrizky87