как использовать правильное перетаскивание вида на андроид - PullRequest
4 голосов
/ 25 октября 2011

кажется, что существует множество решений, как использовать перетаскивание видов на андроид.

однако они либо слишком медленные, либо глючные.

известное решение состоит в том, чтобы иметь framelayout, и представление просто меняет свой layoutParams при его перемещении с помощью OnTouchListener, как описано здесь: http://www.anddev.org/novice-tutorials-f8/android-drag-and-drop-of-normal-views-not-bitmaps-t13404.html однако, если представление является представлением изображения, при достижении самой правой (или самой нижней) стороны структуры кадра изображение сжимается.

другое возможное решение - использовать холст для отображения перетаскиваемого содержимого, как описано здесь: http://www.anddev.org/basic_drag_and_drop-t3095.html однако я не уверен, как использовать его для сложных представлений.

Кто-нибудь знает хорошее решение, позволяющее сохранить размер перетаскиваемого изображения неизменным, независимо от того, где оно находится в контейнере?

пожалуйста, помогите мне.

Ответы [ 2 ]

13 голосов
/ 15 сентября 2013

Вот полное решение для простого перетаскивания imageView:

findViewById(R.id.imageView).setOnTouchListener(new OnTouchListener()
  {
    int prevX,prevY;

    @Override
    public boolean onTouch(final View v,final MotionEvent event)
      {
      final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams();
      switch(event.getAction())
        {
        case MotionEvent.ACTION_MOVE:
          {
          par.topMargin+=(int)event.getRawY()-prevY;
          prevY=(int)event.getRawY();
          par.leftMargin+=(int)event.getRawX()-prevX;
          prevX=(int)event.getRawX();
          v.setLayoutParams(par);
          return true;
          }
        case MotionEvent.ACTION_UP:
          {
          par.topMargin+=(int)event.getRawY()-prevY;
          par.leftMargin+=(int)event.getRawX()-prevX;
          v.setLayoutParams(par);
          return true;
          }
        case MotionEvent.ACTION_DOWN:
          {
          prevX=(int)event.getRawX();
          prevY=(int)event.getRawY();
          par.bottomMargin=-2*v.getHeight();
          par.rightMargin=-2*v.getWidth();
          v.setLayoutParams(par);
          return true;
          }
        }
      return false;
      }
  });
2 голосов
/ 25 октября 2011

Я использую перетаскивание в текущем проекте, где различные View s помещены в RelativeLayout в соответствии с LayoutParams, примененным к ним. Как и вы, я обнаружил, что представления будут уменьшаться при достижении правого или нижнего края контейнера ViewGroup. Вероятно, вполне очевидно, что это произойдет, на самом деле, учитывая, что на этапах измерения и компоновки система определит, что данный View внезапно должен будет иметь гораздо меньшие размеры, чем вы на самом деле хотите, если он все еще будет чтобы быть в состоянии вписаться в родителя, когда находится вблизи крайностей.

Очень простое решение, которое я сделал, чтобы обойти это на данный момент, состоит в том, чтобы просто увеличить мой ViewGroup относительно размера экрана.

Кроме того, вы можете решить, что вы на самом деле не хотите, чтобы View s появлялись частично за кадром, и в этом случае вы использовали бы некоторую программную логику, чтобы не допустить установки полей объектов View таким образом, чтобы View разрешено выходить за пределы родительского контейнера.

Другое решение может заключаться в переопределении onMeasure() или аналогичном, чтобы заставить дочерний элемент View принудительно установить больший размер, чем родитель считает доступным для него - если это возможно - чтобы заставить представление быть помещенным туда в желаемый размер, перекрывая края. Это просто идея из головы, хотя и не исследовал ее.

...