2010-03-02 6 views
19

Я не программист, но я пытаюсь изучить развитие Android и иметь взрыв.Android Drag/Анимация просмотров

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

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

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

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

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

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

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

+0

[Android Draggable View] (http://www.singhajit.com/android-draggable-view/) –

ответ

23

Почему вы не можете продлить действие View? Затем у вас есть полный контроль над тем, как он рисует, потому что вы можете переопределить метод OnDraw(). Просто сделайте класс ColorBall расширенным. Измените его положение, когда вы переместитесь, а затем сделайте недействительным только один вид и попросите его сделать сам, вместо того, чтобы рисовать его DrawView.

Edit - Вот пример класса

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

Во-первых, спасибо за ваш ответ , Я уверен, что это решение. Я просто не знаю, как перемещать представление (ImageView, похоже, является логическим местом для расширения) с помощью команды перетаскивания без введения контейнера AbsoluteLayout, который дает мне позиционирование X, Y. Лучшее, что я смог выяснить до сих пор, - это рисовать класс на холсте пользовательского вида контейнера в (X, Y). Я не знаю никаких контейнеров компоновки (кроме AbsoluteLayout), которые принимают (X, Y) таким образом. В моем приложении мне нужно 4 из этих представлений, которые можно перетаскивать по экрану. Я пойду, дайте ему еще один выстрел. brb;) – Peter

+0

Я преобразовал свой «общий» класс, чтобы он теперь расширил View. Уловка с добавлением их в (X, Y) и перемещение их по (X1, Y1) внутри макета связано с переопределением onLayout() и вызовом invalidate()? – Peter

+0

Нет, переопределяя метод onDraw(). Я отправлю пример в свой ответ. – CaseyB

Смежные вопросы