2013-02-11 9 views
8

मैं सिर्फ एक सरल बात चाहते मैं एक imageView hava और मैं स्पर्शस्पर्श घटना के साथ आगे बढ़ते imageView

यह मेरा कोड है के साथ ले जाएँ, खेद im कर सकते हैं यह गलत हैं क्योंकि मैं सिर्फ यह अपने आप

img.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      // TODO Auto-generated method stub 
     if(arg1.getAction()==MotionEvent.ACTION_DOWN) 
     { 
      status=StartDrag; 
     } 
     else if(arg1.getAction()==MotionEvent.ACTION_UP) 
     { 
      status=StopDrag; 
     } 
     return false; 
     } 
    }); 

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
// TODO Auto-generated method stub 

    if(status==StartDrag) 
    { 
    params.leftMargin = (int)event.getX(); 
    params.topMargin = (int)event.getY(); 
    img.setLayoutParams(params); 
    } 
return super.onTouchEvent(event); 
कोशिश

}

क्या आप मुझे सही रास्ता दिखा सकते हैं? धन्यवाद: डी

+0

तो, आपने इसे अपना रास्ता आजमाया, और नतीजा क्या हुआ? क्या यह कोड काम कर रहा है या नहीं? – Egor

+0

काम althought मैं छवि को छूना नहीं :( –

+0

बस इस स्रोत कोड को आजमाएं, बस आपको जो चाहिए वह करता है http://whats-online.info/science-and-tutorials/98/Android-rotate-zoom-drag-image- इन-इमेजव्यू-ऑन-टच-उदाहरण/ –

उत्तर

19

onTouch विचारों को खींचने के लिए ईवेंट RelativeLayout और FrameLayout के बच्चों के विचारों के लिए सही काम करता है।

यहाँ एक उदाहरण है:

@Override 
public boolean onTouch(View v, MotionEvent event){ 
     switch(event.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN : 
      { 
       x = event.getX(); 
            y = event.getY(); 
       dx = x-myView.getX(); 
       dy = y-myView.getY(); 
      } 
      break; 
      case MotionEvent.ACTION_MOVE : 
      { 
       myView.setX(event.getX()-dx); 
       myView.setY(event.getY()-dy); 
      } 
      break; 
      case MotionEvent.ACTION_UP : 
      { 
       //your stuff 
      } 
     return true; 
} 

अब क्या dx और dy है, ACTION_DOWN पर यह रिकॉर्ड जहां दृश्य को छुआ है, और के लिए छोड़ दिया (x) और शीर्ष (y) से अंतर हो जाता है दृश्य, ACTION_MOVE के दौरान उन मार्जिन को बनाए रखने के लिए।

यदि आप इसमें भाग ले रहे हैं तो टच इवेंट की वापसी true होनी चाहिए।

अद्यतन: एपीआई 8

एपीआई 8, getX() और getY() तरीकों सही परिणाम देने नहीं कर रहे हैं के मामले में, के लिए तो तुम क्या उपयोग कर सकते हैं getRawX() और getRawY() तरीकों है।

उदाहरण:

RelativeLayout.LayoutParams parms; 
LinearLayout.LayoutParams par; 
float dx=0,dy=0,x=0,y=0; 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch(event.getAction()) 
    { 
     case MotionEvent.ACTION_DOWN : 
     { 
      parms = (LayoutParams) myView.getLayoutParams(); 
      par = (LinearLayout.LayoutParams) getWindow().findViewById(Window.ID_ANDROID_CONTENT).getLayoutParams(); 
      dx = event.getRawX() - parms.leftMargin; 
      dy = event.getRawY() - parms.topMargin; 
     } 
     break; 
     case MotionEvent.ACTION_MOVE : 
     { 
      x = event.getRawX(); 
      y = event.getRawY(); 
      parms.leftMargin = (int) (x-dx); 
      parms.topMargin = (int) (y - dy); 
      myView.setLayoutParams(parms); 
     } 
     break; 
     case MotionEvent.ACTION_UP : 
     { 

     } 
     break; 
    } 
    return true; 
} 
+0

सेटएक्स एपीआई 15 पर विधि है? मैं एपीआई 8 का उपयोग करता हूं .. –

+0

हां, इसलिए आपको पुराने एपीआई पर इसे अलग-अलग तरीके से करना है, अपडेटेड उदाहरण की जांच करें। –

+0

btw मेरे पास एक quetion है , टच और ऑनटॉचेंट पर अलग क्या है? –

0
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1); 
      RelativeLayout.LayoutParams layoutParams; 
      layoutParams = new RelativeLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      final ImageView view = new ImageView(getApplicationContext()); 
      view.setPadding(10, 10, 10, 10); 
      view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]); 
      view.setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        windowwidth = getWindowManager().getDefaultDisplay() 
          .getWidth(); 
        windowheight = getWindowManager().getDefaultDisplay() 
          .getHeight(); 

        android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view 
          .getLayoutParams(); 
        switch (event.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
         Toast.makeText(ImageEditingClass.this, 
           "hii rma jee", Toast.LENGTH_SHORT).show(); 
         break; 
        case MotionEvent.ACTION_MOVE: 

         RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view 
           .getLayoutParams(); 
         int x_cord = (int) event.getRawX(); 
         int y_cord = (int) event.getRawY(); 
         if (x_cord > windowwidth) { 
          x_cord = windowwidth; 
         } 
         if (y_cord > windowheight) { 
          y_cord = windowheight; 
         } 

         layoutParams.leftMargin = x_cord - 15; 

         layoutParams.topMargin = y_cord -100; 

         layoutParams.rightMargin = x_cord - 50; 
         layoutParams.bottomMargin = x_cord - 50; 
         view.setLayoutParams(layoutParams); 
         break; 
        default: 
         break; 
        } 
        return true; 
       } 
      }); 
      // setText(++ViewGenerate + " hii this new"); 

      StickerRelativeLayout.addView(view, layoutParams); 
      // } 
      Toast.makeText(ImageEditingClass.this, "you click" + arg2, 
        Toast.LENGTH_SHORT).show(); 

     } 
