làm thế nào để làm cho bề mặt trong suốt


83

Xin chào tất cả tôi muốn làm cho chế độ xem DrawingSurface của tôi trong suốt. tôi đã thử nhiều thứ nhưng nó không hoạt động.

Đây là mã xml của tôi để làm cho chế độ xem bề mặt của tôi trong suốt

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:src="@drawable/icon" >
        </ImageView>

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#00000000" >

            <codewalla.android.drawings.DrawingSurface
                android:id="@+id/drawingSurface"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >
            </codewalla.android.drawings.DrawingSurface>
        </LinearLayout>
    </FrameLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/colorRedBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="R" />

        <Button
            android:id="@+id/colorBlueBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="G" />

        <Button
            android:id="@+id/colorGreenBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="B" />

        <Button
            android:id="@+id/undoBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="U" />

        <Button
            android:id="@+id/redoBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="R" />
    </LinearLayout>

</RelativeLayout>

Câu trả lời:


212

Hãy thử điều này trong hàm tạo:

SurfaceView sfvTrack = (SurfaceView)findViewById(R.id.sfvTrack);
sfvTrack.setZOrderOnTop(true);    // necessary
SurfaceHolder sfhTrackHolder = sfvTrack.getHolder();
sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);

9
Chà, tôi đã rất quan tâm đến điều này, đã thêm định dạng pixel trong suốt cũng như nền trong suốt trong XML. Hóa ra lệnh gọi 'setZOrderOnTop (true)' là CRITICAL. Cảm ơn vì đã đăng bài này, tôi sẽ không bao giờ thử nó nếu không.
ProjectJourneyman

42
Điều này hoạt động tốt ngoại trừ setZOrderOnTop () có nghĩa là bạn không thể đặt bất kỳ đồ họa nào lên trên SurfaceView này, điều này thật đáng tiếc. = \
drc

2
Nhưng nó bao gồm tất cả các chế độ xem khác trên bố cục, có nghĩa là nếu tôi vẽ trên chế độ xem bề mặt thì bất kỳ hình ảnh / nút nào sẽ được vẽ. làm thế nào tôi có thể thoát khỏi vấn đề này?
skygeek

Cố gắng ở bên tôi. Hoạt động tuyệt vời trên 4.0 nhưng 2.3.
wayne_bai

2
"Thử nghiệm đa bề mặt" trong Grafika cho thấy ba SurfaceViews chồng chéo trong suốt được trộn với lớp View UI. github.com/google/grafika/blob/master/src/com/android/grafika/… . FWIW, "thử cái này trong hàm tạo" có lẽ nên đọc "thử cái này trong onCreate()" và việc thay đổi định dạng pixel từ RGB565 thành RGB888 cũng khá cần thiết.
fadden

8
sfvTrack.setZOrderOnTop(true); 

sẽ đặt surfaceView trên đầu cửa sổ, nghĩa là bạn không thể thêm các mục lên trên surfaceView.

Nếu bạn muốn thêm các chế độ xem trên cùng của chế độ xem bề mặt; bạn nên xem xét sử dụng:

setZOrderMediaOverlay(true);

thay thế. Thao tác này đặt surfaceView này lên trên các surfaceView khác, nhưng vẫn ở phía sau cửa sổ, cho phép bạn thêm các khung nhìn có thể nhìn thấy khác lên trên surface view.


4

Có phải DrawingSurface và phần mở rộng của SurfaceView không?

Không có cách nào để SurfaceView làm những gì bạn muốn nó làm. Cơ chế của chế độ xem bề mặt là như vậy mà nó không thể có bất cứ điều gì có thể nhìn thấy đằng sau nó. (xem câu trả lời tại đây http://groups.google.com/group/android-developers/browse_thread/thread/8d88ef9bb22da574 )

Tôi đã kiểm tra hệ thống phân cấp của bạn với chế độ xem tùy chỉnh mở rộng SurfaceView và tôi thấy vấn đề của bạn. Nếu tôi chuyển sang chế độ xem tùy chỉnh chỉ mở rộng Chế độ xem, tôi có thể có được độ trong suốt.


nhờ slund, bạn là đúng nhưng nó cần phải đặt xem trước camera đằng sau nó và nó bề mặt vẽ của tôi, vì vậy tôi muốn rút ra sau khi xem trước camera
Sunil Pandey

4

TexttureViewSurfaceViewTôi tin rằng sẽ tốt hơn cho nhu cầu của bạn .


1
Có, miễn là chúng tôi không cần nhắm mục tiêu sớm hơn 14!
Casey Murray
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.