0

我一直在开发一个应用程序,其中一个球(位图)出现在画布上,用户点击屏幕的位置。背景是 xml 布局 setContentView(R.layout.newsession)。画布是黑色画布。当我设置我的 java 父类 setContentView(customView) 时,程序运行良好,但是当我将自定义表面视图添加到我的 XML 布局和 setContentView(R.layout.newsession) 时,屏幕只显示画布,而 OnTouch 事件没有不行。难道我做错了什么?我已经为此工作了将近一个星期,我真的需要帮助。我将在下面发布 XML 布局和自定义 SurfaceView 的代码。提前致谢!

XML 布局(新会话)

    <FrameLayout 
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
     >

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:id="@+id/newSessionPage" 
    >   

    <ImageView 
      android:layout_width="231dp" 
      android:id="@+id/ivStrikeGrid" 
      android:layout_gravity="center" 
      android:layout_height="270dp"
      android:layout_marginTop="18dp" 
      android:src="@drawable/strike_grid"
      android:layout_marginBottom="10dp"
    />

    <appsys.studios.CustomSurfaceViewOne 
     android:id="@+id/customSurfaceViewOne1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"></appsys.studios.CustomSurfaceViewOne
    >

  </FrameLayout>

自定义 SurfaceView

   package appsys.studios;
   public class CustomSurfaceViewOne extends SurfaceView implements Runnable{
       public CustomSurfaceViewOne(Context context, AttributeSet attr) {
          super(context, attr);
          ourHolder = getHolder();
     }
      // Other stuff
  }

它像这样工作正常:

    newSeshView = new CustomSurfaceViewOne(this, null);
    setContentView(newSeshView);

但是当我尝试从 XML 布局中使用它时没有任何反应,如下所示:

    newSeshView = new CustomSurfaceViewOne(this, null);
    setContentView(R.layout.newsession);

再次感谢!:)

4

2 回答 2

0

我认为您可能在其触摸读取代表上 缺少视图的invallidate()调用。

我不确定您的代码中到底发生了什么。但是,如果我要创建自己的视图并像您一样将其添加到我自己的布局中。并希望它在阅读触摸事件时改变自己,然后我会在我自己的视图类中做一些事情

   @override
    // i dont remem exact signature of this method. google it or see docs
    // motive is to read touch event of view and doing appropriate changes
    // and redrawing the view again
   public void onTouchEvent(MotionEvent me)
   {
      doCalculation(); // change points where to draw the ball next time. Read me
      invalidate();  // tell the view re draw it self

   }

希望能帮助到你 :)

于 2011-11-06T05:37:19.720 回答
0

我遇到了同样的问题,在寻找答案时发现了你的问题。我解决了它,但我不确定这是正确的方法。

3 个文件、您的主要活动、您的表面视图和您的 XML 文件。

您的 XML 文件看起来不错,其中有表面视图

<appsys.studios.CustomSurfaceViewOne 
 android:id="@+id/customSurfaceViewOne1" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content"></appsys.studios.CustomSurfaceViewOne
>

在您的活动中,添加implements OnTouchListener,使用setContentView(R.layout.newsession);,然后,仍然在您onCreate()添加此行CustomViewOne cvo = (CustomViewOne)findViewById(R.id.customSurfaceViewOne1)并将侦听器设置为cvo.setOnTouchListener(this);

然后添加你的 onTouch

@Override
public boolean onTouch(View v, MotionEvent event) {
    customSurfaceViewOne1.myOnTouch(event);
    return false;
}

customSurfaceViewOne1 类中的方法在哪里myOnTouch(),您将在其中执行所有 ontTouch 事件。注意我通过了MotionEvent event.

同样,我不确定这是否是正确的方法,这就是我让它工作的方式。我这样做的原因是我可以在我的surfaceview 上方放一个admob 广告,哈哈。

于 2012-11-02T17:35:31.030 回答