2011-02-18 11 views
9

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

package com.dynamic; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.dynamic.R; 
import com.dynamic.R.layout; 


public class dy extends Activity { 
    int status; 
    private FrameLayout layout; 
    ImageView image; 
    Button b; 
    LayoutParams params; 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.frm); 
      final Button tv=(Button)findViewById(R.id.txt_birth); 
      tv.setDrawingCacheEnabled(true); 

      layout = (FrameLayout) findViewById(R.id.frm); 
      params = new LayoutParams(100,100); 


      params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
      tv.setOnTouchListener(new View.OnTouchListener(){ 

     @Override 
     public boolean onTouch(View v, MotionEvent me) { 
      // TODO Auto-generated method stub 

      if (me.getAction() == MotionEvent.ACTION_DOWN) { 
       System.out.println("up"); 
       status = 0; 

      } 
      if (me.getAction() == MotionEvent.ACTION_UP) { 
       status = 1; 
       //Log.i("Drag", "Stopped Dragging"); 
      } else if (me.getAction() == MotionEvent.ACTION_MOVE) { 
       if (status == 0) { 
        System.out.println("Dragging"); 

        tv.setPadding((int) me.getRawX(), (int) me.getRawY(), 0, 0); 
       // b.setPadding(0,50,0,0); 
        tv.invalidate(); 

       } 
      } 
      return false; 
     } 

    }); 
} 
} 

उत्तर

6

मैं इस तरह के कुछ पर काम कर रहा हूं। यहाँ OnTouchListener है कि मैं का उपयोग कर रहा है:

  myOnTouchListener = new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent me){ 
      if (me.getAction() == MotionEvent.ACTION_DOWN){ 
       oldXvalue = me.getX(); 
       oldYvalue = me.getY(); 
       Log.i(myTag, "Action Down " + oldXvalue + "," + oldYvalue); 
      }else if (me.getAction() == MotionEvent.ACTION_MOVE ){ 
       LayoutParams params = new LayoutParams(v.getWidth(), v.getHeight(),(int)(me.getRawX() - (v.getWidth()/2)), (int)(me.getRawY() - (v.getHeight()))); 
       v.setLayoutParams(params); 
      } 
      return true; 
     } 
    }; 

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

7

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

dragBtn.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent me) { 
      if (me.getAction() == MotionEvent.ACTION_MOVE ){ 
       LayoutParams params = new LayoutParams(v.getWidth(), v.getHeight()); 
       //set the margins. Not sure why but multiplying the height by 1.5 seems to keep my finger centered on the button while it's moving 
       params.setMargins((int)me.getRawX() - v.getWidth()/2, (int)(me.getRawY() - v.getHeight()*1.5), (int)me.getRawX() - v.getWidth()/2, (int)(me.getRawY() - v.getHeight()*1.5)); 
       v.setLayoutParams(params); 
      } 
      return true; 
     } 
    }); 

नोट: यह केवल तभी काम करता है जब आप खींच रहे हैं कि पदानुक्रम में अंतिम दृश्य है। अन्यथा यह देखने के संबंध में सभी अन्य विचारों को स्थानांतरित करता है कि आप खींच रहे हैं।

+2

मैं इस कोशिश की, लेकिन जैसा कि मैंने ले जाते हैं, imag/बटन भी कम है और अदृश्य होता जा रहा है। क्या आप – png

+1

मदद कर सकते हैं मैं रिश्तेदार लेआउट का उपयोग कर रहा था। यही कारण था। धन्यवाद – png

+0

मैं रिलेटिव लेआउट का भी उपयोग कर रहा हूं, कृपया मेरी मदद करें कि आपको यह –

0

बाहर मेरी समाधान है, जो न layutParams फिर से बनाने करता कोशिश करते हैं और यह भी किनारों अच्छी तरह से संभालती है:

https://stackoverflow.com/a/18806475/878126

1

शायद जवाब सुधार किया जाना चाहिए, क्योंकि यह सवाल अब भी बहुत ही महत्वपूर्ण है, जब आप गूगल इसे समझ लिया

आज एक फ्रेमवर्क है जिसका उपयोग ड्रैग और ड्रॉप के लिए किया जा सकता है। यह एंड्रॉयड 4.

साथ पेश किया गया था आप गूगल डेवलपर पृष्ठ पर एक अच्छा ट्यूटोरियल पा सकते हैं:
https://developer.android.com/guide/topics/ui/drag-drop.html

+1

कैसे मिला है, फ्रेमवर्क खींचें और छोड़ें दृश्यों के बीच डेटा खींचने के बारे में है, ओपी में स्वयं को खींचने के लिए नहीं। – Noumenon

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