[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) ...
随机推荐
- 【JBPM4】流程分支fork - join
流程分支.聚合.流程每个分支节点都全部处理完成后,聚合到下一个节点. JPDL <?xml version="1.0" encoding="UTF-8"? ...
- Python 从基础------进阶------算法 系列
1.简介 关 ...
- Nginx+PHP “No input file specified”错误的解决办法
配置官网商城php网站时候,界面报错“No input file specified” 原理: 任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在. PHP文件 ...
- ngCordova安装配置使用教程
ngCordova是什么 ngCordova是在Cordova Api基础上封装的一系列开源的AngularJs服务和扩展,让开发者可以方便的在HybridApp开发中调用设备能力,即可以在Angul ...
- 用jquery实现文章自动生成二级目录(续)
前文:用jquery实现文章自动生成二级目录. 使用方法的补充 我们可以把我们的js和css上传到博客园,然后在页面HTML代码中使用他们. 发现的一些问题 在我把我的js放到自己的博客园上运行之后发 ...
- RabbitMQ (十一) 消息确认机制 - 消费者确认
由于生产者和消费者不直接通信,生产者只负责把消息发送到队列,消费者只负责从队列获取消息(不管是push还是pull). 消息被"消费"后,是需要从队列中删除的.那怎么确认消息被&q ...
- 设计模式-状态模式(State Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态, ...
- Beaglebone Black教程项目1闪烁板载LED
Beaglebone Black教程项目1闪烁板载LED 项目1闪烁板载LED 当设置完你的Beaglebone Black的时候,可能早就非常期待你的第一个项目了.下面就来满足大家的愿望,当然,这个 ...
- Redux-react connect 源码自己重写
import Counter from '../components/Counter'; import { increment, decrement, incrementIfOdd, incremen ...
- 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)
1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...