Vista de imagen en movimiento con evento táctil

Solo quiero una cosa simple que tengo una vista de imagen y puedo moverla con el tacto

Este es mi código, lo siento si este mal porque lo intento yo mismo

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

}

¿Puedes mostrarme el camino correcto, por favor? Gracias: D

onTouch eventos onTouch para arrastrar vistas son perfectos para las vistas secundarias de RelativeLayout y FrameLayout .

Aquí hay un ejemplo:

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

Ahora lo que hace dx y dy , en ACTION_DOWN registra donde ha tocado la vista y obtiene diferencia de izquierda (x) y superior (y) de la vista, para mantener esos márgenes durante ACTION_MOVE .

El retorno del evento táctil tiene que ser true si usted está asistiendo a él.

Actualización: para API 8

En el caso de API 8, los getX() y getY() no están dando resultados correctos, así que lo que puede utilizar son los getRawX() y getRawY() .

Ejemplo:

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

He hecho de esta manera:

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

Hecho

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

Si desea mover su imagen en cualquier dirección que usted necesita pint out la dirección que debe seguir el siguiente paso paso -1 flotador dx = 0, dy = 0, x = 0, y = 0, z = 0, w = 0 , Dz = 0, dw = 0; {Estas cuatro coordenadas}

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

Introduzca aquí la descripción de la imagen

Tuve el mismo problema y logré resolver el problema. Es decir, arrastrar la imagen en la pantalla, además de acercar y alejar y girar la imagen en framelayout en android programaticamente. Sólo prueba este código fuente de esta entrada de blog

Android gira la imagen de arrastrar el zoom en la vista de la imagen en el ejemplo táctil

El código siguiente permite arrastrar y mover una vista.

 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; } } 
  • Umbral de ACTION_MOVE de Android
  • ¿Qué significa el valor booleano devuelto por un método de manejo de eventos en Android
  • Android ImageView Escalado y traducción del problema
  • Cómo deshabilitar el toque en el área del fragmento
  • Android: El botón personalizado OnClickListener no se invoca
  • ¿Cómo crear un imagebutton de forma irregular donde la parte transparente de la imagen no se puede hacer clic?
  • Detectar si el navegador tiene teclado / teclas de flecha en la página web
  • Resplandor cuando toque la pantalla en android?
  • Transferir el enfoque táctil a otra vista
  • ¿Cómo puedo cambiar el color de efecto táctil de ActionBar en Android 3.0 y versiones superiores
  • Añadir eventos táctiles a la clase VrPanoramaView de SDK de cartón google para android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.