【问题标题】:Moving imageview with touch event带有触摸事件的移动图像视图
【发布时间】:2013-01-26 16:42:52
【问题描述】:

我只想要一个简单的东西。我有一个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);
}

你能告诉我正确的方法吗?

【问题讨论】:

  • 那么,您按照自己的方式尝试了,结果如何?这段代码是否有效?
  • 工作虽然我不碰图像:(

标签: android layout touch imageview


【解决方案1】:

我是这样做的:

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

完成

【讨论】:

  • 如何只在视图不会越界的范围内移动
  • @AmeerHamza 你找到解决办法了吗?
  • 让我回答下来。
  • 将视图拖出屏幕。任何解决方案请告诉我。提前致谢。
【解决方案2】:

用于拖动视图的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;
}

【讨论】:

  • 是的,因此您必须在旧 API 上以不同的方式执行此操作,请查看更新示例。
  • 顺便问一句,touch 和 ontouchevent 有什么不同?
  • 我测试了这段代码。 ImageView 在移动过程中闪烁,位置非常不准确
  • 此方法使图像在移动时闪烁。还有其他解决方案吗?
  • @Enigma 您使用哪种方法获取触摸坐标? getX()getRawX() ?如果 getX() 中闪烁,则使用 getRawX()(同样适用于 Y)。
【解决方案3】:

我遇到了同样的问题并设法解决了这个问题。也就是说,拖动屏幕上的图像,除了放大和缩小并以编程方式在android中的framelayout上旋转图像。试试这篇博文中的源代码

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

【讨论】:

    【解决方案4】:
    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();
    
            }
    

    【讨论】:

      【解决方案5】:

      如果您想向任何方向移动图像,您需要标出方向 你应该按照以下步骤 第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);
      }
      

      【讨论】:

        【解决方案6】:

        以下代码允许拖动和移动视图。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          • 1970-01-01
          相关资源
          最近更新 更多