2010-04-10 4 views
1

J'ai un SurfaceView qui occupe une partie de l'écran, et quelques boutons en bas. Quand un bouton est enfoncé et que l'utilisateur fait glisser, je veux pouvoir faire glisser une image (basée sur le bouton) sur SurfaceView et l'y faire dessiner.Comment gérer un MotionEvent passant d'une vue à une autre?

Je veux être en mesure d'utiliser clickListeners et similaires, et pas seulement un SurfaceView géant avec moi à écrire du code pour détecter où l'utilisateur a appuyé et si elle est un bouton, etc.

je en quelque sorte une solution, mais cela me semble un peu un hack. Quel est le meilleur moyen d'y parvenir en utilisant intelligemment le cadre?

Une partie de mon XML:

<RelativeLayout 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/background"> 

<!-- Place buttons along the bottom --> 
<RelativeLayout android:id="@+id/bottom_bar" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="40dip" 
    android:layout_alignParentBottom="true" 
    android:background="@null"> 

    <ImageButton android:id="@+id/btn_1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:background="@null" 
     android:src="@drawable/btn_1"> 
    </ImageButton> 

    <!-- More buttons here... --> 
</RelativeLayout> 

<!-- Place the SurfaceView in a frame so we can stack on top of it --> 
<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0px" 
    android:layout_weight="1" 
    android:layout_above="@id/bottom_bar"> 

    <com.project.question.MySurfaceView 
     android:id="@+id/my_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</FrameLayout> 

Et le code Java correspondant dans MySurfaceView, qui étend SurfaceView. mTouchX et Y sont utilisés dans le procédé onDraw pour dessiner l'image:

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    mTouchX = (int) event.getX(); 
    mTouchY = (int) event.getY(); 
    return true; 
} 

public void onButtonTouchEvent(MotionEvent event){ 
    event.setLocation(event.getX(), event.getY() + mScreenHeight); 
    onTouchEvent(event); 
} 

Enfin, l'activité:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.my_surface); 

    mView = (MySurfaceView) findViewById(R.id.my_view); 
    mSurfaceHeight = mView.getHeight(); 
    mBtn = (ImageButton) findViewById(R.id.btn_1); 
    mBtn.setOnTouchListener(mTouchListener); 
} 

OnTouchListener mTouchListener = new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     int [] location = new int[2]; 
     v.getLocationOnScreen(location); 
     event.setLocation(event.getX() + location[0], event.getY()); 
     mView.onButtonTouchEvent(event); 
     return true; 
    } 
}; 

Curieusement, il faut ajouter à la coordonnée x de l'activité, puis ajouter à la coordonnée y dans la vue. Sinon, il n'apparaît pas dans la bonne position. Si vous n'ajoutez rien, un objet dessiné avec mTouchX et mTouchY apparaîtra dans le coin supérieur gauche de SurfaceView.

Toute direction serait grandement appréciée. Si je vais complètement à l'envers, ce serait aussi une bonne information.

Répondre

0

Je ne suis pas sûr si je comprends tout à fait ce que vous essayez de faire, mais je vais essayer de vous donner des informations utiles de toute façon:

est votre principal problème avec les coordonnées?

Vous pourriez avoir une vue invisible sur tout (ce qui est une solution laide), ou vous pourriez utiliser des maths. Vous obtenez les coordonnées de la vue, qui, avec des informations sur la taille de l'affichage et la taille totale de la vue, peut vous donner toutes les informations dont vous avez besoin

Comme mentionné précédemment, je ne suis pas tout à fait sûr où vous rencontrez des problèmes, mais dans mon avis votre approche semble bien.

Oh et une autre chose:

Vous devriez essayer d'utiliser le MotionEvent appelé ACTION_MOVE avec

float x = event.getX(); 
float y = event.getY(); 
switch(event.getAction()){ 

case MotionEvent.ACTION_DOWN: 

    //DO SOMETHING 

case MotionEvent.ACTION_MOVE: 

    //DO SOMETHING using x and y. 
} 

au sein de votre OnTouch.

Questions connexes