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