Android 表面视图上不可见的覆盖图片

Android 表面视图上不可见的覆盖图片,android,overlay,surfaceview,Android,Overlay,Surfaceview,我正在尝试为Android设备编写一款老式视频游戏,它的屏幕通过一个名为GraphicsSurface的SurfaceView子类显示。我还将在布局的右下角显示一个名为JoyPadView touch events sensitive的操纵台图片ImageView子类的alpha覆盖,用作游戏控制器。通过阅读,我选择了最可靠的解决方案,如下所示,但它不起作用。事实上,尽管仍接收触摸事件,但操纵手柄从未出现。 我想问题是surfaceView绘图线程继续覆盖着游戏手柄图片,但我不知道到底发生了什么

我正在尝试为Android设备编写一款老式视频游戏,它的屏幕通过一个名为GraphicsSurface的SurfaceView子类显示。我还将在布局的右下角显示一个名为JoyPadView touch events sensitive的操纵台图片ImageView子类的alpha覆盖,用作游戏控制器。通过阅读,我选择了最可靠的解决方案,如下所示,但它不起作用。事实上,尽管仍接收触摸事件,但操纵手柄从未出现。 我想问题是surfaceView绘图线程继续覆盖着游戏手柄图片,但我不知道到底发生了什么,以及如何管理它

以下是布局XML代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.munchman.GraphicSurface
    android:id="@+id/graphicSurface"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<com.example.munchman.JoyPadView
    android:id="@+id/joyPadView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:alpha="0.8"
    android:src="@drawable/joypad"
    android:visibility="visible" />
</FrameLayout>

有人能帮我吗?

SurfaceView的表面应始终位于所有物体的下方,并且SurfaceView的视图部分是透明的。您正在为SurfaceView调用或设置不透明背景吗?问题已解决!非常感谢你的提示!事实上,我在SurfaceHolder.Callback.surfaceCreated方法中调用了setBackgroundColorColor.WHITE,没有意识到它会隐藏曲面图像!这足以消除呼叫以解决问题!总之,我认为Android文档不够全面,特别是对于没有经验的人来说。
public class GraphicSurface extends SurfaceView implements SurfaceHolder.Callback {

//... class attributes  

// INNER CLASS: DRAWING THREAD --------------
class DrawingThread extends Thread {
    private boolean running = false;

    public synchronized void setRunning(boolean run) {
        running = run;
    }

    @Override
    public void run() {
        long timeInterval = 1000l / fps;
        long startTime = System.currentTimeMillis();
        long sleepTime;
        Bitmap scrBmp;
        Canvas c;

        while (running) {
            // DRAWING
            c = null;
            startTime = System.currentTimeMillis();
            try {
                c = holder.lockCanvas();
                if (c != null && screen != null) {
                    synchronized (holder) {  
                        //... "screen" drawing code  
                        c.drawBitmap(scrBmp, origRect, destRect, null);
                    }               
                }
                else {
                    if (c == null) Log.w(TAG, "run(): lockCanvas returned null canvas");
                    else Log.w(TAG, "run(): null screen!");
                }
            } catch (Exception e) {
                Log.e(TAG, "run(): drawing canvas:" + Log.getStackTraceString(e) );
            } finally {
                if (c != null) holder.unlockCanvasAndPost(c);
            }
            // SLEEP TIME
            sleepTime = timeInterval - (System.currentTimeMillis()-startTime);
            try {
                if (sleepTime > 0) sleep(sleepTime);
                else sleep(timeInterval);
            } catch (Exception e) {
                Log.e(TAG, "run(): sleeping: " + e);
            }               
        }
    }
}

private DrawingThread drawingThread = null;

// CONSTRUCTORS -------------------
public GraphicSurface(Context context) {    
    super(context);
    init();
}

public GraphicSurface(Context context, AttributeSet attributes) {
    super(context, attributes);
    init();
}

public GraphicSurface(Context context, AttributeSet attributes, int defStyle) {
    super(context, attributes, defStyle);
    init();
}

// CLASS METHODS -----------------
private void init () {
Log.d(TAG, "init()");
    holder = getHolder();
    holder.addCallback(this);
    setFocusable(true);
    drawingThread = new DrawingThread();
drawingThread.setName(TAG);
fps = DEFAULT_FPS;
//... other code  
}

  /** Enable the SurfaceView embedded drawing thread.
     */
    public synchronized void startDrawingThread() {
        Log.d(TAG, "startDrawingThread()");
        if (drawingThread == null) drawingThread = new DrawingThread();
        if (!drawingThread.isAlive()) {
            drawingThread.setRunning(true);
            drawingThread.start();
        }
    }
}