【Android】HorizontalScrollView内子控件横向拖拽

简介:

截图

   

代码

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( thisnew 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内子控件横向拖拽,如需转载请自行联系原博主。



目录
相关文章
|
5月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
75 3
|
4月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
59 0
|
6月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
8月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
288 2
|
7月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
63 0
|
8月前
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍
|
8月前
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
178 0
|
前端开发 API Android开发
|
3天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    32
  • 3
    Android历史版本与APK文件结构
    119
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    27
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    55
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    71
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    117
  • 10
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    29