2010-10-14 8 views

Répondre

0

Jetez un oeil dans cette bibliothèque. Cela devrait vous aider à bouger, et je pense que les objets qui traînent comme l'image, etc - PhysicsLayout. Ici vous pouvez voir le mouvement avec deux directions - X, Y. Si vous voulez vous déplacer, y compris Z, il n'y a qu'une seule façon de l'implémenter, vous devriez utiliser une mise à l'échelle simple.

Si vous voulez quelque chose de plus, il y a beaucoup de Frameworks, Environment.

enter image description here

+0

Le but est ici pour obtenir de se déplacer en ligne droite de la position actuelle à une position cible. Regardez-le comme traverser un carré. C'est un comportement de jeu et c'est possible sans aucun plugin ou add-ons – Zoe

+0

Ce que j'essaie de dire, c'est que cette réponse s'occupe de la physique liée au mouvement, mais pas de la manière automatique de naviguer sur la toile. – Zoe

+0

J'essaie toujours de comprendre) Par exemple, en utilisant la méthode de View.java - setTranslationX (float x), prend des coordonnées et juste redessiner en utilisant Canvas. Vous voulez implémenter le dessin Canvas en fonction de la position? – GensaGames

0

Après avoir obtenu une conférence de mathématiques, il se trouve que cela est facile à résoudre. Premièrement, nous devons obtenir l'angle sur lequel la cible va se déplacer.

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

startX/Y peut être X/Y actuel.

Maintenant que nous avons calculé l'angle, nous pouvons l'appliquer aux coordonnées actuelles:

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

pour gérer les calculs de la façon dont seront augmentés de beaucoup X et Y. Utilisation de la vitesse en tant que variable personnalisée si vous avez également besoin d'un jeu de paramètres personnalisé. Si vous n'avez pas besoin de plus de vitesse, supprimez la variable.

Et pour déplacer l'objet, appliquer X/Y à l'objet:

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

Exemple:

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

Je ne pouvais pas comprendre ce que vous voulez vraiment, mais voici quelque chose que je J'ai essayé.

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

} 

Vous pouvez le faire glisser d'une position à une autre ou vous pouvez utiliser Traduire en déplacer ... comme ça,

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

Ce n'est pas une vue réelle. Il utilise surfaceview et bitmap.to le faire – Zoe

Questions connexes