【Android】HorizontalScrollView内子控件横向拖拽
前言
网上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
下载
结束
欢迎交流!想做成拖动插入时自动两边挤开的效果,没弄出来,出来是抖动的效果。
【Android】HorizontalScrollView内子控件横向拖拽的更多相关文章
- ToolStrip控件左右拖拽移动效果实现
1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位.2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1/ ...
- PyQt5控件支持拖拽方法
让控件支持拖拽动作A.setDragEnable(True) 设置A可以拖动B.setAcceptDrops(True) 设置B可以接受拖动B需要满足两个事件1.dragEnterEvent 将A拖到 ...
- Android自定义组合控件内子控件无法显示问题
今天自定义了一个组合控件,与到了个奇葩问题: 我自定义了一个RelativeLayout,这个layout内有多个子控件.但奇怪的是这些子控件一直显示不出来.调试了一下午,竟然是因为在获取(infla ...
- Android 应用内悬浮控件实践总结
在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...
- 【C#/WPF】UI控件的拖拽/拉伸
需求①:控件拖拽——按住鼠标,可自由拖拽控件. 方法:目前看到的办法有两种. 使用ZoomableCanvas:http://www.cnblogs.com/gnielee/archive/2011/ ...
- 怎样在delphi中实现控件的拖拽
下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...
- WPF 实现控件间拖拽内容
想实现这样一个常用功能:在ListBox的一个Item上点住左键,然后拖拽到另外一个控件(如ListView中),松开左键,数据已经拖拽过来. 步骤如下: 1. 设置ListBox 的AllowDro ...
- winform上控件的拖拽小结
这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考. 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西. 事件: It ...
- C#开发PACS医学影像处理系统(九):序列控件与拖拽
1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1 ...
随机推荐
- QWebView在 Qt 5.x中编译出错:File not found: main.obj
错误现象 近日由于项目需要,想要学习一下QWebView的使用.于是简单的建立了一个Qt工程,并编写了如下代码: #include <QApplication> #include < ...
- Chrome开发者工具详解(3)-Timeline面板
Chrome开发者工具详解(3)-Timeline面板 注: 这一篇主要讲解面板Timeline,参考了Google的相关文档,主要用于公司内部技术分享.. Timeline面板 Timeline面板 ...
- dp --- hdu 4939 : Stupid Tower Defense
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- Android 添加桌面快捷方式操作
/** * 为程序创建桌面快捷方式 */ private void addShortcut(){ Intent shortcut = new Intent(“com.android.launcher. ...
- Web应用网络模型
Web应用网络模型 前言 这篇文章要介绍的是一个常见Web应用基本的过程跟网络模型,当然,对于多数的Client/Server应用也是适用的.延续这个系列文章的风格,只管通俗不管严谨. 概览 总体模型 ...
- 使用maven profile实现多环境可移植构建(转自CSDN)
使用maven profile实现多环境可移植构建 标签: maven profilemaven自动构建maven自动部署maven可移植构建持续集成 2014-04-25 23:37 26905人阅 ...
- 为vs2012添加背景和皮肤
每天对着电脑用VS进行编码开发,难免有点单调.我们可以试着像设置电脑桌面壁纸一样设置VS皮肤. 先看下效果 1.打开vs2012,工具——扩展和更新 2.选择联机,搜索并分别安装如下两个插件 3.安装 ...
- loadrunner11中java vuser引用jar包
1.创建工程,新建类,HelloWorld.java,代码如下: package com.liuke; public class HelloWorld { public String getHello ...
- SQL Server 行转列重温
转载自http://www.cnblogs.com/kerrycode/ 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER ...
- C#微信公众平台开发者模式开启代码
using System;using System.IO;using System.Text;using System.Web.Security; namespace HPZJ.Web.sys.exc ...