Android Drag / Animación de vistas

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

Últimamente he golpeado un bifurcación en el camino, y no sé que ninguna de las direcciones 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 arrástrela a cualquier lugar de la pantalla. También me gustaría animar esta bola cuando se dibuja, y cuando se cae.

Puedo lograr la parte de arrastrar usando una clase personalizada (que no se extiende nada … sólo una clase como se encuentra en este tutorial: arrastrar y soltar básico , sin embargo, no sé cómo aplicar la animación de interpolación a ella Ya que no es una vista.

También he desarrollado una versión animada de un ImageView con mi imagen en él, sin embargo, no puedo manejar aplicar la misma funcionalidad de arrastrar y soltar sin utilizar AbsoluteLayout, que sé es un no-no.

Entonces … ¿cómo puedo mover un ImageView alrededor de un ??? Layout usando MotionEvents, o cómo puedo animar (usando preadolescentes definidos en XML) una clase personalizada no basada en la vista?

Haga preguntas si esto no está claro. No sé toda la terminología, así como la mayoría de ustedes.

También hay una copia de esta pregunta en los foros de anddev.org, así que mantendré este mensaje actualizado con las respuestas que obtengo allí.

¿Por qué no puede ampliar View? A continuación, tiene control completo sobre cómo dibuja porque puede anular el método OnDraw (). Basta con que la clase ColorBall extienda View. Cambie su posición cuando se mueva y, a continuación, invalidar sólo una vista y hacer que se dibuje en lugar de tener la clase DrawView dibujar.

Editar – Aquí hay una clase de ejemplo

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); } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.