我最近在做android游戏开发。想问surface作为控件写到xml文件里面后,怎么实现点击surfaceview上的图片进行surfaceview的切换?因为如果用surfaceview(MainActivity)可以进行切换,但是加到xml时要用surfaceview(Context ,AttributeSet)这样就不能引用MainActivity中的handler了。为什么我想将surfaceview写到xml文件呢?因为这样就可以用android的一些控件,比如scrollview,button等
1条回答
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-05 19:40关注
当你将 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(); } } } } // ... }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
- ¥15 perl MISA分析p3_in脚本出错
- ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
- ¥15 ubuntu虚拟机打包apk错误