risingsun03 2013-07-13 03:18 采纳率: 0%
浏览 1233

android中surface的切换问题

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

报告相同问题?

悬赏问题

  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导