【问题标题】:How to get the xy position of the 4 corners of my image view android如何获得我的图像视图android的4个角的xy位置
【发布时间】:2013-11-05 16:57:55
【问题描述】:

我正在为 Android 上的照片编辑器创建调整大小功能。每次触摸图像时,我都想在 imageView 的角上放一个圆圈/点。这样我就可以拖动那个圆圈来调整图像的大小。

我的问题是如何获得图像视图 4 个角的 xy 位置。现在我正在为左上角创建:

  ImageView edgePoints = null;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);        

    findViewById(R.id.imageBlue).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.imgstage).setOnDragListener(new MyDragListener()); 
    edgePoints = (ImageView)findViewById(R.id.edgePoint); // the dot/circle
    edgePoints.setVisibility(View.INVISIBLE);

}   


Private final class MyTouchListener implements OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN ) {
          ClipData data = ClipData.newPlainText("", "");
          DragShadowBuilder shadowBuilder = new DragShadowBuilder(view);
          view.startDrag(data, shadowBuilder, view, 0);
          view.setVisibility(View.VISIBLE);


          ViewGroup owner = (ViewGroup) view.getParent();
          if(owner.getId() == R.id.imgstage)
          {
              lastImageSelected = (ImageView) view;
              RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
              params1.leftMargin = view.getLeft();
              params1.topMargin = view.getTop();
              edgePoints.setLayoutParams(params1);
               edgePoints.setVisibility(View.Visible);
          }

          return true;
        } else {
        return false;
        }
      }

    }

这是我的拖动监听器

     class MyDragListener implements OnDragListener {
    @Override
      public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        final int X = (int) event.getX();
        final int Y = (int) event.getY();

        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
          break;
        case DragEvent.ACTION_DRAG_ENTERED:
          break;
        case DragEvent.ACTION_DRAG_EXITED:        
          break;
        case DragEvent.ACTION_DROP:
          View view = (View) event.getLocalState();
          ViewGroup owner = (ViewGroup) view.getParent();
          ImageView imageView = (ImageView) findViewById(R.id.imgView);
          RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(imageView.getWidth()/9, imageView.getWidth()/9);
          params1.leftMargin = (int) event.getX() - ((imageView.getWidth()/9)/2);
          params1.topMargin = (int) event.getY() -((imageView.getWidth()/9)/2);


          if(owner.getId() != R.id.imgstage)
          {
              owner.removeView(view);
              RelativeLayout container = (RelativeLayout) v;
              container.addView(view,params1);
          }
          else
              view.setLayoutParams(params1);

          view.setVisibility(View.VISIBLE);


          if(owner.getId() != R.id.imgstage)
          {
              FrameLayout layout = (FrameLayout) owner;
              Context context = getApplicationContext();


              ImageView imv=new ImageView(context);
              FrameLayout.LayoutParams marginParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
              marginParams.setMargins(4, 4, 4, 4);
              imv.setLayoutParams(marginParams);


              imv.setOnTouchListener(new MyTouchListener());

              if(owner.getId() == R.id.blueLayout)   
                  imv.setImageResource(R.drawable.blueblock);
              if(owner.getId() == R.id.orageLayout) 
                  imv.setImageResource(R.drawable.orangeblock);
              if(owner.getId() == R.id.redLayout) 
                  imv.setImageResource(R.drawable.redblock);
              if(owner.getId() == R.id.greenLayout) 
                  imv.setImageResource(R.drawable.greenblock);

              layout.addView(imv);//to be included
          }
          break;
        case DragEvent.ACTION_DRAG_ENDED:
          default:
          break;
        }
        return true;
      }
  }

【问题讨论】:

  • 还有 getRight() 和 getBottom() 方法。

标签: android image-resizing


【解决方案1】:

您的应用崩溃的原因是您多次尝试将edgePoints 添加到布局中。如果已添加视图,则无法添加视图。

解决方案是在调用之前添加视图,onTouch 并保留它INVISIBLE。然后,onTouch,您应该执行以下操作:

public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN ) {

        RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params1.leftMargin = lastImageSelected.getLeft();
        params1.topMargin = lastImageSelected.getTop();

        edgePoints.setVisibility(View.VISIBLE);
        edgePoints.setLayoutParams(params1);
    }
}

只需设置layout params 不要调用addView()

【讨论】:

  • 但是如果我想在4个角上实现,我必须创建4个ImageView?
  • 其实,我已经给出了一个解决方案来解决您的应用程序崩溃的原因。 (既然你说,首先触摸一切正常)。对于四个角的事情..请发布更多代码。什么是edgePoints,你是怎么初始化的……等等……?
  • 我编辑了我的问题。我的问题现在我需要在边缘点移动之前触摸两次 ImageView。
  • 它是否显示在左下角?它现在可以正常工作而不会崩溃吗?
  • 是的!但是在我触摸图像后它会到达最后一个左角。我需要移动图像两次,但正如我所说,它得到了左角的最后一个位置。
【解决方案2】:

如果您想让照片编辑器更好地在您自己的视图上进行,关于在那里重新调整大小很容易,您只需绘制一个包含图像和边缘上的四个小矩形的矩形,使用您的优势自己的观点是获取坐标和操作坐标要容易得多,而且不会让布局参数头疼。

看看here

【讨论】:

  • 是否可以拖动小矩形来调整图像大小。我不知道如何做到这一点。
  • 是的,通过移动任何矩形边缘,矩形将被调整大小,内部图像将自动调整大小
  • 我可以简单地在图像视图上放置一个矩形,以便调整矩形的大小吗?这可能吗?
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多