web-dev-qa-db-fra.com

Déplacement d'image avec événement tactile

Je veux juste une chose simple. J'ai un imageview et je peux le déplacer avec le toucher 

Ceci est mon code, je suis désolé si cela ne va pas parce que je viens de l'essayer moi-même

img.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        // TODO Auto-generated method stub
        if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
            status = StartDrag;
        } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
            status = StopDrag;
        }
        return false;
    }
});

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub

    if (status == StartDrag) {
        params.leftMargin = (int) event.getX();
        params.topMargin = (int) event.getY();
        img.setLayoutParams(params);
    }
    return super.onTouchEvent(event);
}

Pouvez-vous me montrer le bon chemin s'il vous plaît?

8
Alvin Christian

Les événements onTouch pour faire glisser des vues fonctionnent parfaitement pour les vues enfant de RelativeLayout et FrameLayout.

Voici un exemple:

@Override
public boolean onTouch(View v, MotionEvent event){
        switch(event.getAction())
        {
            case MotionEvent.ACTION_DOWN :
            {
                x = event.getX();
                                    y = event.getY();
                dx = x-myView.getX();
                dy = y-myView.getY();
            }
            break;
            case MotionEvent.ACTION_MOVE :
            {
                myView.setX(event.getX()-dx);
                myView.setY(event.getY()-dy);
            }
            break;
            case MotionEvent.ACTION_UP :
            {
                //your stuff
            }
        return true;
}

Maintenant, ce que font dx et dy, c’est, sur ACTION_DOWN, qu’il enregistre l’emplacement où vous avez touché la vue et obtient la différence entre la gauche (x) et le haut (y) de la vue, afin de conserver ces marges pendant ACTION_MOVE.

L'événement de retour de contact doit être true si vous y assistez.

Mise à jour: pour API 8

Dans le cas de l'API 8, les méthodes getX() et getY() ne donnent pas des résultats corrects. Vous pouvez donc utiliser les méthodes getRawX() et getRawY().

Exemple :

RelativeLayout.LayoutParams parms;
LinearLayout.LayoutParams par;
float dx=0,dy=0,x=0,y=0;

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(event.getAction())
    {
        case MotionEvent.ACTION_DOWN :
        {
            parms = (LayoutParams) myView.getLayoutParams();
            par = (LinearLayout.LayoutParams) getWindow().findViewById(Window.ID_Android_CONTENT).getLayoutParams();
            dx = event.getRawX() - parms.leftMargin;
            dy = event.getRawY() - parms.topMargin;
        }
        break;
        case MotionEvent.ACTION_MOVE :
        {
            x = event.getRawX();
            y = event.getRawY();
            parms.leftMargin = (int) (x-dx);
            parms.topMargin = (int) (y - dy);
            myView.setLayoutParams(parms);
        }
        break;
        case MotionEvent.ACTION_UP :
        {

        }
        break;
    }
    return true;
}
20
Apurv Kiri

J'ai fait comme ça:

private float xCoOrdinate, yCoOrdinate;

onCreate () :

ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                xCoOrdinate = view.getX() - event.getRawX();
                yCoOrdinate = view.getY() - event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
                break;
            default:
                return false;
            }
       return true;
    }
});

Terminé

18
Hiren Patel

 enter image description here

J'ai eu le même problème et j'ai réussi à le résoudre. C'est-à-dire, faites glisser l'image à l'écran, outre le zoom avant et arrière et la rotation de l'image sur framelayout dans Android par programmation. Essayez juste ce code source à partir de ce blog

Android faire pivoter le zoom faire glisser l'image dans l'image sur exemple tactile ...

1
Daniel Nyamasyo

Le code suivant permet de glisser et déplacer une vue.

import Android.view.*;
import Android.view.View.*;

public class DragMove<T extends View> implements OnTouchListener
{
    private final  T view;
    private int leftOffset;
    private int topOffset;

