我正在尝试制作圆形的表面视图。我搜索了很多,但我找不到一个好的解决方案。我现在正在做的是,我将SurfaceView放入FrameLayout,然后将另一个View放在它上面,或者使用PNG蒙版,或者使用形状xml drawable。这是
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="140dp"
android:layout_height="140dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="#000"
android:orientation="vertical"
android:visibility="visible" >
<FrameLayout
android:id="@+id/videorecordview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight=".2" >
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@drawable/rounded"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
但这不是一个好的解决方案,也不是很完美。我想将surfaceview自定义为圆形。任何帮助将非常感激。谢谢:))
答案 0 :(得分:9)
一点点破解。将表面视图放在卡片视图中。
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_normal"
app:cardCornerRadius="10dp"
app:cardPreventCornerOverlap="false">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/margin_normal" />
</android.support.v7.widget.CardView>
不要忘记将其添加到您的gradle文件中以使用CardView
compile 'com.android.support:cardview-v7:25.0.1'
这两行内部卡片视图
app:cardCornerRadius="10dp"
app:cardPreventCornerOverlap="false"
干杯快乐编码
答案 1 :(得分:4)
您无法更改SurfaceView的Surface的形状。
SurfaceView有两个部分,Surface和View。 View部分的工作方式与其他View一样。默认情况下,它只是一个透明的&#34;孔&#34;,在布局中创建一个窗口。应用程序将所有视图渲染到单个图层上。
“曲面”部分是一个位于“视图”图层后面的单独图层(除非您明确更改“曲面”的Z顺序),因此您只能看到它通过&#34;显示的位置。 View层的透明区域。您可以在“视图”图层上绘制以遮盖“曲面”的某些部分,但不能更改“曲面”图层本身的形状。图层是矩形的。
在许多情况下,可以使用TextureView代替SurfaceView。 TextureView提供了更大的灵活性,因为它由应用程序渲染到View层,但效率低于SurfaceView。
可以在Android graphics architecture doc中找到更多信息。
答案 2 :(得分:0)
要实现您的要求,这很容易做到。 您只需要使用下一个XML:
<androidx.cardview.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="12dp">
<SurfaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</androidx.cardview.widget.CardView>
要使用此CardView,请在您的 build.gradle 应用上添加此依赖项:
实现“ androidx.cardview:cardview:1.0.0”
答案 3 :(得分:-2)
试试这个
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF"
android:angle="270"/>
</shape>
<SurfaceView
android:background="@drawable/circle"
android:id="@+id/surfaceView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />