Home » Android » android – Moving imageview with touch event

android – Moving imageview with touch event

Posted by: admin June 15, 2020 Leave a comment

Questions:

I just want a simple thing. I have a imageview and I can move it with touch

This is my code, I’m sorry if this wrong because I just tried it myself

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);
}

Can you show me the right way please?

How to&Answers:

I have done this way:

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;
    }
});

Done

Answer:

onTouch events for dragging views works perfect for child views of RelativeLayout and FrameLayout.

Here is an example:

@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;
}

Now what dx and dy does is, on ACTION_DOWN it records where you have touched on the view, and gets difference from left (x) and top (y) of the view, to maintain those margins during ACTION_MOVE.

Return of touch event has to be true if you are attending it.

Update : For API 8

In case of API 8, The getX() and getY() methods are not giving correct results, so what you can use is getRawX() and getRawY() methods.

Example :

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;
}

Answer:

enter image description here

I had the same issue and managed to solve the problem. That is, drag the image on screen, besides zoom in and out and rotate the image on framelayout in android programmatically. Just try this source code from this blog post

Android rotate zoom drag image in imageview on touch example

Answer:

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();

        }

Answer:

If you want to move your image in any direction you need to pint out the direction
you should follow the following step
step -1
float dx = 0, dy = 0, x = 0, y = 0, z = 0, w = 0, dz = 0, dw = 0;
{ these you four coordinate }

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);
}

Answer:

The following code allows to drag and move a view.

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;
    }
}