0

आप किसी भी दिशा आप दिशा आप निम्नलिखित कदम कदम -1 नाव dx = 0 का पालन करना चाहिए बाहर पिंट के लिए की जरूरत में अपनी छवि को स्थानांतरित करना चाहते हैं, dy = 0, x = 0, y = 0, z = 0, w = 0, dz = 0, dw = 0; {इन आप चार समन्वय}

public void StickerPopulate(){ 
    LinerLayoutInfate.removeAllViews(); 

    shstickerBaseAdaptor = new ShstickerBaseAdaptor(getApplicationContext()); 
    View shstickerView = getLayoutInflater().inflate(R.layout.shareimage, 
      null); 
    Gallery shsticker_gallery = (Gallery) shstickerView 
      .findViewById(R.id.shsticker_gallery); 
    shsticker_gallery.setAdapter(new ShstickerBaseAdaptor(
      ImageEditingClass.this)); 

    shsticker_gallery.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1); 
      RelativeLayout.LayoutParams layoutParams; 
      layoutParams = new RelativeLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

      final ImageView crossBtn = new ImageView(
        getApplicationContext()); 
      crossBtn.setBackgroundResource(R.drawable.cross); 

      crossBtn.setMaxWidth(300); 
      crossBtn.setMaxHeight(200); 
      crossBtn.setPadding(10, 10, 10, 10); 
      final ImageView view = new ImageView(getApplicationContext()); 

      view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]); 

      view.setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        windowwidth = getWindowManager().getDefaultDisplay() 
          .getWidth(); 

        windowheight = getWindowManager().getDefaultDisplay() 
          .getHeight(); 

        android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view 
          .getLayoutParams(); 
        switch (event.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
         dx = event.getRawX() - layoutParams.leftMargin; 
         dy = event.getRawY() - layoutParams.topMargin; 
         dz = event.getRawX() - layoutParams.bottomMargin; 
         dw = event.getRawX() - layoutParams.rightMargin; 

         break; 
        case MotionEvent.ACTION_MOVE: 

         RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view 
           .getLayoutParams(); 

         x = event.getRawX(); 
         y = event.getRawY(); 
         layoutParams.leftMargin = (int) (x - dx); 

         layoutParams.topMargin = (int) (y - dy); 
         layoutParams.bottomMargin = (int) (z - dz); 
         layoutParams.rightMargin = (int) (w - dw); 

         view.setLayoutParams(layoutParams); 

         break; 

        default: 
         break; 
        } 
        return true; 
       } 
      }); 
      StickerRelativeLayout.addView(crossBtn, layoutParams); 

      StickerRelativeLayout.addView(view, layoutParams); 
      // } 
      Toast.makeText(ImageEditingClass.this, "you click" + arg2, 
        Toast.LENGTH_SHORT).show(); 

     } 

    }); 
    LinerLayoutInfate.addView(shstickerView); 
} 
14

मैं इस तरह से किया है:

private float xCoOrdinate, yCoOrdinate; 

OnCreate():

ImageView imageView = (ImageView)findViewById(R.id.imageView); 
imageView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     switch (event.getActionMasked()) { 
      case MotionEvent.ACTION_DOWN: 
       xCoOrdinate = view.getX() - event.getRawX(); 
       yCoOrdinate = view.getY() - event.getRawY(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start(); 
       break; 
      default: 
       return false; 
      } 
     return true; 
    } 
}); 

हो गया

+0

पूरी तरह से काम करता है। धन्यवाद। – HeisenBerg

0

enter image description here

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

Android rotate zoom drag image in imageview on touch example ...

0

निम्नलिखित कोड को खींच कर एक दृश्य वहां जा सकते हैं की कोशिश करो।

import android.view.*; 
import android.view.View.*; 

public class DragMove<T extends View> implements OnTouchListener 
{ 
    private final T view; 
    private int leftOffset; 
    private int topOffset; 

    public DragMove(T dragable) 
    { 
     this.view = dragable; 
     this.view.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View p1, MotionEvent event) 
    { 
     /* 
     public static int pxFromDp(double dp, View v) 
     { 
      Activity context = (Activity)v.getContext(); 
      return pxFromDp(dp, context); 
     } 

     public static int pxFromDp(double dp, Activity context) 
     { 
      float logicalDensity = getDensity(context); 
      int px = (int) Math.round(dp * logicalDensity); 
      return px; 
     } 
     */ 

     int x = GuiUtils.pxFromDp(event.getRawX(), view); 
     int y = GuiUtils.pxFromDp(event.getRawY(), view); 

     switch (event.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN : 
       { 
        // calculates offset to current coordinate, 
        // keeps position relative (from jumping) during move 
        ViewGroup.LayoutParams parms = view.getLayoutParams(); 
        // e.g. = x - params.leftMargin 
        leftOffset = x - Layout.readLeftMargin(parms); 
        topOffset = y - Layout.readTopMargin(parms); 
       } 
       return true; 
      case MotionEvent.ACTION_MOVE : 
       { 
        // adjust by touch position retaining touch 
        // offset at start 
        ViewGroup.LayoutParams parms = view.getLayoutParams(); 
        // e.g params.leftMargin = x - leftOffset 
        Layout.writeLeftMargin(parms, x - leftOffset); 
        Layout.writeTopMargin(parms, y - topOffset); 
        view.setLayoutParams(parms); 
       } 
       return true; 
     } 
     return false; 
    } 
} 
संबंधित मुद्दे