1

我正在使用FrameLayout在布局内有阴影。在上面FrameLayout,我添加ImageView了可在屏幕上拖动和调整大小的内容。

我已经给出了FrameLayout: android:layout_width&android:layout_heightfill_parent消耗屏幕区域。有必要满足应用程序的要求。

问题

我怎样才能限制Image不能被拖到外面FrameLayout

图 1 和图 2:

图 1 图 3

图 3:

图 2

4

1 回答 1

0

参考其大小和接触点对可拖动视图添加限制解决了我的问题。

所以我需要做的只是让接触点将它与framelayout边界进行比较,这取决于场景将限制设置为可拖动视图。

代码就像这些对我来说非常有效::

public boolean onTouch(View paramView, MotionEvent event)
    {
      ImageView view = (ImageView)paramView;
      switch (event.getAction() & MotionEvent.ACTION_MASK)


case MotionEvent.ACTION_MOVE:

          if (mode == DRAG) {
/*
* Restricting Image not to be draggable outside of FrameLayout
*/
              matrix.set(savedMatrix); //Top
              if(event.getY()==0)
              {
                  matrix.postTranslate(event.getX()+15-start.x, 0+15);
                  Log.d("Top", "Top...");
              }
              else if(event.getX()==0) //Left
              {
                  matrix.postTranslate(0+15, event.getY()-start.y+15);
                  Log.d("LEFT", "Left...");
              }
              else if((event.getY()-ImageHeight)>fm.getHeight()) //Bottom
              {
                  matrix.postTranslate(event.getX()-start.x+15, fm.getHeight()-ImageHeight+15);
                  Log.d("BOTTOM", "Bottom...");
              }
              else if((event.getX()-ImageWidth)>fm.getWidth()) //Right
              {
                  matrix.postTranslate(fm.getWidth()-ImageWidth+15, event.getY()-start.y+15);
                  Log.d("RIGHT", "Right....");
              }
              else if(event.getY()==0 && (event.getX()-ImageWidth)>fm.getWidth()) //Top -Right
              {
                  matrix.postTranslate(fm.getWidth()-ImageWidth-15, 15);
              }
              else if(event.getY()==0 &&event.getX()==0) //Top-Left
              {
                  matrix.postTranslate(15, 15);
              }
              else if((event.getY()-ImageHeight)>fm.getHeight() && event.getX()==0) //Bottom-Left
              {
                  matrix.postTranslate(15, fm.getHeight()-ImageHeight-15);
              }
              else if((event.getX()-ImageWidth)>fm.getWidth() && (event.getY()-ImageHeight)>fm.getHeight())
              {
                  matrix.postTranslate(fm.getWidth()-ImageWidth-15, fm.getHeight()-ImageHeight-15);
              }
              else
              {
                  matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);  
                  Log.d("ACTION_MOVE", "Starting Point::"+start.x+","+start.y+" Ending Point::"+event.getX()+","+event.getY());
                  Log.d("ACTION_DOWN", "FrameLayout::"+fm.getWidth()+" ,"+fm.getHeight()+" ImageView:: "+view.getWidth()+", "+view.getHeight());

              }
          }
          else if (mode == ZOOM) {

              float newDist = spacing(event);
              Log.d(TAG, "newDist=" + newDist);
              if (newDist > 10f) {

                  matrix.set(savedMatrix);
                  float scale = newDist / oldDist;
                  matrix.postScale(scale, scale, mid.x, mid.y);
              }
          }
          break;
           }  
      view.setImageMatrix(matrix);
      return true;       
    }
于 2013-04-09T09:43:32.430 回答