我最近在做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();
}
}
}
}
// ...
}