如何制作圆形表面视图

时间:2016-04-12 05:06:38

标签: android surfaceview

我正在尝试制作圆形的表面视图。我搜索了很多,但我找不到一个好的解决方案。我现在正在做的是,我将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自定义为圆形。任何帮助将非常感激。谢谢:))

4 个答案:

答案 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" />