Faire glisser une vue d'image vers une certaine position


yploo

J'essaye de créer une imageView glissable ("chatHead" dans le code, un peu comme la tête de chat de Facebook)

J'ai suivi les instructions sur le site Web Android, mais chaque fois que je fais glisser l'image vue, elle se termine toujours dans le coin supérieur gauche. (avec les coordonnées x, y étant (0,0) ~ (90,90))

Plus tard , j'ai découvert le problème est que le cas: MotionEvent.ACTION_MOVE est seulement entré quand mon contact est autour de l'emplacement de imageView.

Et quand je traîne un peu plus loin de l'imageView, ACTION_MOVE n'est plus entré. Et à la place, le cas DragEvent.ACTION_DRAG_EXIT est exécuté.

Quelqu'un peut-il me dire comment puis-je étendre la zone pour que ACTION_MOVE soit exécuté ou quel est le problème. Je souhaite localiser l'imageView à l'emplacement de mon choix sur l'écran.
(vous pouvez simplement vous concentrer sur onDragListener , MyDragShadowBuilder est un DragShawdowBuilder extensible personnalisé et onLongClickListener est juste pour déclencher le glisser)

Comment conserver l'imageView même si l'application est fermée?

public class ChatHead extends Service {

private WindowManager windowManager;
private ImageView chatHead;
private WindowManager.LayoutParams params;
private final String CHAT_TAG ="CHAT";
private int cor_x = 0;
private int cor_y = 0;



@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override public void onCreate() {
    super.onCreate();
    ImageView image = new ImageView(this);
    Log.d("", "created");
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    chatHead = new ImageView(this);
    chatHead.setTag(CHAT_TAG);
    chatHead.setImageResource(R.drawable.chat_icon);

     params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 300;
    params.y = 300;



    chatHead.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {



                    ClipData.Item item = new ClipData.Item(v.getTag().toString());


                    String[] mimeTypes =  {ClipDescription.MIMETYPE_TEXT_PLAIN};
                    ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes,item);

                    View.DragShadowBuilder myShadow = new MyDragShadowBuilder(chatHead);

                    // Starts the drag

                    v.startDrag(dragData,  // the data to be dragged
                            myShadow,      // the drag shadow builder
                            null,          // no need to use local data
                            0              // flags (not currently used, set to 0)
                    );

            return false;}

    });



    chatHead.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View v, DragEvent event) {

            //cor_x = ((int) chatHead.getX());
            //cor_y = ((int) chatHead.getY());

            switch (event.getAction()){
                case DragEvent.ACTION_DRAG_ENTERED : { Log.d("", "x:"+ event.getX()+"y:"+event.getY());break;}
                case DragEvent.ACTION_DRAG_STARTED : { Log.d("", "x:"+ event.getX()+"  y:"+event.getY());break;}

                case MotionEvent.ACTION_MOVE:  {
                    cor_x = ((int) event.getX());
                    cor_y = ((int) event.getX());
                    Log.d("", "x:"+ cor_x+"  y:"+cor_y);
                    break;}
                case DragEvent.ACTION_DRAG_EXITED:{
                    Log.d("", "x:"+ cor_x+"  y:"+cor_y);
                    break;
                }


                case DragEvent.ACTION_DRAG_ENDED   :  {
                    if(windowManager!=null && params!=null){
                        params.x = cor_x;
                        params.y = cor_y;
                        Log.d("", "x:"+ cor_x+"  y:"+cor_y);
                        windowManager.removeView(chatHead);
                        windowManager.addView(chatHead, params);
                    }

                    return false;
                }

            }


            return false;
        }
    });

    windowManager.addView(chatHead, params);


}
yshahak

Si je comprends bien ce que vous voulez dire, votre problème est que vous n'obtenez le MotionEvent.ACTION_MOVE que si votre doigt est au-dessus de votre image.

Eh bien, c'est parce que le concept de DragListener est que la vue qui enregistre cet auditeur accepte les événements. Ainsi, la seule vue de votre mise en page qui s'inscrit dans ces événements est chatHead, et il obtient uniquement les événements qui se produisent au-dessus de lui.

Donc, si vous voulez obtenir tous les événements dans la mise en page, vous devez enregistrer une vue qui occupe tout l'espace de l'écran. La solution la plus rapide consiste donc à envelopper la vue avec un conteneur qui occupe tout l'écran et à l'enregistrer à la place dans chatHead dans DragListener. Quelque chose comme:

  windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    RelativeLayout container = new RelativeLayout(this);


    params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    chatHead = new ImageView(this);
    chatHead.setTag(CHAT_TAG);
    chatHead.setImageResource(R.drawable.chat_icon);

    RelativeLayout.LayoutParams chatHeadParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    chatHeadParams.addRule(Gravity.TOP | Gravity.LEFT)  ;
    chatHeadParams.leftMargin = 300;
    chatHeadParams.topMargin = 300;

    container.addView(chatHead, chatHeadParams);
    windowManager.addView(container, params);

Et changer la ligne:

    chatHead.setOnLongClickListener(new View.OnLongClickListener() {

à:

    container.setOnLongClickListener(new View.OnLongClickListener() {

Vous pouvez également ajuster des choses supplémentaires car le DragEvent event.getX () et event.getX () renverra des valeurs différentes selon la vue elle-même et le type DragEvent.Action.

Articles connexes


Comment faire glisser une vue hors d'une autre vue

Livraison Oseni J'ai un fragment avec un menu de navigation dans le coin supérieur gauche. Au début de l'activité, je souhaite faire glisser progressivement une vue (appelons-la black_view ) hors de l'icône du menu. Voici une description approximative de la fa

Comment faire glisser une image vers le bas

Carl Je voudrais faire glisser l'image au centre de la barre de navigation vers le bas lorsque la largeur de la page diminue. Voici à quoi cela ressemble sur un bureau: Alors que sur un smartphone, la barre de navigation devrait ressembler à ceci: Comme vous p

Faire glisser une image fait glisser une autre image

user8444404 Lorsque je fais glisser la partie droite de l'image téléchargée dans mask1, l'image téléchargée dans mask2 se déplace, mais cela ne devrait pas se produire .... Voici le lien vidéo De plus, si je télécharge l'image uniquement dans le masque 1 et qu