我们使用CardView作为容器,利用其cardCornerRadius属性设置圆形效果,内部放置SurfaceView。同时,为了确保SurfaceView也被正确裁剪为圆形,我们还需要使用ViewOutlineProvider进行硬件加速的圆形裁剪
-
XML布局配置
<androidx.cardview.widget.CardView android:id="@+id/circularCard" android:layout_width="200dp" android:layout_height="200dp" app:cardCornerRadius="100dp" <!-- 半径=宽度/高度的一半 --> app:cardPreventCornerOverlap="false" <!-- 禁用边角重叠保护 --> app:cardElevation="0dp" <!-- 禁用阴影保证圆形完美度 --> app:cardBackgroundColor="@android:color/transparent"> <!-- 透明背景 --> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.cardview.widget.CardView> -
代码动态适配
// 在Activity/Fragment中 CardView cardView = findViewById(R.id.circularCard); SurfaceView surfaceView = findViewById(R.id.surfaceView); // 添加布局监听确保正确尺寸 cardView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { int diameter = Math.min(cardView.getWidth(), cardView.getHeight()); // 动态设置圆角半径 cardView.setRadius(diameter / 2f); // API 21+ 设备启用硬件裁剪(高性能) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { surfaceView.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, diameter, diameter, diameter / 2f); } }); surfaceView.setClipToOutline(true); } }); -
圆角控制
- 作用:定义卡片四个角的弯曲弧度(单位:dp),值越大圆角越明显。
- 圆形效果:当半径设为宽度/高度一半时(cardCornerRadius=“100dp”),卡片呈现正圆形
451

被折叠的 条评论
为什么被折叠?



