我不是程序员,但我正在尝试学习 Android 开发,并且玩得很开心。
最近我遇到了一个岔路口,我不知道我能确定的任何方向都能满足我的所有需求。这是您(专家)可以提供帮助的地方;)
端点:我想让用户触摸一个球,并将它拖到屏幕上的任何位置。我还想在绘制和掉落时为这个球制作动画。
我可以使用自定义类完成拖动部分(它不扩展任何东西......只是在本教程中找到的类:basic drag & drop,但是,我不知道如何应用补间动画因为它不是 View 。
我还开发了一个 ImageView 的动画版本,其中包含我的图像,但是,如果不使用 AbsoluteLayout,我将无法应用相同的拖放功能,我知道这是一个禁忌。
那么...我该如何移动 ImageView 周围的 ???使用 MotionEvents 布局,或者我如何动画(使用 XML 中定义的补间)非基于 View 的自定义类?
如果不清楚请提问。我不像你们大多数人那样了解所有术语。
还有一个copy在 anddev.org 论坛上有这个问题,所以我会及时更新这篇文章,以更新我在那里收到的任何回复。
最佳答案
为什么不能扩展View?然后,您可以完全控制它的绘制方式,因为您可以覆盖 OnDraw() 方法。只需让 ColorBall 类扩展 View。当您移动时更改它的位置,然后仅使那个 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);
}
}
}
关于 View 的 Android 拖动/动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934175/