2011-10-25 41 views
3

在ListView和Gallery等控件中,您可以将项目垂直或水平地拖放到一个方向上。如何水平拖动视图?

我有一个TextView,我成功拖动它。但我想把它在水平方向移动。我如何实现它?

感谢,

我的代码:

public class MyDragShadowBuilder extends View.DragShadowBuilder { 
    private static View view; 

    public MyDragShadowBuilder(View v) { 
     super(v); 
     view = v; 
    } 

    @Override 
    public void onProvideShadowMetrics(Point size, Point touch) { 
     width = getView().getWidth(); 
     height = getView().getHeight(); 
     size.set(width, height); 
     touch.set(width/2, height/2); 
    } 

    private int width, height; 

    @Override 
    public void onDrawShadow(Canvas canvas) { 
     view.draw(canvas); 
    } 
} 
在我的活动

tv.setOnLongClickListener(new OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      ClipData data = ClipData.newPlainText("dot", 
        "Dot : " + v.toString()); 
      View.DragShadowBuilder myShadow = new MyDragShadowBuilder(v); 
      v.startDrag(data, myShadow,(Object) v, 0); 
      return false; 
      } 
     }); 

我想模拟一个画廊。我有10000张照片来展示它。我的画廊可以显示10张照片。我想拖动包含图库内容的画廊的LinearLayout,当LinearLayout到达像SlidingDrawer这样的窗口的末端时,更改其内容并显示下面的10张照片。 SlidingDrawer是一个很好的解决方案,但它有一些限制。当您将整个LinearLayout设置为其句柄时,无法单击它。当您为其设置单独的手柄时,无法确定手柄相对于内容的位置。

+3

你试过把它在一个Horizo​​ntalScrollView? http://developer.android.com/reference/android/widget/Horizo​​ntalScrollView.html – Jave

回答

3

水平滚动视图是Android最简单的横向拖动选项...

HORIZONTAL SCROLL VIEW

试一下....和里面的规定,给TextView的,或者你更喜欢使用任何布局或部件......它会更加动态程序...

3

如果你湾完美的解决方案t按照其他建议的方法滚动使用水平滚动视图。

但是,如果您的意思是拖动“拖放”,那么您可以执行以下操作。

  • 建立在TextView
  • 触摸监听器监听所有事件之后ACTION_DOWN和事件ACTION_MOVE
  • 从上述事件获取xy位置
  • 使用API​​ setTopsetLeft和设置他们到xy你得到以上
  • 然后调用invalidate整体v iew

这应该在屏幕上拖动UI元素。

0

您可以使用水平滚动视图模拟水平滑动画廊。

5

与Bluefalcon的建议开始,我喜欢的东西来到了:

// in onCreate of the containing view 
dragButton.setOnTouchListener(new DragExperimentTouchListener(dragButton.getX(), dragButton.getY())); 

...

public class DragExperimentTouchListener implements View.OnTouchListener { 

    public DragExperimentTouchListener(float initalX, float initialY) { 
     lastX = initalX; 
     lastY = initialY; 
    } 

    boolean isDragging = false; 
    float lastX; 
    float lastY; 
    float deltaX; 

    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 

     int action = arg1.getAction(); 

     if (action == MotionEvent.ACTION_DOWN && !isDragging) { 
      isDragging = true; 
      deltaX = arg1.getX(); 
      return true; 
     } else if (isDragging) { 
      if (action == MotionEvent.ACTION_MOVE) { 

       arg0.setX(arg0.getX() + arg1.getX() - deltaX); 
       arg0.setY(arg0.getY()); 
       return true; 
      } else if (action == MotionEvent.ACTION_UP) { 
       isDragging = false; 
       lastX = arg1.getX(); 
       lastY = arg1.getY(); 
       return true; 
      } else if (action == MotionEvent.ACTION_CANCEL) { 
       arg0.setX(lastX); 
       arg0.setY(lastY); 
       isDragging = false; 
       return true; 
      } 
     } 

     return false; 
    } 
} 
+0

你也可以把lastX和lastY的初始化设置为'''lastX = initalX; lastY = initialY;''' 'if(action == MotionEvent.ACTION_DOWN &&!isDragging)'里面。 首先,因为它确定视图已经在onTouch()中绘制,并且您将获得正确的x和y。其次,即使视图由于以前的拖动而已经移动,每次开始拖动时都会再次初始化。 – vida

+0

这是工作,但有时(我认为拖到父视图)ACTION_CANCEL制作问题。我删除“否则如果ACTION_CANCEL”和编辑“其他如果ACTION_UP”为“其他。并且它解决了:) – Mete

+0

你救了我的感谢的人。 –