- vừa được xem lúc

Hiển thị Image nhiều hình dạng với ShapeableImageView

0 0 14

Người đăng: Nguyen Huu Cong

Theo Viblo Asia

Trước đây, khi ta sử dụng ImageView để hiển thị hình ảnh thì nó đơn giản chỉ hiển thị với hình chữ nhật cùi mía thôi. Để hiển thị hình dạng khác mà không tốn thời gian custom view thì ta thường nhờ đến sự cứu cánh của các thư viện, điển hình như CircleImageView của hdodenhof.

Và rồi cuối cùng thì Android cũng đã giới thiệu ShapeableImageView trong Material Design.

ShapeableImageView

ShapeableImageView kế thừa từ AppCompatImageView , nghĩa là nó có tất cả các function được cung cấp như trong AppCompatImageView

XML Attributes mới

  • strokeColor: màu đường viền của ImageView
  • strokeWidth: độ rộng đường viền của ImageView
  • cornerFamily: xác định corner của hình với giá trị là cut hoặc rounded tương ứng với loại cắt góc hay bo góc
  • cornerSize: xác định kích thước của corner, có thể sử dụng bằng giá trị phần trăm hoặc dp

Sử dụng

Thêm marerial design vào Gradle

implementation ‘com.google.android.material:material:1.2.0’

Circle ImageView

Circle ImageView thường được sử dụng nhiều cho avatar của user.

Đầu tiên, ta tạo style.

<style name="circle"> <item name="cornerSize">50%</item>
</style>

Như ở trên, ta không thêm attribute cornerFamily vì giá trị mặc định của nó chính là rounded.

Sau đó gán style vào attribute app:shapeApperanceOverlay ở trong file layout

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/circle" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/circle" app:srcCompat="@drawable/doge" />

Circle ImageView Border

Ta dùng style như Circle Image trên và thêm thuộc tính strokeColor và strokeWidth để thêm border.

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/circle_border" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:padding="5dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/circle" app:srcCompat="@drawable/doge" app:strokeColor="@color/black" app:strokeWidth="5dp" />

Rounded Corner Image

Với loại hình bo góc ta cũng có thể thực hiện bằng cách lồng ImageView vào CardView vì CardView có hỗ trợ bo góc, tuy nhiên nó có thể làm giảm hiệu suất khi render layout. Vì vậy dùng ShapeableImageView thay thế là cách tốt hơn

Thêm style

<style name="rounded_corner"> <item name="cornerSize">20dp</item>
</style>

Sử dụng style trong layout

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/rounded_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:shapeAppearanceOverlay="@style/rounded_corner" app:srcCompat="@drawable/doge" />

Rounded Corner Image Border

Tương tự, ta thêm thuộc tính strokeWidth và strokeColor

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/rounded_corner_with_border" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:padding="5dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:shapeAppearanceOverlay="@style/rounded_corner" app:srcCompat="@drawable/doge" app:strokeColor="@color/black" app:strokeWidth="5dp" />

Cut Corner Image

Đến đây thì ta phải thêm attribute cornerFamily với giá trị là cut

Tạo style

<style name="cut_corner"> <item name="cornerSize">20dp</item> <item name="cornerFamily">cut</item>
</style>

Thêm vào layout

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/cut_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:shapeAppearanceOverlay="@style/cut_corner" app:srcCompat="@drawable/doge" />

Cut Corner Image Border

Tương tự

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/cut_corner_border" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:padding="5dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:shapeAppearanceOverlay="@style/cut_corner" app:srcCompat="@drawable/doge" app:strokeColor="@color/black" app:strokeWidth="5dp" />

Specific Rounded Corner

Thêm style

<style name="specific_rounded_corner"> <item name="cornerSizeTopLeft">50dp</item> <item name="cornerSizeBottomRight">50dp</item> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerFamilyBottomRight">rounded</item>
</style>

Thêm vào layout

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/specific_rounded_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:shapeAppearanceOverlay="@style/specific_rounded_corner" app:srcCompat="@drawable/doge" />

Specific Rounded Corner Border

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/specific_rounded_border_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:padding="5dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:shapeAppearanceOverlay="@style/specific_rounded_corner" app:srcCompat="@drawable/doge" app:strokeColor="@color/black" app:strokeWidth="5dp" />

Specific Cut Corner

Thêm style

<style name="specific_cut_corner"> <item name="cornerSizeTopLeft">50dp</item> <item name="cornerSizeBottomRight">50dp</item> <item name="cornerFamilyTopLeft">cut</item> <item name="cornerFamilyBottomRight">cut</item>
</style>

Thêm vào layout


<com.gogle.android.material.imageview.ShapeableImageView android:id="@+id/specific_cut_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:shapeAppearanceOverlay="@style/specific_cut_corner" app:srcCompat="@drawable/doge" />

Specific Cut Corner Border

Tương tự

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/specific_cut_border_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:padding="5dp" android:scaleType="centerCrop" app:layout_constraintEnd_toEndOf="parent" app:shapeAppearanceOverlay="@style/specific_cut_corner" app:srcCompat="@drawable/doge" app:strokeColor="@color/black" app:strokeWidth="5dp" />

ImageView Rounded and Cut Corners

Một số design sẽ có cả sự kết hợp giữa bo góc và căn góc.

Thêm style

<style name="specific_mix_corner"> <item name="cornerSize">50dp</item> <item name="cornerFamilyTopLeft">cut</item> <item name="cornerFamilyBottomRight">cut</item> <item name="cornerFamilyBottomLeft">rounded</item> <item name="cornerFamilyTopRight">rounded</item>
</style>

Thêm vào layout

<com.google.android.material.imageview.ShapeableImageView android:id="@+id/specific_mix_corner" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" android:scaleType="centerCrop" app:shapeAppearanceOverlay="@style/specific_mix_corner" app:srcCompat="@drawable/doge" />

Programmatically với Kotlin

Nếu muốn set qua code thì ShapeableImageView cung cấp một số hàm mà ta có thể sử dụng.

Ví dụ ta muốn set Top Right Corner bo góc với size là 14dp:

topCornerImage.setShapeAppearanceModel(topCornerImage.getShapeAppearanceModel() .toBuilder() .setTopRightCorner(CornerFamily.ROUNDED,14dp) .build());

Nguồn tham khảo

https://amahmoud91.medium.com/deep-dive-into-shapeableimageview-in-android-1ba7f9a5969e

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 281

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 206

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 107

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 100

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 68

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 315