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
。但是什么是数据呢?请你更新答案,解释如何充分利用它好吗?