2011-12-15 4 views
2

Я пытаюсь разработать приложение для Android, которое в основном предназначено для рисования фигур. Я хочу, чтобы пользователь сделал жест на экране, и форма, которая более точно соответствует жесту, должна быть нарисована на экране. В моем приложении я могу обнаружить жест, который выполняется на экране, например, круг, строка, прямоугольник и т. Д., Но есть некоторые проблемы с моим кодом. Он действительно обнаруживает жест и рисует соответствующую форму, но это происходит только один раз.Android Gesture Detection

Например. Если я нарисую строку на экране, тогда линия будет нарисована на моем представлении, но после этого, если я нарисую круг или прямоугольник и т. Д., То жест распознается, но форма там не нарисована.

Вот полный код этого

package com.pck.ShapeMaker; 

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.widget.LinearLayout; 
import android.widget.Toast; 

public class GestureDetection extends Activity { 
    private GestureLibrary gLib;  
    private LinearLayout l1; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gesture); 
     l1 = (LinearLayout) findViewById(R.id.playArea); 

     gLib = GestureLibraries.fromRawResource(this, R.raw.gestures); 
     if (!gLib.load()) 
      finish(); 
     GestureOverlayView gesturesView = (GestureOverlayView) findViewById(R.id.gestures); 
     myGestureHandler handler = new myGestureHandler();  
     gesturesView.addOnGesturePerformedListener(handler); 


    } 

    class myGestureHandler implements OnGesturePerformedListener{ 

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


      if (predictions.size() > 0 && predictions.get(0).score > 1.0) { 
       String action = predictions.get(0).name; 
       if ("l".equals(action)) { 
        Line line = new Line(getApplicationContext(),20,230,200,230); 
        l1.addView(line); 
       } else if ("r".equals(action)) { 
        Rectangle rect = new Rectangle(getApplicationContext()); 
        l1.addView(rect); 
        Toast.makeText(getApplicationContext(), "rect", Toast.LENGTH_SHORT).show(); 
       } else if ("t".equals(action)) { 
        Triangle tri = new Triangle(getApplicationContext(), 300,300,250, 350, 350, 350); 
        l1.addView(tri); 
        Toast.makeText(getApplicationContext(), "trianlge", Toast.LENGTH_SHORT).show(); 
       }else if ("c".equals(action)) { 
        Circle c1 = new Circle(getApplicationContext(),50,50,30); 
        l1.addView(c1); 
        Toast.makeText(getApplicationContext(), "circle", Toast.LENGTH_SHORT).show(); 
       }else if ("d".equals(action)) { 
        Toast.makeText(getApplicationContext(), "diamond", Toast.LENGTH_SHORT).show(); 
       } 
      } 




      } 

    } 
} 
+0

Вы решили свою проблему? У меня то же самое. – LoveMeow

ответ

0

Похоже, что ваш код будет производить все большее количество видов в пределах LinearLayout. Это то, что вы намеревались? Если нет, вы можете попробовать удалить устаревшие представления из макета перед добавлением нового. Проблема может заключаться в том, что нет места в макете для последующих представлений после добавления первого.

Кроме того, динамическое добавление таких видов выглядит как нечетный способ рисования графики. Почему бы не определить одно настраиваемое представление для всех типов чертежей и включить это статически в XML? Ваш метод onGesturePerformed() затем вызовет некоторый метод вашего вида, чтобы указать тип выполняемого чертежа, затем вызовите invalidate(), чтобы вызвать перерисовку. Метод onDraw() вашего представления затем будет рисовать любую графику, только что указанную.