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.