Подтвердить что ты не робот

Android Drag/Animation of Views

Я не программист, но я пытаюсь научиться разработке Android и иметь взрыв.

В последнее время я ударил по вилке на дороге, и я не знаю, что любое из направлений, которые я могу определить, удовлетворит все мои потребности. Здесь вы (эксперты) можете помочь;)

Конечная точка: я хочу, чтобы пользователь коснулся шара и перетащил его в любое место на экране. Я также хотел бы оживить этот мяч, когда он нарисован, и когда он упадет.

Я могу выполнить компонент перетаскивания с использованием пользовательского класса (который не распространяется ни на что... в этом учебнике находится такой класс: базовое перетаскивание и падение, однако, я не знаю, как применять анимацию анимации для нее, поскольку это не представление.

Я также разработал анимированную версию ImageView с моим изображением в ней, однако мне не удается применить те же функции перетаскивания без использования AbsoluteLayout, который, как я знаю, не имеет значения.

Итак... как мне перемещать ImageView вокруг??? макет с помощью MotionEvents или как я могу охарактеризовать (используя твины, определенные в XML) нестандартный пользовательский класс?

Пожалуйста, задавайте вопросы, если это не ясно. Я не знаю всей терминологии, как и большинство из вас.

Существует также копия этого вопроса на форумах anddev.org, поэтому я буду держать этот пост обновленным с любыми ответами, которые я получаю там.

4b9b3361

Ответ 1

Почему вы не можете расширить View? Затем у вас есть полный контроль над тем, как он рисует, потому что вы можете переопределить метод OnDraw(). Просто сделайте класс ColorBall расширенным. Измените его положение, когда вы переместитесь, а затем сделайте недействительным только одно представление и попросите его вычеркнуть его, а не привлечь класс 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);
        }
    }
}