[Android-Demo]Android View的拖动
↑
请善用目录
Demo下载地址:http://download.csdn.net/detail/u011634756/5959637 (免积分哦~)
-----------------------------华丽的分割线---------------------------------
一. 骨头
1. view的拖动首先我们的获取拖动的坐标即 : onTouchEvent 事件
2. 坐标获取到了,那么我们需要把坐标给实现 即: View.layout(left, top, right, bottom);
3. 在实现这个坐标的时候我们的有一个小小的逻辑 即: 移动的距离和坐标的转换
二. 肉
1. OnTouchListener 这个的实现就不赘述了
2. 讲一下View.layout(left, top, right, bottom) 这四个参数
从上图中可以很清晰的看到 left, top, right, bottom 4个分别是对应的是和父View的距离。
为了证明我们说的是对的,这里我们的demo中进行了研究
当固定X轴的时候 ,也就是 left = 0 right = view的宽度
v.layout(0, top, v.getWidth(), bottom);当拖动的时候一直是在方框的最左边一直在上下移动
当固定Y轴的时候 , 也就是 top = 0 ; bottom= view的高度
v.layout(left, 0, right, v.getHeight());当拖动的时候一直是在方框的最顶端左右移动
注意: 我们的父组件是那个方框 上下左右都有空隙的哦, 大家一定要哈下满的getRawX 区分开来
3. 小逻辑
在拖动的时候 我们有一个MotionEvent.getX()和 MotionEvent.getRawX() ,这个应该也有好多小伙伴不明白,下面上图讲述看一下
结论:getX是获取以widget左上角为坐标原点计算的X轴坐标直.
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.在详细一点可以去这个博文看一下
4. 主要的源码
/**
* onTouchEvent的监听事件,
* 拖动的主要实现方法
* @author yuhaiyang
*/
private class MyOnTouchListener implements OnTouchListener{ /**
* 这有一点要说明的是 ****小理解点*******
* 1. event.getX : 是以 widget(控件) 的左上角 为 原点的 X坐标
* event.getRawX() : 是以 屏幕左上角 为原点的 X坐标
* 2. View.layout(left, top, right, bottom);
* left : 控件左端以 父 控件的 左上角为原点的X坐标
* top : 控件顶端以 父 控件的 左上角为原点的Y坐标
* right : 控件右端以 父 控件的 左上角为原点的X坐标
* bottom : 控件底端以 父 控件的 左上角为原点的Y坐标
* 这个地方如果不明白会在博客上图说明。
*/ @Override
public boolean onTouch(View v, MotionEvent event) {
/**
* 这个地方的逻辑是:
* 在 down 的时候记录一下距离屏幕左上角的距离
* 然后move的时候来再来计算一下距离
* 2着的差值就是分别 x轴和y轴移动的距离
*/
switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
// 按下的时候距离屏幕左上角的距离
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE :
// 移动的时候距离屏幕左上角的距离
int nowX = (int)event.getRawX();
int nowY = (int)event.getRawY();
// X轴和Y轴移动的距离
int moveX = nowX - lastX;
int moveY = nowY -lastY;
// 分别计算距离
int top = v.getTop() + moveY;
int bottom = v.getBottom() + moveY;
int left = v.getLeft() + moveX;
int right = v.getRight() + moveX; // 这个地方是控制 那个轴固定的的
if(mFix == FIX_X){
v.layout(0, top, v.getWidth(), bottom);
}else if (mFix == FIX_Y){
v.layout(left, 0, right, v.getHeight());
}else{
v.layout(left, top, right, bottom);
} lastX = (int) event.getRawX();
lastY = (int) event.getRawY(); break;
case MotionEvent.ACTION_UP:
break;
}
return false;
} }
5. 效果图
====================关注小鱼===================
新浪微博:http://weibo.com/AwareMissing
腾讯微博:http://t.qq.com/y_haiyang
[Android-Demo]Android View的拖动的更多相关文章
- Android Demo Android ActionBarCompat-ListPopupMenu
示例显示如何使用v7 appcompat库中的PopupMenu显示弹出式菜单.主界面使用V4支持库的ListFragment显示数据列表,当点击列表子项时,在子项下方弹出下拉菜单,并通过设置setO ...
- 【Android Demo】悬浮窗体实现
突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager ...
- android开源项目---View篇
本文转载自:http://blog.csdn.net/likebamboo/article/details/19080739 主要介绍那些不错个性化的View,包括ListView.ActionBar ...
- BNR Android Demo学习笔记(一)——CrimeIntent
开发环境:win7,Android Studio 1.2, 1.Model Crime,数据模型,每个Crime有一个UUID作为唯一标识. package tina.criminalintent; ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- android中实现view可以滑动的六种方法续篇(二)
承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- Android的自定义View及View的绘制流程
目标:实现Android中的自定义View,为理清楚Android中的View绘制流程“铺路”. 想法很简单:从一个简单例子着手开始编写自定义View,对ViewGroup.View类中与绘制View ...
- 详解实现Android中实现View滑动的几种方式
注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class) ...
随机推荐
- 原生DOM选择器querySelector和querySelectorAll
在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...
- [水煮 ASP.NET Web API2 方法论](12-1)创建 OData
问题 怎样用在 Web API 中创建 OData 服务. 解决方案 对于我们来说,在 Web API 中使用 OData最简单的方式就是使用 ASP.NET 模板来创建Odata Controlle ...
- 微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇
一.独立验证器 我上篇中我将AndCompositeValidator和OrCompositeValidator归为独立验证器,这2个验证器主要是为了第一类验证服务,可以进行多种验证组合在一起进行复杂 ...
- [js] 数据结构
var dic = {"127.0.0.1":{"1440":[["keyx","keyy","clix&qu ...
- Maven实用总结
使用Maven还是推荐IDEA,以前用eclipse总是喜欢出现乱七八糟的问题,具体错误和解决方案也记不清楚了. 下面总结下IDEA中遇到的问题和解决方法: 与IDEA搭配的相关问题 如何根据模板快速 ...
- HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- poj 1068(模拟题)
Parencodings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23545 Accepted: 13802 De ...
- 手机发送验证码—.net代码
注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...
- [Atcoder Regular Contest 065] Tutorial
Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/ ...
- BZOJ 3437 小P的牧场(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3437 [题目大意] n个牧场排成一行,需要在某些牧场上面建立控制站, 每个牧场上只能建 ...