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
- ¿Cómo puedo obtener Android para responder a los drags táctiles?
- ¿Cómo cancelar un diálogo temático como Actividad cuando se toca fuera de la ventana?
- JQuery Arrastrar y soltar en dispositivos táctiles (iPad, Android)
- Catch onTouch evento por el padre, manejarlo y pasar a los niños
- Android: ¿Cómo permitir sólo un toque?
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
- ¿Por qué no funciona esta simulación de MotionEvent?
- Android ListView áreas parciales presionables
- Android OpenGL ES: Coordinación de MotionEvent normalizada
- El evento "touchmove" en el sistema android: Transformer Prime
- Android OpenGL ES: ¿Cómo se selecciona un objeto 2D?
- Singletap touch detect en método Ontouch de la vista
- Android Live Wallpaper Tocar la jerarquía de eventos
- Vista ScrollView con niños, cómo interceptar desplazamiento condicional
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); }
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; } }
- ¿Cómo puedo crear una intención que abre la actividad del registro de llamadas?
- Obtener el valor de cadena de List <String> a través de bucle para mostrar