自定义View--滚动View
实现这么一个效果,一个布局中有一个View,那个View会随着我们手指的拖动而滑动,这种效果该如何实现?
我们第一反应应该是自定义一个DragView类继承View,然后重写onTouchEvent()方法,然后根据我们手指滑动的轨迹来调整DragView的显示位置。没错,就是这个思路,下面我们来实现一下。
private float lastX;
private float lastY;
@Override
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
lastY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
float dx = event.getRawX() - lastX;
float dy = event.getRawY() - lastY;
//控制View移动的方法
move(dx, dy);
lastX = event.getRawX();
lastY = event.getRawY(); break; } return true; }
注意这里getRawX()和getX()的区别,Raw是“未经处理”的意思,getRawX()获取的是触点相对于整个屏幕的坐标,以屏幕左上角为原点。而getX()是经过处理后的坐标,aa也就是触点相对于当前View的坐标,是以View的左上角为坐标原点。
很简短的一段逻辑,记录手指每次移动的相对距离,然后调用move方法来移动控件,最后 return true代表这个控件消费了事件,如果不理解的同学需要先看这篇文章Android事件分发机制,来理解onTouchEvent是如何被调用的,然后再往下看。
接下来就是move方法的实现,我们实现View滑动的思路有3种:第1种就是改变View的属性,类似于属性动画的原理,可以看看这篇文章:Android动画原理;第2种是改变View的布局参数来实现滑动;第3种是使用View的scrollBy方法来实现滑动,我们先来看第一种的实现。
private void move(float dx, float dy) {
setTranslationX(getTranslationX()+dx);
setTranslationY(getTranslationY()+dy);
}
这里是依靠重新设置View的TranslationX属性值来实现滑动,我们看看效果。
效果还不错,我们试试另一种方法,就是改变布局来实现滑动
private void move(float dx, float dy) {
setLeft((int) (getLeft()+dx));
setRight((int) (getRight()+dx));
setTop((int) (getTop()+dy));
setBottom((int) (getBottom()+dy));
}
效果和上图一样。最后我们看用scrollBy()来实现的滑动
private void move(float dx, float dy) {
//这里要用负数,因为滑动的是布局的边框,正好和内容的滑动方向相反
int x = (int) -dx;
int y = (int) -dy;
this.scrollBy(x, y);
}
结果居然没有滑动效果!后来才知道,原来这个是滑动View的内容,而不是View本身。所以我们在View上画个小点就能看出来他是怎么工作的了。
果然,只有小点在随着滑动,也就是View的内容。所以我们有内容滑动的时候可以用srcollBy或者srcollTo,如果View本身要滑动上面两种方法是很好的选择。
代码地址:https://github.com/linghu88/mScrollview
自定义View--滚动View的更多相关文章
- Android Scroller简单用法 --View滚动
转:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中 ...
- Android自定义View4——统计图View
1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...
- Java注解(自定义注解、view注入)
注解这东西虽然在jdk1.5就加进来了,但他的存在还是因为使用Afinal框架的view注入才知道的.一直觉得注入特神奇,加了一句就可以把对应view生成了. 下面我们来认识一下注解这个东西 一.注解 ...
- Android 自定义View修炼-自定义弹幕效果View
一.概述 现在有个很流行的效果就是弹幕效果,满屏幕的文字从右到左飘来飘去.看的眼花缭乱,看起来还蛮cool的 现在就是来实现这一的一个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂 ...
- 自定义控制器的View(loadView)及其注意点
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!
一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...
- Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题
这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐 ...
- android显示通知栏Notification以及自定义Notification的View
遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /** * Show a notificat ...
- android 开发 View _1_ View的子类们 和 视图坐标系图
目录: android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览 android 开发 View _3_ View的属性动画ValueAnimator a ...
- iOS Programming View and View Hierarchy 视图和视图等级
iOS Programming View and View Hierarchy 视图和视图等级 1.1(1)File → New → Project.. From the iOS section, ...
随机推荐
- 【开源推荐】PredictionIO:构建预测功能的机器学习服务器
PredictionIO是一款开源的机器学习服务器,开发工程师和数据分析师可以使用它构建智能应用程序,并且还可以做一些预测功能,比如个性化推荐.发现内容等.好比开发者可以使用数据库服务器过滤信息. P ...
- oracle的热备份和冷备份
一.冷备份介绍: 冷备份数据库是将数据库关闭之后备份所有的关键性文件包括数据文件.控制文件.联机REDO LOG文件,将其拷贝到另外的位置.此外冷备份也可以包含对参数文件和口令文件的备份,但是这 ...
- 黄聪:Windows 64位系统中安装Android SDK“系统找不到指定的文件Java.exe”解决方法
明明已经在64位window7中安装好了64位版本的jdk,为什么android SDK安装程序却识别不到jdk呢?先看看报错: Java SE Development Kit (JDK) not f ...
- HDU 1358 Period (kmp判断循环子串)
Period Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- [置顶]
caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
由于虚拟机下的Ubuntu系统一般不包含GPU,故这次安装时为了在无GUP环境下运行caffe.所以只需安装CPU版本的caffe 由于本机是window10系统,所以想尝试caffe就在自己电脑上整 ...
- [maven] 实战笔记 - maven 安装配置
1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...
- MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
一.mongodb主从复制配置 主从复制是mongodb最常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活.可用于备份,故障恢复,读扩展等. 最基本的设置方式就是建立一个主节 ...
- 温故而知新-strtok函数
温故而知新-strtok函数 记得之前没见过这个函数,是把字符串分割成更小的字符串 来个例子就是比较鲜明了 $string = "Hello world. Beautiful day tod ...
- maven 编译解决jdk 版本问题
1.在父工程中pom 添加版本限制: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI ...
- sublime text3最新版本注册码(build 3143)
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...