Добавление пользовательского представления в макет XML с помощью OnTouchListener - PullRequest
0 голосов
/ 06 ноября 2011

Я работал над приложением, в котором шар (растровое изображение) появляется на холсте в точке, где пользователь нажимает на экран.Фон представляет собой XML-макет setContentView (R.layout.newsession).Холст - это черный расписанный холст.Когда я устанавливаю свой родительский класс java setContentView (customView), программа работает нормально, но когда я добавляю пользовательский вид поверхности в свой макет XML и setContentView (R.layout.newsession), на экране просто отображается холст, а событие OnTouch нене работаетЯ делаю что-то неправильно?Я работаю над этим уже почти неделю, и мне действительно нужна помощь.Я опубликую свой код ниже для XML-макета и пользовательского SurfaceView.Заранее спасибо!

XML-макет (newsession)

    <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);

Еще раз спасибо!:)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2012

Я столкнулся с той же проблемой и нашел ваш вопрос, когда искал ответ. Я решил это, но я не уверен, что это правильный путь.

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;
}

, где myOnTouch() - это метод в вашем классе customSurfaceViewOne1, где вы будете выполнять все ваши события ontTouch. Обратите внимание, что я прошел в MotionEvent event.

Опять же, я не уверен, что это правильный способ сделать это, просто я заставил его работать. Причина, по которой я это сделал, состояла в том, чтобы у меня было объявление в виде рекламы над моим видом на поверхность.

0 голосов
/ 06 ноября 2011

Я думаю, что вы можете отсутствовать 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

   }

Надеюсь, это поможет:)

...