与触摸事件移动imageview的

问题描述:

我只想要一个简单的事情 我哈瓦一个imageview的,我可以用触摸与触摸事件移动imageview的

这是我的代码移动它,我很抱歉,如果这错了,我只是尝试自己

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

}

你能告诉我正确的方法吗?感谢:D

+0

所以,你试过你的方式,结果是什么?这段代码是否工作? – Egor 2013-02-11 15:00:08

+0

工作虽然我不触摸图像:( – 2013-02-12 03:49:49

+0

只是试试这个源代码,只是做你需要的东西http://whats-online.info/science-and-tutorials/98/Android-rotate-zoom-drag-image- in-imageview-on-touch-example/ – 2017-01-30 08:15:13

onTouch拖动视图的事件适用于RelativeLayoutFrameLayout的子视图。

下面是一个例子:

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

现在什么dxdy确实是,在ACTION_DOWN它记录在您对视图感动,从左至右(x)和顶部(Y)得到的差异该观点认为,在ACTION_MOVE期间维持这些利润率。

如果您正在参加,则返回触摸事件必须是true

更新:对于API 8

在API 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

setX是API 15上的方法吗?我在这里使用API​​ 8 .. – 2013-02-12 04:00:59

+0

是的,所以你必须在旧的API上以不同的方式执行,检查更新后的例子 – 2013-02-12 19:41:40

+0

btw我有一个quetion ,触摸和ontouchevent有什么不同? – 2013-02-15 17:03:19

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

     } 

如果你想在你需要品脱出 你应该遵循以下的步骤 步骤-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); 
} 

我已经做了这种方式:

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 2018-01-31 17:34:53

enter image description here

我有同样的问题,并设法解决这个问题。也就是说,在屏幕上拖动图像,除了放大和缩小以及以android编程方式在framelayout上旋转图像。刚刚尝试从这个博客这个源代码发布

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

下面的代码可以拖动和移动视图。

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