android中surface的切换问题

我最近在做android游戏开发。想问surface作为控件写到xml文件里面后,怎么实现点击surfaceview上的图片进行surfaceview的切换?因为如果用surfaceview(MainActivity)可以进行切换,但是加到xml时要用surfaceview(Context ,AttributeSet)这样就不能引用MainActivity中的handler了。为什么我想将surfaceview写到xml文件呢?因为这样就可以用android的一些控件,比如scrollview,button等

当你将 SurfaceView 写入 XML 文件中时,它会使用第二个构造函数,即:

public SurfaceView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

因此,您无法直接访问 MainActivity 中的 handler。


要解决这个问题,您可以在 SurfaceView 中定义一个接口,并在 MainActivity 中实现该接口。然后,您可以在 SurfaceView 的构造函数中将接口的实现传递给 SurfaceView。您可以在 SurfaceView 中使用该接口调用 MainActivity 中的方法。

例如,您可以这样定义接口:

public interface OnImageClickListener {
    void onImageClicked();
}

然后,在 SurfaceView 中定义一个 OnImageClickListener 字段,并在构造函数中将它设置为传递的实现。

public class MySurfaceView extends SurfaceView {
    private OnImageClickListener mListener;
 
    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // ...
    }
 
    public void setOnImageClickListener(OnImageClickListener listener) {
        mListener = listener;
    }
}

然后,在 MainActivity 中,您可以实现 OnImageClickListener 接口,并将 MainActivity 的实现传递给 SurfaceView:

public class MainActivity extends Activity implements OnImageClickListener {
 
    private MySurfaceView mSurfaceView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mSurfaceView = (MySurfaceView) findViewById(R.id.surface_view);
        mSurfaceView.setOnImageClickListener(this);
    }
 
    @Override
    public void onImageClicked() {
        // 在这里处理点击事件
    }
}

在 SurfaceView 中,您可以使用 mListener 调用 onImageClicked() 方法来处理点击事件。例如,您可以在 SurfaceView 的绘制循环中检查是否点击了图像,然后调用 onImageClicked() 方法。


需要注意的是,您需要保证在点击事件发生时 mListener 不为 null。因此,您需要在调用 mListener.onImageClicked() 之前检查它是否为 null。

例如:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
 
    private OnImageClickListener mListener;
 
    // ...
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 开始绘制循环
        while (true) {
            // 绘制图像
            // ...
 
            // 检查是否点击了图像
            if (imageClicked) {
                if (mListener != null) {
                    mListener.onImageClicked();
                }
            }
        }
    }
 
    // ...
}