2010-03-02 22 views
19

No soy un programador, pero estoy tratando de aprender el desarrollo de Android, y tener una explosión.Android Arrastra/Animación de Vistas

Últimamente he chocado con un tenedor en el camino, y no sé si alguna de las instrucciones que puedo identificar satisfará todas mis necesidades. Aquí es donde usted (los expertos) puede ayudar;)

Punto final: Quiero que el usuario toque una bola y la arrastre a cualquier ubicación de la pantalla. También me gustaría animar esta pelota cuando se dibuja, y cuando se cae.

Puedo lograr la parte de arrastrar utilizando una clase personalizada (que no amplía nada ... solo una clase como la que se encuentra en este tutorial: basic drag & drop, sin embargo, no sé cómo aplicar la animación interpolada a ya que no es una vista.

También he desarrollado una versión animada de un ImageView con mi imagen, sin embargo, no puedo aplicar la misma función de arrastrar & sin usar AbsoluteLayout, que sé que es a no-no

Entonces ... ¿cómo puedo mover un ImageView alrededor de un diseño? usando MotionEvents, o cómo puedo animar (usando interpolaciones definidas en XML) un clas personalizado no basado en vista s?

Haga preguntas si no está claro. No conozco toda la terminología y la mayoría de ustedes lo saben.

También hay un copy de esta pregunta en los foros de anddev.org, así que mantendré esta publicación actualizada con las respuestas que reciba allí.

+0

[Android se pueden arrastrar Ver] (http://www.singhajit.com/android-draggable-view/) –

Respuesta

23

¿Por qué no se puede extender View? Entonces, usted tiene control total sobre cómo dibuja porque puede anular el método OnDraw(). Simplemente haz que la clase ColorBall extienda View. Cambie su posición cuando se mueva y luego invalide solo esa vista y haga que se dibuje a sí misma en lugar de dibujarla en la clase DrawView.

Editar - He aquí un ejemplo de clase

public class Card extends View 
{ 
    private Bitmap mImage; 
    private final Paint mPaint = new Paint(); 
    private final Point mSize = new Point(); 
    private final Point mStartPosition = new Point(); 

    public Card(Context context) 
    { 
     super(context); 

    } 

    public final Bitmap getImage() { return mCardImage; } 
    public final void setImage(Bitmap image) 
    { 
     mImage = image; 
     setSize(mCardImage.getWidth(), mCardImage.getHeight()); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     Point position = getPosition(); 
     canvas.drawBitmap(mCardImage, position.x, position.y, mPaint); 
    } 

    public final void setPosition(final Point position) 
    { 
     mRegion.set(position.x, position.y, position.x + mSize.x, position.y + mSize.y); 
    } 

    public final Point getPosition() 
    { 
     Rect bounds = mRegion.getBounds(); 
     return new Point(bounds.left, bounds.top); 
    } 

    public final void setSize(int width, int height) 
    { 
     mSize.x = width; 
     mSize.y = height; 

     Rect bounds = mRegion.getBounds(); 
     mRegion.set(bounds.left, bounds.top, bounds.left + width, bounds.top + height); 
    } 

    public final Point getSize() { return mSize; } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     // Is the event inside of this view? 
     if(!mRegion.contains((int)event.getX(), (int)event.getY())) 
     { 
      return super.onTouchEvent(event); 
     } 

     if(event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      mStartPosition.x = (int)event.getX(); 
      mStartPosition.y = (int)event.getY(); 
      bringToFront(); 
      onSelected(); 
      return true; 
     } 
     else if(event.getAction() == MotionEvent.ACTION_MOVE) 
     { 
      int x = 0, y = 0; 

      if(mLock == DirectionLock.FREE || mLock == DirectionLock.HORIZONTAL_ONLY) 
      { 
       x = (int)event.getX() - mStartPosition.x; 
      } 

      if(mLock == DirectionLock.FREE || mLock == DirectionLock.VERTICAL_ONLY) 
      { 
       y = (int)event.getY() - mStartPosition.y; 
      } 

      mRegion.translate(x, y); 
      mStartPosition.x = (int)event.getX(); 
      mStartPosition.y = (int)event.getY(); 

      invalidate(); 

      return true; 
     } 
     else 
     { 
      return super.onTouchEvent(event); 
     } 
    } 
} 
+0

En primer lugar, gracias por su respuesta . Estoy seguro de que esa es la solución. Simplemente no sé cómo mover una vista (ImageView parece ser el lugar lógico para extender) con un comando de arrastre sin introducir un contenedor AbsoluteLayout que me da el posicionamiento X, Y. Lo mejor que he podido descifrar hasta ahora es dibujar la clase en el lienzo de una vista de contenedor personalizado en (X, Y). No conozco ningún contenedor de diseño (que no sea AbsoluteLayout) que acepte (X, Y) de esa manera. En mi aplicación, necesito 4 de estas vistas que pueden arrastrarse por la pantalla. Voy a darle otra oportunidad. brb;) – Peter

+0

He convertido mi clase "genérica" ​​para que ahora amplíe View. ¿El truco para agregarlos en (X, Y) y moverlos por (X1, Y1) dentro de un diseño tiene que ver con reemplazar OverLayout() y luego llamar a invalidate()? – Peter

+0

No, reemplazando el método onDraw(). Voy a publicar un ejemplo en mi respuesta. – CaseyB

Cuestiones relacionadas