Добавление GestureOverlayView в мой класс SurfaceView, как добавить для просмотра иерархии? - PullRequest
3 голосов
/ 31 июля 2010

В последующем ответе мне сообщили, что я должен добавить GestureOverlayView, который я создаю в коде, к своей иерархии представления, и я не на 100%, как это сделать.Ниже приведен оригинальный вопрос о полноте.

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

Все это прекрасно работает.

Я пытаюсьдобавить GestureOverlayView к этому, и он просто не работает.Наконец-то взломанный, где он не падает, но это то, что у меня есть

public class Panel extends SurfaceView implements SurfaceHolder.Callback,         OnGesturePerformedListener  
{ 
public Panel(Context context)
{
    theContext=context;
    mLibrary = GestureLibraries.fromRawResource(context, R.raw.myspells);
    GestureOverlayView gestures = new GestureOverlayView(theContext);       
    gestures.setOrientation(gestures.ORIENTATION_VERTICAL);
    gestures.setEventsInterceptionEnabled(true);
    gestures.setGestureStrokeType(gestures.GESTURE_STROKE_TYPE_MULTIPLE);

    gestures.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));

    //GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
    gestures.addOnGesturePerformedListener(this);
 }
 ...
 ...
 onDraw...
surfaceCreated(..);
...
...


public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
  ArrayList<Prediction> predictions = mLibrary.recognize(gesture);

  // We want at least one prediction
  if (predictions.size() > 0) {
   Prediction prediction = predictions.get(0);
   // We want at least some confidence in the result
   if (prediction.score > 1.0) {
    // Show the spell    
     Toast.makeText(theContext, prediction.name, Toast.LENGTH_SHORT).show();
   }
  }
 }


}

onGesturePerformed никогда не вызывается.Их пример имеет GestureOverlay в xml, я не использую его, моя деятельность проста:

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    Panel p = new Panel(this);
    setContentView(p);
}

Так что я немного теряю недостающую часть информации здесь, это не таквызовите onGesturePerformed, и красивый довольно желтый «Вы рисуете жест» никогда не появится.

Ответы [ 4 ]

6 голосов
/ 21 декабря 2010

Это была большая боль, но я наконец-то нашел решение. Нет абсолютно никакой хорошей документации по этому вопросу в любом месте онлайн. Наконец-то я получил работу, используя что-то, называемое «FrameLayout», а затем добавил туда и вид поверхности, и вид жестов. Как только вы это сделаете, вы устанавливаете FrameLayout в качестве представления контента.

К сожалению, вышеприведенное решение, предложенное RomanGuy, похоже, не сработало (или, возможно, я просто не смог заставить его работать) по какой-то причине. Для класса SurfaceView доступна функция no .addView(), как и для обычного просмотра. Эта функция существует для ViewGroups и будет отлично работать для добавления жестов на что-либо, кроме поверхностного вида, я думаю.

Ваша работа должна реализовывать интерфейс OnGesturePerformedListener, чтобы это работало.

Вы можете увидеть полный учебник и исходный код на моем сайте здесь: http://scanplaygames.com/?p=193

   package view.stack;

import game.core.GameView;

import java.util.ArrayList;
import android.app.Activity;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.Prediction;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.Toast;

public class GestureActivity extends Activity implements OnGesturePerformedListener 
{
    protected GameView surfaceView;
    protected GestureOverlayView gestureOverlayView;
    protected GestureLibrary mLibrary;
    protected FrameLayout frameLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        gestureOverlayView = new GestureOverlayView(this); 
        surfaceView        = new GameView(this);            
        frameLayout        = new FrameLayout(this);

        //gestureOverlayView.addView(surfaceView);    
        gestureOverlayView.setOrientation(gestureOverlayView.ORIENTATION_VERTICAL);
        gestureOverlayView.setEventsInterceptionEnabled(true);
        gestureOverlayView.setGestureStrokeType(gestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);

        mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
        gestureOverlayView.addOnGesturePerformedListener(this);

        frameLayout.addView(surfaceView, 0);
        frameLayout.addView(gestureOverlayView,1);

        setContentView(frameLayout);
    }

    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) 
    {
        // TODO Auto-generated method stub
        ArrayList<Prediction> predictions = mLibrary.recognize(gesture);

        // one prediction needed
        if (predictions.size() > 0)
        {
            Prediction prediction = predictions.get(0);

            // checking prediction
            if (prediction.score > 1.0) 
            {
                // and action
                Toast.makeText(GestureActivity.this, prediction.name,
                        Toast.LENGTH_SHORT).show();
            }
        }
    }    
}
2 голосов
/ 31 июля 2010

Вы создаете наложение жестов, но никогда не добавляете его в иерархию представления Он не будет работать, если он не существует:)

1 голос
/ 10 мая 2011

Вы можете просто добавить свой вид к gestureOverlayView:

gestureOverlayView.addView(new yourview (this) , 600, 800);

, тогда

this.setContentView(gestureOverlayView);

gestureOverlayView уже является структурой кадра

0 голосов
/ 06 декабря 2012

Вот рабочий ответ на этот вопрос,

см. Также пример исходного кода.

http://scanplaygames.com/?p=168

...