Android Studio实现相机PreviewView圆角效果(仿Instagram/BeReal)
解决Android相机PreviewView圆角取景器的问题
直接给PreviewView设置shape背景/前景无法实现圆角效果,原因是相机预览内容绘制在独立的Surface上,背景Drawable不会对Surface的内容产生裁剪作用,需要通过视图裁剪的方式让预览内容适配圆角。
下面提供两种可行方案:
方案一:使用CardView作为父容器(布局实现)
利用CardView自带的圆角和裁剪特性,将PreviewView嵌套在CardView中,无需额外代码:
修改后的布局代码:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".InterpreterFragment"> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="500dp" app:cardCornerRadius="20dp" app:cardElevation="0dp" <!-- 不需要阴影可设为0 --> android:clipToOutline="true"> <!-- 关键:开启裁剪 --> <androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.cardview.widget.CardView> </FrameLayout>
方案二:通过代码设置OutlineProvider(纯代码实现)
无需额外父布局,直接给PreviewView设置自定义OutlineProvider实现圆角裁剪:
在Fragment的onViewCreated方法中添加代码:
val viewFinder = view.findViewById<PreviewView>(R.id.viewFinder) val cornerRadius = resources.getDimensionPixelSize(R.dimen.corner_radius_20dp).toFloat() // 开启裁剪 viewFinder.clipToOutline = true // 设置自定义圆角轮廓 viewFinder.outlineProvider = object : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { outline.setRoundRect(0, 0, view.width, view.height, cornerRadius) } }
在res/values/dimens.xml中添加圆角尺寸定义:
<dimen name="corner_radius_20dp">20dp</dimen>
补充:添加白色边框
如果需要保留你原本shape中的白色边框,可在PreviewView上方叠加一个相同尺寸的View,设置你的shape作为背景即可:
<!-- 以方案一为例,在CardView内的PreviewView之后添加 --> <View android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/your_corner_border_shape" />
内容的提问来源于stack exchange,提问作者Borealis
相关产品推荐
相关产品推荐

