图片裁剪我们最常见的做法是通过自定义视图使用 BitmapShader 或者 Xfermode 方式来实现
BitmapShader 和 Xfermode 不是这里的重点, 具体可以自行去查找
下面介绍的主角是通过 CardView 和 ViewOutlineProvider 来圆角圆形需求, 而且这两种方式主要是针对控件
CardView 是 Android 5.0 引入的卡片显示控件, 可以实现阴影和圆角
ViewOutlineProvider 是 Android 5.x 引入的新特性, 用于实现 View 的阴影和轮廓
废话不多说, 直接看实现方法
CardViews 实现圆形
- <android.support.v7.widget.CardView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:layout_gravity="center"
- android:layout_marginTop="10dp"
- app:cardCornerRadius="50dp">
- <ImageView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:scaleType="centerCrop"
- android:src="@drawable/girl" />
- </android.support.v7.widget.CardView>
CardViews 实现圆形
- <android.support.v7.widget.CardView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:layout_gravity="center"
- android:layout_marginTop="10dp"
- app:cardCornerRadius="10dp">
- <ImageView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:scaleType="centerCrop"
- android:src="@drawable/girl" />
- </android.support.v7.widget.CardView>
上面两种方式主要是设置 CardView 的 cardCornerRadius 属性, 如果要展示指定的圆角, 把这个值设置成你想要的圆角值就行, 如果展示为圆形, 首先要设置 CardView 长宽等值, 而且 cardCornerRadius 为长宽的一半
ViewOutlineProvider 实现圆角
- roundImage.setOutlineProvider(new ViewOutlineProvider() {
- @Override
- public void getOutline(View view, Outline outline) {
- outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 30);
- }
- });
- roundImage.setClipToOutline(true);
ViewOutlineProvider 实现圆形
- circleImage.setOutlineProvider(new ViewOutlineProvider() {
- @Override
- public void getOutline(View view, Outline outline) {
- outline.setOval(0, 0, view.getWidth(), view.getHeight());
- }
- });
- circleImage.setClipToOutline(true);
setClipToOutline 方法可以在前设置也可以在为设置, 如果设置为 false 则表示禁止裁剪, setOutlineProvider 方法将无效
注意: 如果我们的应用设置了 android:hardwareAccelerated="false", 以上方式都将无效
来源: https://juejin.im/post/5a7a6bd1f265da4e9c630fa9