Android Drag / Views of Animation

我不是程序员,但我正在努力学习android开发,并且有一个爆炸。

最近我在路上遇到了叉子,我不知道我能识别的任何方向都能满足我的所有需求。 这是您(专家)可以提供帮助的地方;)

端点:我想让用户触摸一个球,并将其拖动到屏幕上的任何位置。 我还希望在它被绘制时以及当它被丢弃时为该球制作animation。

我可以使用自定义类完成拖动部分(不扩展任何东西……只是在本教程中find的类: 基本的拖放 ,但是,我不知道如何将补间animation应用到它因为它不是一个观点。

我还开发了一个带有我图像的ImageView的animation版本,但是,如果不使用AbsoluteLayout我就无法应用相同的拖放function,我知道这是禁止使用的。

那么……我如何围绕一个ImageView移动? 使用MotionEvents进行布局,或者如何使用基于非视图的自定义类animation(使用XML中定义的补间)?

如果不清楚,请提出问题。 我不知道你们大多数人的所有术语。

在anddev.org论坛上还有一个这个问题的副本 ,所以我会在这篇文章中更新我对那里的任何回复。

为什么不能扩展View? 然后,您可以完全控制它的绘制方式,因为您可以覆盖OnDraw()方法。 只需使ColorBall类扩展View。 移动时更改其位置,然后使该视图无效并让它自己绘制而不是让DrawView类绘制它。

编辑 – 这是一个示例类

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