Android Drag / Анимация просмотров - PullRequest
19 голосов
/ 02 марта 2010

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

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

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

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

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

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

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

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

1 Ответ

23 голосов
/ 02 марта 2010

Почему вы не можете расширить вид? Затем у вас есть полный контроль над тем, как он рисует, потому что вы можете переопределить метод 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...