2011-10-19 20 views
15

Aquí abajo está mi archivo xml. Su nombre es main.xmlAndroid múltiples ImageView moviéndose al tacto


<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 
    <ImageView android:id="@+id/imageView" android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:src="@drawable/icon" 
     android:scaleType="matrix"> 
    </ImageView> 
    <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:src="@drawable/bg_sound" 
     android:scaleType="matrix"></ImageView> 
</FrameLayout> 

Y mi archivo de Java está por debajo


import android.app.Activity; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.util.FloatMath; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 

public class Test1Activity extends Activity implements OnTouchListener { 
    private static final String TAG = "Touch"; 
    // These matrices will be used to move and zoom image 
    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    // We can be in one of these 3 states 

    // Remember some things for zooming 
    PointF start = new PointF(); 
    PointF mid = new PointF(); 
    float oldDist = 1f; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ImageView view = (ImageView) findViewById(R.id.imageView); 
     view.setOnTouchListener(this); 

     ImageView view1 = (ImageView) findViewById(R.id.imageView1); 
     view1.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     ImageView view = (ImageView) v; 
     // Dump touch event to log 

     // Handle touch events here... 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      break; 
     case MotionEvent.ACTION_UP: 
      savedMatrix.set(matrix); 
      //matrix.postRotate(90); 

      break; 
     case MotionEvent.ACTION_MOVE: 
       // ... 
       matrix.set(savedMatrix); 
       matrix.postTranslate(event.getX() - start.x, event.getY() 
         - start.y); 
      break; 
     } 

     view.setImageMatrix(matrix); 
     view.invalidate(); 
     return true; // indicate event was handled 
    } 

} 

soy capaz de lograr movimiento en contacto, pero ya que hay 2 imageviews agregadas solo las últimas imageviews agregadas son movibles.

Supongo que el problema es layout_width="fill_parent", que provoca que solo se reconozca la vista frontal de la imagen al tacto. y si estoy usando layout_width="wrap_content", la imagen vista solo se mueve en el área del tamaño de la imagen y es invisible.

Cómo resolver este problema?

Gracias,

+1

Buena pregunta .. –

Respuesta

1

sólo un proceso vista onTouch acción. por lo que hay algunas opciones:

1) de retorno "false" - que puede ayudarle a

2) utilizan "wrap_content" y no utilizan ImageMatrix. Mueva la esquina superior izquierda de las imágenes

2

Casi soluciono su problema. Debido al tiempo que no estoy seguir adelante hice algunos cambios en su archivo main.xml A sigue

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:orientation="vertical"> 

     <ImageView android:id="@+id/imageView" android:layout_width="fill_parent" 
      android:layout_height="100dp" android:src="@drawable/ic_launcher" 
      android:scaleType="matrix" 
      android:layout_alignParentTop="true" 
      > 
     </ImageView> 
     <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:src="@drawable/toyota_altis" 
      android:scaleType="matrix" 
      android:layout_below="@+id/imageView"></ImageView> 

</RelativeLayout> 

Tenga en cuenta utilizar sus propias imágenes y hacer los cambios apropiados dos imágenes que se utilizan son

  1. ic_launcher
  2. toyota_altis
0

escriba debajo de código en su fichero de actividad.

int windowwidth = getWindowManager().getDefaultDisplay().getWidth(); 
int windowheight = getWindowManager().getDefaultDisplay().getHeight(); 


tv1 = (ImageView)findViewById(R.id.image); 
tv1.setOnTouchListener(new View.OnTouchListener() {   

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     layoutParams1 = (RelativeLayout.LayoutParams) tv1.getLayoutParams(); 
     switch(event.getActionMasked()) 
     { 
      case MotionEvent.ACTION_DOWN: 
       break; 
      case MotionEvent.ACTION_MOVE: 
       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; 
       } 
       layoutParams1.leftMargin = x_cord - 25; 
       layoutParams1.topMargin = y_cord - 75; 
       tv1.setLayoutParams(layoutParams1); 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 
}); 

tv2 = (ImageView)findViewById(R.id.image1); 
tv2.setOnTouchListener(new View.OnTouchListener() {   

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     layoutParams2 = (RelativeLayout.LayoutParams) tv2.getLayoutParams(); 
     switch(event.getActionMasked()) 
     { 
      case MotionEvent.ACTION_DOWN: 
       break; 
      case MotionEvent.ACTION_MOVE: 
       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; 
       } 
       layoutParams2.leftMargin = x_cord - 25; 
       layoutParams2.topMargin = y_cord - 75; 
       tv2.setLayoutParams(layoutParams2); 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 
}); 

main.xml del archivo: -

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView android:layout_width="50sp" android:layout_height="50sp" 
     android:id="@+id/image" android:src="@drawable/image"> 
    </ImageView> 
    <ImageView android:layout_y="30dip" android:layout_x="118dip" 
     android:layout_width="50sp" android:layout_height="50sp" android:id="@+id/image1" 
     android:src="@drawable/image1"> 
    </ImageView> 
</RelativeLayout> 

y ver por debajo de OE enlace de respuesta para más información.

Drag & Drop Two Images

1

u también puede añadir un botón de activación y al hacer clic con el botón de activación u puede llevar el imageview a delante a través de este

imageView1.bringToFront()/imageView2.bringToFront() 
Cuestiones relacionadas