2010-10-14 12 views
15

का उपयोग करके मैं एक बिंदु से दूसरे में एक छवि को कैसे स्थानांतरित कर सकता हूं, मैं एक गेम विकसित कर रहा हूं, और इस खेल में मुझे किसी भी दिशा में एक बिंदु से दूसरे बिंदु पर कैनवास पर एक छवि को स्थानांतरित करना है, न केवल लंबवत या क्षैतिज।एंड्रॉइड कैनवास

मैं इस छवि को इस तरीके से कैसे स्थानांतरित कर सकता हूं?

उत्तर

0

इस लाइब्रेरी में एक नज़र डालें। यह आपको आगे बढ़ने में मदद कर सकता है, और मुझे लगता है कि छवियों जैसे चित्र खींचना आदि - PhysicsLayout। यहां आप दो दिशाओं के साथ आगे बढ़ सकते हैं - एक्स, वाई। यदि आप ज़ेड सहित स्थानांतरित करना चाहते हैं, तो इसे लागू करने का एकमात्र तरीका है, आपको सरल स्केलिंग का उपयोग करना चाहिए।

यदि आप कुछ और चाहते हैं, तो बहुत सारे शक्तिशाली और बहुत अच्छे फ्रेमवर्क, पर्यावरण हैं।

enter image description here

+0

लक्ष्य यहाँ यह एक सीधी रेखा में स्थानांतरित करने के लिए प्राप्त करने के लिए है वर्तमान स्थिति से एक लक्ष्य स्थिति तक। इसे चौकोर पार करने की तरह देखो। यह एक गेम व्यवहार है और बिना किसी प्लगइन या एड-ऑन – Zoe

+0

के बिना संभव है कि मैं यह कहने की कोशिश कर रहा हूं कि यह उत्तर आंदोलन से संबंधित भौतिकी का ख्याल रखता है, लेकिन कैनवास पर स्वचालित नेविगेशन के अर्थ में ऐसा नहीं करना है। – Zoe

+0

मैं अभी भी समझने की कोशिश कर रहा हूं) उदाहरण के लिए, View.java - setTranslationX (फ्लोट एक्स) से विधि का उपयोग करके, समन्वय लेता है और केवल कैनवास का उपयोग करके फिर से निकाला जाता है। आप स्थिति के आधार पर ड्राइंग कैनवास को कार्यान्वित करना चाहते हैं? – GensaGames

0

एक गणित व्याख्यान मिलने के बाद, यह पता चला है कि इस को हल करने के लिए आसान है। सबसे पहले, हमें उस कोण को प्राप्त करने की आवश्यकता है जिस पर लक्ष्य चल रहा है।

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

स्टार्टएक्स/वाई वर्तमान एक्स/वाई हो सकता है।

अब जब हम कोण गणना की है, हम वर्तमान निर्देशांक में इसे लागू कर सकते हैं:

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

कितना एक्स और वाई की वृद्धि हुई किया जाएगा की गणना को संभालने के लिए। कस्टम वैरिएबल के रूप में गति का उपयोग करना यदि आपको कस्टम स्पीड सेट भी होना चाहिए। यदि आपको अधिक गति की आवश्यकता नहीं है, तो चर को हटा दें।

और वस्तु को स्थानांतरित करने, वस्तु पर लागू होते हैं एक्स/Y:

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

उदाहरण:

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

मैं नहीं समझ सकता है क्या आप वास्तव में चाहते हैं, लेकिन यहाँ कुछ मैं है कोशिश की

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

} 

आप या तो एक से दूसरे स्थान से यह खींच सकते हैं या आप इसे स्थानांतरित करने के लिए ... इस तरह अनुवाद का उपयोग कर सकते हैं,

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

यह वास्तविक दृश्य नहीं है। यह सतहदृश्य और बिटमैप का उपयोग कर रहा है। ऐसा करने के लिए – Zoe

संबंधित मुद्दे