Android控件用于简单的拖放框

时间:2013-09-17 04:27:17

标签: android drag-and-drop controls

我希望应用程序顶部有一行项目,每个框内都有一个图标或一个字母。您可以按任何顺序水平排列它们。真的很容易交换,而不是像握住然后移动。我会用什么样的控制?

1 个答案:

答案 0 :(得分:7)

首先让我澄清一下这个任务。您是否只需要水平列表中的一组预定义项目(选项A)

enter image description here

或滚动(选项B)的水平列表

enter image description here

我们暂时假设option A是相关的,所以你需要:

  1. 水平列表实施
  2. 正确的拖放处理
  3. 第1步

    有几个水平列表实现可用,但其中一些是旧的且不受支持,所以我建议检查Horizontal Variable ListView

      

    Android的水平ListView。基于官方ListView谷歌   码。它支持ListView小部件的几乎所有功能。   支持的属性之间存在细微差别   “dividerWidth”而不是默认的“dividerHeight”。

    BTW支持Android 4.2.2,另请参阅demo example

    第2步

    此时您实际需要的只是正确处理拖放操作。

    最简单的解决方案是遵循标准和众所周知的示例:音乐应用程序中使用的TouchInterceptor class。它扩展了ListView,因此使用与Horizontal Variable ListView相同的方法不应该是一个问题。

    特别注意:

    public boolean onInterceptTouchEvent(MotionEvent ev) {
    

    public boolean onTouchEvent(MotionEvent ev) {
    

    第3步:高级实施

    我个人认为option A只能用作演示,所以你也必须解决滚动问题。上面的示例显示了如何处理滚动,但可能需要更多的情况。

    enter image description here

    还有另一个项目(再次停产)可用作高级示例,因为它解决了几个问题,支持动画等:

      

    DragSortListView (DSLV)是Android ListView的扩展   启用列表项的拖放重新排序。这是一次重大改革   完全重写TouchInterceptor(TI)意味着给予   拖动分选抛光的感觉。一些关键功能是:

         
        
    • 清除拖放
    •   
    • 拖动时直观且流畅的滚动。
    •   
    • 支持异构项目高度。
    •   
    • 公共startDrag()和stopDrag()方法。
    •   
    • 用于自定义浮动视图的公共接口。
    •   
         

    DragSortListView对各种优先级列表都很有用:   收藏夹,播放列表,清单等。

    它似乎记录良好且易于理解。从垂直模式切换到水平模式不应该那么难。

    public class DragSortListView extends ListView {
    
    
        /**
         * The View that floats above the ListView and represents
         * the dragged item.
         */
        private View mFloatView;
    
        /**
         * The float View location. First based on touch location
         * and given deltaX and deltaY. Then restricted by callback
         * to FloatViewManager.onDragFloatView(). Finally restricted
         * by bounds of DSLV.
         */
        private Point mFloatLoc = new Point();
    
        private Point mTouchLoc = new Point();
    
        /**
         * The middle (in the y-direction) of the floating View.
         */
        private int mFloatViewMid;
    
        /**
         * Flag to make sure float View isn't measured twice
         */
        private boolean mFloatViewOnMeasured = false;
    
        /**
         * Watch the Adapter for data changes. Cancel a drag if
         * coincident with a change.
         */ 
        private DataSetObserver mObserver;
    
        /**
         * Transparency for the floating View (XML attribute).
         */
        private float mFloatAlpha = 1.0f;
        private float mCurrFloatAlpha = 1.0f;
    
        /**
         * While drag-sorting, the current position of the floating
         * View. If dropped, the dragged item will land in this position.
         */
        private int mFloatPos;