    public DragMove(T dragable)
    {
        this.view = dragable;
        this.view.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View p1, MotionEvent event)
    {
        /*
        public static int pxFromDp(double dp, View v)
        {
            Activity context = (Activity)v.getContext();
            return pxFromDp(dp, context);
        }

        public static int pxFromDp(double dp, Activity context)
        {
            float logicalDensity = getDensity(context);
            int px = (int) Math.round(dp * logicalDensity);
            return px;
        }
        */

        int x = GuiUtils.pxFromDp(event.getRawX(), view);
        int y = GuiUtils.pxFromDp(event.getRawY(), view);

        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN :
                {
                    // calculates offset to current coordinate,
                    // keeps position relative (from jumping) during move
                    ViewGroup.LayoutParams parms = view.getLayoutParams();
                    // e.g. = x - params.leftMargin
                    leftOffset = x - Layout.readLeftMargin(parms);
                    topOffset = y - Layout.readTopMargin(parms);
                }
                return true;
            case MotionEvent.ACTION_MOVE :
                {
                    // adjust by touch position retaining touch
                    // offset at start
                    ViewGroup.LayoutParams parms = view.getLayoutParams();
                    // e.g params.leftMargin = x - leftOffset
                    Layout.writeLeftMargin(parms, x - leftOffset);
                    Layout.writeTopMargin(parms, y - topOffset);
                    view.setLayoutParams(parms);
                }
                return true;
        }
        return false;
    }
}
0
Ecreators
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1);
            RelativeLayout.LayoutParams layoutParams;
            layoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            final ImageView view = new ImageView(getApplicationContext());
            view.setPadding(10, 10, 10, 10);
            view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]);
            view.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    windowwidth = getWindowManager().getDefaultDisplay()
                            .getWidth();
                    windowheight = getWindowManager().getDefaultDisplay()
                            .getHeight();

                    Android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
                            .getLayoutParams();
                    switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        Toast.makeText(ImageEditingClass.this,
                                "hii rma jee", Toast.LENGTH_SHORT).show();
                        break;
                    case MotionEvent.ACTION_MOVE:

                        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view
                                .getLayoutParams();
                        int x_cord = (int) event.getRawX();
                        int y_cord = (int) event.getRawY();
                        if (x_cord > windowwidth) {
                            x_cord = windowwidth;
                        }
                        if (y_cord > windowheight) {
                            y_cord = windowheight;
                        }

                        layoutParams.leftMargin = x_cord - 15;

                        layoutParams.topMargin = y_cord -100;

                        layoutParams.rightMargin = x_cord - 50;
                        layoutParams.bottomMargin = x_cord - 50;
                        view.setLayoutParams(layoutParams);
                        break;
                    default:
                        break;
                    }
                    return true;
                }
            });
            // setText(++ViewGenerate + " hii this new");

            StickerRelativeLayout.addView(view, layoutParams);
            // }
            Toast.makeText(ImageEditingClass.this, "you click" + arg2,
                    Toast.LENGTH_SHORT).show();

        }
0
GAURAV KUMAR GUPTA

Si vous souhaitez déplacer votre image dans n’importe quelle direction, vous devez imprimer la direction . Vous devez alors suivre l’étape suivante . x = 0, y = 0, z = 0, w = 0, dz = 0, dw = 0; {ces quatre vous coordonnez}

public void StickerPopulate(){
    LinerLayoutInfate.removeAllViews();

    shstickerBaseAdaptor = new ShstickerBaseAdaptor(getApplicationContext());
    View shstickerView = getLayoutInflater().inflate(R.layout.shareimage,
            null);
    Gallery shsticker_gallery = (Gallery) shstickerView
            .findViewById(R.id.shsticker_gallery);
    shsticker_gallery.setAdapter(new ShstickerBaseAdaptor(
            ImageEditingClass.this));

    shsticker_gallery.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1);
            RelativeLayout.LayoutParams layoutParams;
            layoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

            final ImageView crossBtn = new ImageView(
                    getApplicationContext());
            crossBtn.setBackgroundResource(R.drawable.cross);

            crossBtn.setMaxWidth(300);
            crossBtn.setMaxHeight(200);
            crossBtn.setPadding(10, 10, 10, 10);
            final ImageView view = new ImageView(getApplicationContext());

            view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]);

            view.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    windowwidth = getWindowManager().getDefaultDisplay()
                            .getWidth();

                    windowheight = getWindowManager().getDefaultDisplay()
                            .getHeight();

                    Android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
                            .getLayoutParams();
                    switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        dx = event.getRawX() - layoutParams.leftMargin;
                        dy = event.getRawY() - layoutParams.topMargin;
                        dz = event.getRawX() - layoutParams.bottomMargin;
                        dw = event.getRawX() - layoutParams.rightMargin;

                        break;
                    case MotionEvent.ACTION_MOVE:

                        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view
                                .getLayoutParams();

                        x = event.getRawX();
                        y = event.getRawY();
                        layoutParams.leftMargin = (int) (x - dx);

                        layoutParams.topMargin = (int) (y - dy);
                        layoutParams.bottomMargin = (int) (z - dz);
                        layoutParams.rightMargin = (int) (w - dw);

                        view.setLayoutParams(layoutParams);

                        break;

                    default:
                        break;
                    }
                    return true;
                }
            });
            StickerRelativeLayout.addView(crossBtn, layoutParams);

            StickerRelativeLayout.addView(view, layoutParams);
            // }
            Toast.makeText(ImageEditingClass.this, "you click" + arg2,
                    Toast.LENGTH_SHORT).show();

        }

    });
    LinerLayoutInfate.addView(shstickerView);
}
0
GAURAV KUMAR GUPTA