用触摸事件移动imageview

我只想要一个简单的东西,我有一个imageview,我可以移动它触摸

这是我的代码,如果这个错误,我很抱歉,因为我只是自己尝试

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

}

你能告诉我正确的方法吗? 感谢:D

Solutions Collecting From Web of "用触摸事件移动imageview"

用于拖动视图的onTouch事件适用于RelativeLayoutFrameLayout子视图。

这里是一个例子:

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

现在dxdy做了什么,在ACTION_DOWN它logging了视图上的位置,并从视图的left(x)和top(y)获取差异,以在ACTION_MOVE期间维持这些边距。

触摸事件的返回必须是true如果你正在参加。

更新:适用于API 8

对于API 8, getX()getY()方法没有给出正确的结果,所以可以使用getRawX()getRawY()方法。

例如:

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

我这样做了:

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

完成

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

如果你想在任何方向上移动你的图像,你需要按照下面的步骤提出方向-1 float dx = 0,dy = 0,x = 0,y = 0,z = 0,w = 0 ,dz = 0,dw = 0; {你这四个坐标}

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

在这里输入图像说明

我有同样的问题,并设法解决这个问题。 也就是说,在屏幕上拖动图像,除了放大和缩小,并以android编程方式在android的framelayout上旋转图像。 试试这个博客文章的源代码

Android在图像视图中的触摸示例旋转变焦拖动图像

以下代码允许拖动和移动视图。

 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(); // eg = 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(); // eg params.leftMargin = x - leftOffset Layout.writeLeftMargin(parms, x - leftOffset); Layout.writeTopMargin(parms, y - topOffset); view.setLayoutParams(parms); } return true; } return false; } }