Search code examples
androidmaterial-componentsmaterial-components-androidandroid-shapeandroid-shapedrawable

ImageView with only one rounded corner


I'm trying to make one rounded corner of ImageView like in the picture below but with bottom right corner. Tried using background shape but it's not working at all. All images loaded by Glide. Should i use something like ViewOutlineProvider? Is there are an efficient way to do this? Thanks!

<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners
        android:radius="2dp"
        android:bottomRightRadius="20dp"
        android:bottomLeftRadius="0dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp"/>
</shape>

Example from Android Material Docs


Solution

  • With jetpack compose you can apply the clip Modifier using a RoundedCornerShape:

    Image(painterResource(id = R.drawable.xxx),
        contentDescription = "xxxx",
        contentScale = ContentScale.Crop,
        modifier = Modifier
            .size(xx.dp,xx.dp)
            .clip(RoundedCornerShape(topStart = 12.dp)),
    )
    

    enter image description here


    With The Material Components library you can use the ShapeableImageView (introduced with the version 1.2.0-alpha03).

    Just use something like:

      <com.google.android.material.imageview.ShapeableImageView
          android:id="@+id/image_view"
          android:scaleType="centerInside"
          android:adjustViewBounds="true"
          ../>
    

    then in your code you can apply the ShapeAppearanceModel with:

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

    enter image description here

    You can also apply in the xml the shapeAppearanceOverlay parameter:

    <com.google.android.material.imageview.ShapeableImageView
          app:shapeAppearanceOverlay="@style/customRroundedImageView"
          app:srcCompat="@drawable/ic_image" />
    

    with:

      <style name="customRoundedImageView" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">0dp</item>   
        <item name="cornerSizeTopRight">8dp</item>
      </style>