2010-03-02 16 views
19

मैं प्रोग्रामर नहीं हूं, लेकिन मैं एंड्रॉइड विकास सीखने और विस्फोट करने की कोशिश कर रहा हूं।एंड्रॉइड ड्रैग/दृश्यों का एनीमेशन

हाल ही में मैंने सड़क पर एक कांटा मारा है, और मुझे नहीं पता कि मैं जिन दिशाओं की पहचान कर सकता हूं उनमें से कोई भी मेरी सभी आवश्यकताओं को पूरा करेगा। यह वह जगह है जहां आप (विशेषज्ञ) मदद कर सकते हैं;)

एंडपॉइंट: मैं उपयोगकर्ता को गेंद को छूना चाहता हूं, और स्क्रीन पर किसी भी स्थान पर खींच सकता हूं। जब यह खींचा जाता है, और जब इसे गिरा दिया जाता है तो मैं इस गेंद को एनिमेट करना भी पसंद करूंगा।

मैं कस्टम क्लास का उपयोग करके ड्रैगिंग भाग को पूरा कर सकता हूं (जो कुछ भी नहीं बढ़ाता है ... इस ट्यूटोरियल में बस एक वर्ग जैसा मिलता है: basic drag & drop, हालांकि, मुझे नहीं पता कि ट्विन एनीमेशन को कैसे लागू करें चूंकि यह एक दृश्य नहीं है।

मैंने अपनी छवि के साथ एक छवि दृश्य का एक एनिमेटेड संस्करण भी विकसित किया है, हालांकि, मैं AbsoluteLayout का उपयोग किए बिना उसी ड्रैग & ड्रॉप कार्यक्षमता को लागू करने का प्रबंधन नहीं कर सकता, जो मुझे पता है एक नो-नो

तो ... मैं मोशनएवेंट्स का उपयोग करके एक ??? लेआउट के चारों ओर एक छवि दृश्य कैसे ले सकता हूं, या मैं कैसे एनिमेट कर सकता हूं (एक्सएमएल में परिभाषित tweens का उपयोग करके) एक गैर-दृश्य आधारित कस्टम क्लास रों?

यदि यह स्पष्ट नहीं है तो कृपया प्रश्न पूछें। मैं सभी शब्दावली के साथ-साथ आप में से अधिकांश को नहीं जानता।

औरdev.org फ़ोरम पर इस प्रश्न के copy भी है, इसलिए मैं इस पोस्ट को किसी भी प्रतिक्रिया के साथ अपडेट कर दूंगा।

+0

[एंड्रॉयड खींचने योग्य देखें] (http://www.singhajit.com/android-draggable-view/) –

उत्तर

23

आप व्यू का विस्तार क्यों नहीं कर सकते? फिर, आपके पास यह आकर्षित होता है कि यह कैसे आकर्षित होता है क्योंकि आप OnDraw() विधि को ओवरराइड कर सकते हैं। बस कलरबाल क्लास व्यू को बढ़ाएं। जब आप स्थानांतरित करते हैं तो अपनी स्थिति बदलें और फिर केवल एक दृश्य को अमान्य करें और 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

पहले, आपकी प्रतिक्रिया के लिए धन्यवाद । मुझे यकीन है कि यह समाधान है। मुझे पता नहीं है कि एक दृश्य को कैसे स्थानांतरित किया जाए (छवि दृश्य को विस्तारित करने के लिए तार्किक स्थान माना जाता है) एक ड्रैग कमांड के साथ एक AbsoluteLayout कंटेनर पेश किए बिना मुझे एक्स, वाई पोजिशनिंग देता है। सबसे अच्छा मैं अब तक पता लगाने में सक्षम हूं (एक्स, वाई) पर कस्टम कंटेनर व्यू के कैनवास पर कक्षा को चित्रित कर रहा हूं। मुझे किसी लेआउट कंटेनर (AbsoluteLayout के अलावा) के बारे में पता नहीं है जो इस तरह से (एक्स, वाई) स्वीकार करता है। मेरे ऐप में, मुझे इनमें से 4 विचारों की आवश्यकता है जिन्हें सभी को स्क्रीन के चारों ओर खींचा जा सकता है। मैं इसे एक और शॉट देने वाला हूं। brb;) – Peter

+0

मैंने अपनी "जेनेरिक" कक्षा को परिवर्तित कर दिया है ताकि यह अब व्यू को बढ़ा सके। क्या उन्हें (एक्स, वाई) में जोड़ने और उन्हें लेआउट के अंदर (X1, Y1) द्वारा स्थानांतरित करने की चाल को Layout() पर ओवरराइड करने और फिर अमान्य() को कॉल करना है? – Peter

+0

नहीं, ऑनड्रा() विधि को ओवरराइड करना। मैं अपने जवाब में एक उदाहरण पोस्ट करूंगा। – CaseyB

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