Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android拖放ImageView-onTouchListener_Android_Drag And Drop_Imageview_Ontouchlistener_Motionevent - Fatal编程技术网

android拖放ImageView-onTouchListener

android拖放ImageView-onTouchListener,android,drag-and-drop,imageview,ontouchlistener,motionevent,Android,Drag And Drop,Imageview,Ontouchlistener,Motionevent,您好我在应用程序中为ImageView设置了onTouchListener,我的目标是创建一个ImageView,用户可以在应用程序中拖动并放置任何他们想要的位置。我已经使用在web上为onTouchListener找到的示例代码编写了一些代码,我认为这些代码可以工作,但我遇到了一些问题,而不是允许我拖动图像,当您将手指拖动到图像上时,图像会调整大小并变大或变小。 有人知道为什么吗?这是我的代码: ImageView t1img; t1img = (ImageView) fi

您好
我在应用程序中为ImageView设置了onTouchListener,我的目标是创建一个ImageView,用户可以在应用程序中拖动并放置任何他们想要的位置。

我已经使用在web上为onTouchListener找到的示例代码编写了一些代码,我认为这些代码可以工作,但我遇到了一些问题,而不是允许我拖动图像,当您将手指拖动到图像上时,图像会调整大小并变大或变小。

有人知道为什么吗?
这是我的代码:

    ImageView t1img;

    t1img = (ImageView) findViewById(R.id.imgT1);

    windowWidth = getWindowManager().getDefaultDisplay().getWidth();
    windowHeight = getWindowManager().getDefaultDisplay().getHeight();

    t1img.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            layoutParams = (LayoutParams) t1img.getLayoutParams();

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:

                break;

                case MotionEvent.ACTION_MOVE:

                    int xCoord = (int) event.getRawX();
                    int yCoord = (int) event.getRawY();

                    if (xCoord > windowWidth) {

                        xCoord = windowWidth;
                    }

                    if (yCoord > windowHeight) {

                        yCoord = windowHeight;
                    }

                    layoutParams.leftMargin = xCoord - 25;
                    layoutParams.topMargin = yCoord - 75;

                    t1img.setLayoutParams(layoutParams);

                break;

                default:

                break;
            }

            return true;
        }
    });

如果你需要支持姜饼,你可以看看我的例子

如果您只需要支持上面的jelly bean,您可以使用android库中的拖放功能,您可以从本文中看到它

有关拖放视图的一些说明 首先,您不需要创建touch侦听器,然后调用startDrag开始拖动。就这么简单

private final class dragTouchListener implements OnTouchListener {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                v.startDrag(data, shadowBuilder, v, 0);
                return true;
            } else {
                return false;
            }
        }

    }
要监视放置的目标,可以使用onDragListener

private class dropListener implements OnDragListener {

    View draggedView;
    CustomTextView dropped;

    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
            draggedView = (View) event.getLocalState();
            dropped = (CustomTextView) draggedView;
            draggedView.setVisibility(View.INVISIBLE);
            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            break;
        case DragEvent.ACTION_DROP:

            CustomTextView dropTarget = (CustomTextView) v;
            dropTarget.setText(dropped.getText().toString());
            break;
        case DragEvent.ACTION_DRAG_ENDED:
            break;
        default:
            break;
        }
        return true;
    }

}
正如您从我的代码中看到的,有很多事件,但最主要的是当视图开始被拖动、删除和结束时

不要忘记将侦听器设置为查看

    tvDrag.setOnTouchListener(new dragTouchListener());
    tvDrop.setOnDragListener(new dropListener())
我希望我的解释足够清楚!
如果您还有其他问题,我将在今晚或明天尝试回答:)

我已经用线程做了一个示例。您可以使用touch Event listener尝试此示例,以获得平滑的拖放位图图像

我创建了三个类 MainActivity.Java 安装我们的BallView类并将setContentView添加到BallView类,如下所示

package com.whatsonline.dragobject;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;

public class MainActivity extends Activity {

    private Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int w=getWindowManager().getDefaultDisplay().getWidth()-25;
        int h=getWindowManager().getDefaultDisplay().getHeight()-25;
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.p1);
        BallView ballView=new BallView(this, bitmap, w, h);
        setContentView(ballView);
    }

}
package com.whatsonline.dragobject;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class MyThread extends Thread {

    private SurfaceHolder msurfaceHolder;
    private BallView mballView;
    private boolean mrun =false;

    public MyThread(SurfaceHolder holder, BallView ballView) {

        msurfaceHolder = holder;
        mballView=ballView;
    }

    public void startrun(boolean run) {

        mrun=run;
    }

    @Override
    public void run() {

        super.run();
        Canvas canvas;
        while (mrun) {
            canvas=null;
            try {
                canvas = msurfaceHolder.lockCanvas(null);
                synchronized (msurfaceHolder) {
                    mballView.onDraw(canvas);
                }
            } finally {
                if (canvas != null) {
                    msurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

}
我们的BallView扩展了surfaceView类并实现了如下所示的曲面保持器。此外,还包含绘制画布的draw方法和touchEvent侦听器,以获取要移动的位图图像的位置并沿绘制的图像位图路径移动

package com.whatsonline.dragobject;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class BallView extends SurfaceView implements SurfaceHolder.Callback {

    private Bitmap bitmap;
    private MyThread thread;
    private int x=25,y=25;
    int width,height;

    public BallView(Context context, Bitmap bmp, int w,int h) {
        super(context);

        width=w;
        height=h;
        bitmap=bmp;
        thread=new MyThread(getHolder(),this);
        getHolder().addCallback(this);
        setFocusable(true);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

       // bitmap = BitmapFactory.decodeResource(getResources(), bmp);
        canvas.drawColor(Color.BLUE);//To make background
        canvas.drawBitmap(bitmap, x-(bitmap.getWidth()/2),y-(bitmap.getHeight()/2), null);


    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        x=(int)event.getX();
        y=(int)event.getY();

        if(x<25)
            x=25;
        if(x> width)
            x=width;
        if(y <25)
            y=25;
        if(y > height)
            y=height;

        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        thread.startrun(true);
        thread.start();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {


        thread.startrun(false);
        thread.stop();

    }
}

您是否需要支持gingerbrad(Jellybean及以上版本应该可以:)您能再解释一下draganddrop android库吗?我从来没有听说过它,也没有见过它的任何东西,因为研究这个谢谢你,非常有用真棒,我现在给它一个尝试!如果我想将原始视图拖动到非透明的sahdow,那么该怎么办?使用
startDrag
,IDE说它已被弃用,我们应该使用
startdragandrop
。但是什么是数据呢?请你更新答案,解释如何充分利用它好吗?