2010-10-14 11 views

risposta

0

Dai un'occhiata in questa biblioteca. Dovrebbe aiutarti a muoverti, e penso che trascini oggetti come l'immagine, ecc. - PhysicsLayout. Qui puoi vedere lo spostamento con Due direzioni - X, Y. Se vuoi spostarti includendo Z, c'è solo un modo per implementarlo, dovresti usare un semplice ridimensionamento.

Se vuoi qualcosa di più, ci sono un sacco di quadri potenti e carini, Ambiente.

enter image description here

+0

L'obiettivo qui è quello di farlo muovere in linea retta dalla posizione corrente a una posizione target. Guardalo come attraversare una piazza di fronte. È un comportamento di gioco ed è possibile senza plug-in o componenti aggiuntivi – Zoe

+0

Quello che sto cercando di dire è che questa risposta si prende cura della fisica relativa al movimento, ma non di come farlo nel senso della navigazione automatica su tela. – Zoe

+0

Sto ancora cercando di capire) Ad esempio, usando il metodo di View.java - setTranslationX (float x), prende le coordinate e si ridisegna semplicemente usando Canvas. Vuoi implementare il disegno Canvas in base alla posizione? – GensaGames

0

Dopo aver ottenuto una lezione di matematica, si scopre che questo è facile da risolvere. Per prima cosa, dobbiamo ottenere l'angolo su cui si muoverà il bersaglio.

float deltaX = targetX - startX; 
float deltaY = targetY - startY; 
float angle = Math.atan2(deltaY, deltaX); 

startX/Y può essere corrente X/Y.

Ora che abbiamo calcolato l'angolo, possiamo applicare alle coordinate attuali:

currentX += speed * Math.cos(angle);//Using cos 
currentY += speed * Math.sin(angle);//or sin 

per gestire i calcoli di quante X e Y sarà aumentato di. Utilizzare la velocità come variabile personalizzata se è necessario avere anche un set di velocità personalizzato. Se non hai bisogno di più velocità, rimuovi la variabile.

E per spostare l'oggetto, applicare X/Y per l'oggetto:

c.drawBitmap(bm, x, y, null); 

Esempio:

int speed = 10; 
int x, y; 
int targetX = 100, targetY = 600; 
int startX = 900, startY = 100; 
public void render(Canvas c){ 
    super.draw(c); 
    float deltaX = targetX - startX; 
    float deltaY = targetY - startY; 
    float angle = Math.atan2(deltaY, deltaX); 
    x += speed * Math.cos(angle);//Using cos 
    y += speed * Math.sin(angle);//or sin 
    c.drawBitmap(bm, x, y, null); 
    (...) 
} 
1

non riuscivo a capire quello che realmente vuole, ma qui è qualcosa che ho' ci ho provato

interface coordinateListener 
{ 
    public void currentPosition(float x,float y); 
} 

public class ImageView extends View{ 
    int width; 
    int height; 
    RectF rect = new RectF(); 
    float x=0f,y=0f; 
    float dX,dY; 
    float mStartX,mStartY; 
    float mEndX,mEndY; 
    Paint paint = new Paint(); 
    Bitmap mBitmap; 
    TranslateAnimation anim; 
    View view; 
    coordinateListener mListener; 
    public ImageView(Context context) { 
     super(context); 
     init(); 
    } 

    public ImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

public void init() 
{ 
    view = this; 
} 
@Override 
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec,heightMeasureSpec); 
    width = getMeasuredWidth(); 
    height = getMeasuredHeight(); 
    rect.set(0,0,width,height); 
} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    if(mBitmap!=null) { 
     canvas.drawBitmap(mBitmap,0,0,paint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    int action = event.getAction() & MotionEvent.ACTION_MASK; 

    switch (action) 
    { 
     case MotionEvent.ACTION_DOWN: 
      dX = this.getX() - event.getRawX(); 
      dY = this.getY() - event.getRawY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      y = event.getRawY(); 
      x = event.getRawX(); 
      y += dY; 
      x+=dX; 

      this.setY(y); 
      this.setX(x); 

      mListener = (coordinateListener)getContext(); 
      mListener.currentPosition(x,y); 

      invalidate(); 
      break; 
    } 
    return true; 
} 

public void startCoordinates(float x,float y) 
{ 
    mStartX = x; 
    mStartY = y; 
} 

public void endCoordinates(float x,float y) 
{ 
    mEndX = x; 
    mEndY = y; 
} 

public void startTranslation(long duration) 
{ 
    anim = new TranslateAnimation(mStartX,mEndX,mStartY,mEndY); 
    anim.setDuration(duration); 
    anim.setFillAfter(true); 

    anim.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      view.setX((int)mEndX); 
      view.setY((int)mEndY); 
      animation.setFillAfter(false); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }); 

    this.startAnimation(anim); 
} 

} 

È possibile trascinare da una posizione all'altra oppure è possibile utilizzare Traduci spostarlo ... come questo,

view.startCoordinates(0f,0f); 
view.endCoordinates(500f,0f); 
view.startTranslation(3000); 
+0

Non è una vista reale. Sta usando surfaceview e bitmap.to per farlo – Zoe

Problemi correlati