前言

网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下。

声明

欢迎转载,但请保留文章原始出处:) 
博客园:http://www.cnblogs.com

农民伯伯: http://over140.cnblogs.com

正文

截图

代码

java

public class HoDragActivity extends Activity {

    private LinearLayout main;

    private GestureDetector mGestureDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_cc);         main = (LinearLayout) findViewById(R.id.main);         bindDrapListener(R.id.myimage1);
        bindDrapListener(R.id.myimage2);
        bindDrapListener(R.id.myimage3);
        bindDrapListener(R.id.myimage4);
        bindDrapListener(R.id.myimage5);
        bindDrapListener(R.id.myimage6);
        bindDrapListener(R.id.myimage7);
        bindDrapListener(R.id.myimage8);
        bindDrapListener(R.id.myimage9);
        bindDrapListener(R.id.myimage10);
        bindDrapListener(R.id.myimage11);
        bindDrapListener(R.id.myimage12);         mGestureDetector = new GestureDetector(this, new DrapGestureListener());
    }     private View mDrapView;     private void bindDrapListener(int id) {
        View v = findViewById(id);
        v.setOnTouchListener(mOnTouchListener);
        v.setOnDragListener(mOnDragListener);
    }     private OnTouchListener mOnTouchListener = new OnTouchListener() {         @Override
        public boolean onTouch(View v, MotionEvent event) {
            mDrapView = v;             if (mGestureDetector.onTouchEvent(event))
                return true;             switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:                 break;
            }             return false;
        }
    };     private OnDragListener mOnDragListener = new OnDragListener() {         @Override
        public boolean onDrag(View v, DragEvent event) {
            switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                // Do nothing
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                v.setAlpha(0.5F);
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                v.setAlpha(1F);
                break;
            case DragEvent.ACTION_DROP:
                View view = (View) event.getLocalState();
                for (int i = 0, j = main.getChildCount(); i < j; i++) {
                    if (main.getChildAt(i) == v) {
                        // 当前位置
                        main.removeView(view);
                        main.addView(view, i);
                        break;
                    }
                }
                break;
            case DragEvent.ACTION_DRAG_ENDED:
                v.setAlpha(1F);
            default:
                break;
            }
            return true;
        }
    };     private class DrapGestureListener extends SimpleOnGestureListener {
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return super.onSingleTapConfirmed(e);
        }         @Override
        public void onLongPress(MotionEvent e) {
            super.onLongPress(e);
            ClipData data = ClipData.newPlainText("", "");
            MyDragShadowBuilder shadowBuilder = new MyDragShadowBuilder(
                    mDrapView);
            mDrapView.startDrag(data, shadowBuilder, mDrapView, 0);
        }         @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
    }     private class MyDragShadowBuilder extends View.DragShadowBuilder {         private final WeakReference<View> mView;         public MyDragShadowBuilder(View view) {
            super(view);
            mView = new WeakReference<View>(view);
        }         @Override
        public void onDrawShadow(Canvas canvas) {
            canvas.scale(1.5F, 1.5F);
            super.onDrawShadow(canvas);
        }         @Override
        public void onProvideShadowMetrics(Point shadowSize,
                Point shadowTouchPoint) {
            // super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);             final View view = mView.get();
            if (view != null) {
                shadowSize.set((int) (view.getWidth() * 1.5F),
                        (int) (view.getHeight() * 1.5F));
                shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
            } else {
                // Log.e(View.VIEW_LOG_TAG,
                // "Asked for drag thumb metrics but no view");
            }
        }
    }
}

代码说明

1、 MyDragShadowBuilder主要用于缩放拖拽的ImageView,这里放大了1.5倍,而又不至于影响原控件,这里是放大两倍

2、这里是通过长按来唤起拖拽操作,所以监听了onLongPress

3、注意拖拽onDragListener是Android 3.0才新增的API

文章

Android Drag and Drop - Tutorial

Android开发者指南-用户界面-拖放-Drag and Drop

下载

VogellaDraganddrop.zip

结束

欢迎交流!想做成拖动插入时自动两边挤开的效果,没弄出来,出来是抖动的效果。

【Android】HorizontalScrollView内子控件横向拖拽的更多相关文章

  1. ToolStrip控件左右拖拽移动效果实现

    1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位.2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1/ ...

  2. PyQt5控件支持拖拽方法

    让控件支持拖拽动作A.setDragEnable(True) 设置A可以拖动B.setAcceptDrops(True) 设置B可以接受拖动B需要满足两个事件1.dragEnterEvent 将A拖到 ...

  3. Android自定义组合控件内子控件无法显示问题

    今天自定义了一个组合控件,与到了个奇葩问题: 我自定义了一个RelativeLayout,这个layout内有多个子控件.但奇怪的是这些子控件一直显示不出来.调试了一下午,竟然是因为在获取(infla ...

  4. Android 应用内悬浮控件实践总结

    在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...

  5. 【C#/WPF】UI控件的拖拽/拉伸

    需求①:控件拖拽——按住鼠标,可自由拖拽控件. 方法:目前看到的办法有两种. 使用ZoomableCanvas:http://www.cnblogs.com/gnielee/archive/2011/ ...

  6. 怎样在delphi中实现控件的拖拽

    下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...

  7. WPF 实现控件间拖拽内容

    想实现这样一个常用功能:在ListBox的一个Item上点住左键,然后拖拽到另外一个控件(如ListView中),松开左键,数据已经拖拽过来. 步骤如下: 1. 设置ListBox 的AllowDro ...

  8. winform上控件的拖拽小结

    这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考. 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西. 事件: It ...

  9. C#开发PACS医学影像处理系统(九):序列控件与拖拽

    1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1 ...

随机推荐

  1. npm总结

    1.npm install -g 模块               全局安装                 2.npm install 模块@version      安装具体摸个版本的模块     ...

  2. input file 图片上传

    使用第三方:jquery.ajaxfileupload.jsinput中的name根据后端来定 <form method="post" enctype="multi ...

  3. 泛型容器单元(Generics.Collections)[2]: TQueue&lt;T&gt; 队列列表

    TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出. TQueue 主要有三个方法.一个属性:Enqueue(入列).Dequeue(出列).Pee ...

  4. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  5. [Stephen]页面实现瀑布流源码

    项目中使用到的瀑布流代码 @using tZ.Pms.Biz @using tZ.Mvc.Base @model IPageInfo @{ ViewBag.Title = Model.WebTitle ...

  6. 【原创】Mac上编译Hadoop1.0.3出现的一些问题

    create-native-configure: [exec] configure.ac:47: error: possibly undefined macro: AC_PROG_LIBTOOL [e ...

  7. find the safest road(floyd)

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission ...

  8. 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序

    1:访问修饰符 private     同类中 默认        同类        同包 protect    同类         同包      子类 public     同类        ...

  9. topcoder srm 705 div1 -3

    1.设有一个字母表$T$,对于一个单词$w$,若对于任意的$0\leq i< |w|-1$,满足$w_{i}$在$T$中的排名小于等于$w_{i+1}$在$T$中的排名,则称$s$在$T$中是合 ...

  10. java骰子求和算法

    //扔 n 个骰子,向上面的数字之和为 S.给定 Given n,请列出所有可能的 S 值及其相应的概率public class Solution { /** * @param n an intege ...