2010-03-02 13 views
19

저는 프로그래머가 아니지만, 안드로이드 개발을 배우려고하고 있습니다.안드로이드 드래그/뷰 애니메이션

최근에 나는 길에서 포크를 쳤고, 내가 식별 할 수있는 방향이 내 모든 필요를 충족 시킬지 알지 못합니다. 사용자 (전문가)가 도움을 줄 수있는 곳입니다.)

엔드 포인트 : 사용자가 볼을 터치하고 화면의 원하는 위치로 드래그하도록 할 수 있습니다. 또한이 볼이 그려지는 시점과 떨어 뜨린 시점에이 볼을 애니메이션으로 만들고 싶습니다.

커스텀 클래스를 사용하여 드래그 부분을 완성 할 수 있습니다. (이 튜토리얼에있는 것과 같은 클래스는 아무것도 확장하지 않습니다. basic drag & drop), 트위닝 애니메이션을 적용하는 방법을 모르겠습니다.

ImageView에 이미지가있는 애니메이션 버전을 개발했지만 AbsoluteLayout을 사용하지 않고 동일한 드래그 & 드롭 기능을 적용 할 수는 없습니다. no-no.

그래서 MotionViews를 사용하여 ??? 레이아웃 주위로 ImageView를 이동하거나 뷰에 기반하지 않는 사용자 정의 클래스 (예 : XML로 정의 된 트윈 사용)를 애니메이트하려면 어떻게해야합니까? 에스?

불확실한 점이 있으면 질문하십시오. 나는 대부분의 용어뿐만 아니라 모든 용어를 모릅니다.

이 질문에 대한 답변은 anddev.org 포럼에 copy입니다. 그래서 나는이 게시물을저기서 얻은 응답으로 업데이트 해 두겠습니다.

+0

[안드로이드 드래그 가능한보기] (http://www.singhajit.com/android-draggable-view/) –

답변

23

왜 뷰를 확장 할 수 없습니까? 그런 다음 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); 
     } 
    } 
} 
+0

첫째, 당신의 응답을 주셔서 감사합니다 . 그게 해결책이라고 확신합니다. 나는 방금 X, Y 포지셔닝을 제공하는 AbsoluteLayout 컨테이너를 도입하지 않고 드래그 명령으로 뷰 (ImageView가 확장 할 논리적 인 장소 인 것처럼 보임)를 이동하는 방법을 모른다. 지금까지 알아낼 수 있었던 가장 좋은 점은 (X, Y)에 맞춤 컨테이너보기의 캔버스에 클래스를 그려 놓은 것입니다. 나는 그런 식으로 (X, Y)를 받아들이는 레이아웃 컨테이너 (AbsoluteLayout 외)를 알지 못한다. 내 응용 프로그램에서는이 4 개의 뷰가 모두 화면에서 드래그 할 수 있어야합니다. 나는 또 다른 기회를 줄거야. brb;) – Peter

+0

"Generic"클래스를 변환하여 View를 확장했습니다. 레이아웃에서 (X, Y)에 그들을 추가하고 (X1, Y1)에 의해 그들을 이동하는 트릭은 onLayout()을 대체하고 invalidate()를 호출하는 것과 관련이 있습니까? – Peter

+0

아니요, onDraw() 메서드를 재정의합니다. 내 답변에 예제를 게시 할 것입니다. – CaseyB

관련 문제