0. 前言  

Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验。一般View的滑动可以用三种方式实现。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373

1.   ScrollTo/ScrollBy

View提供了ScrollTo/ScrollBy专门用于View滑动,前者作用是将View的左上角坐标置为设定值,后者看下面源码可以看出,实现的是基于当前位置的相对滑动。源码展示如下:

 public void scrollTo(int x, int y) {//滑动目标点坐标
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
} public void scrollTo(int x, int y){
scrollTo(mScrollX + x, mScrollY + y);
}

这里需要注意的是,View的两个属性mScrollX、mScrollY,分别可通过getScrollX和getScrollX方法获得。

考虑一种情境,我们需要滑动一副充满屏幕的图片,如果手指向左滑,图片已经滑出左侧屏幕,左上角横坐标已经为负了,但是我们在处理滑动的onScroll()中,其参数distanceX是正的,同时mScrollX值也是正的,这和我们平时知道的屏幕坐标系是相反的。Y轴也一样是反的 。

那么我们使用onScroll和scrollBy来实现手指滑动图片的效果:

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
scrollBy((int) distanceX, 0);
return true;
}

总结:

(1)简单方便,不会影响元素单击事件。

(2)scrollTo()和scrollBy()移动的只是View的内容,并不能移动View本身,背景当然也是不移动的。

2.    动画

动画可以实现非常复杂的动画效果,当然也可以实现View滑动的效果,原理是改变translationX、translationY的值。使用属性动画实例如下,View动画的例子略:

//使用属性动画,将View在1秒内向右平移50个像素
ObjectAnimator.ofFloat(mView, ""translationX", 0 , 50).setDuration(1000).start();

需要注意的是,View动画有一个显著的缺点,那就是只对View的影像做操作,不会真正改变View的位置参数,因此可能对滑动后的新位置Button的点击事件失去响应。在系统眼里,这个Button没有发生任何改变。

但是Android3.0以后属性动画解决了这个问题,3.0以下的可以通过设置两个按钮,并在恰当的时刻通过view.setVisibility间接解决该问题。

在动画的进行过程中,我们还可以设置监听器监听动画完成每一帧时,动画完成的比例。这样我们就可以完成更多的业务逻辑。

animator.addUpdateListener(new AnimatorUpdateListener(){
//动画完成一帧即回调
@override
public void onAnimationUpdate(ValueAnimator animator){
//获取动画完成比例
float faction = animator.getAnimatedFraction();
//完成其他效果
}
});

3.    改变布局参数

改变布局参数的方式,使用起来比较麻烦,因为需要具体情况具体实现。但是它是一种非常灵活的方法。具体理解起来也不难,原理就是改变控件的LayoutParams。

使用举例:

//将按钮右移100像素的例子
MarginLayoutParams params = (MarginLayoutParams)mButton.getLayoutParams();
params.leftMargin += 100;
mButton.setLayoutParams(params);

至此对于如何实现View滑动的三种方式整理完毕

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373

Android开发——View滑动的三种实现方式的更多相关文章

  1. Android开发——View滑动冲突解决方案

    0. 前言   我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...

  2. Android 沉浸式状态栏的三种实现方式

    沉浸式状态栏 Google从android kitkat(Android 4.4)開始,给我们开发人员提供了一套能透明的系统ui样式给状态栏和导航栏,这种话就不用向曾经那样每天面对着黑乎乎的上下两条黑 ...

  3. Android开发_Android数据的四种存储方式

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  4. Android增加监听的三种实现方式

    在Android中,为一个按钮增加监听的方式有五种 1.匿名内部类 @Override protected void onCreate(Bundle savedInstanceState) { sup ...

  5. 详解实现Android中实现View滑动的几种方式

    注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class) ...

  6. [Android UI]View滑动方式总结

    一.前言 在上一篇文章,介绍了View的坐标等基础知识,有了基础知识后,对下面内容的理解也将会容易很多.那么本文介绍的是View滑动的几种方式,这对于View来说,也是需要重要掌握的内容,因为用户无时 ...

  7. 【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发 ...

  8. droid开发中监听器的三种实现方法(OnClickListener)

    Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般 ...

  9. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

随机推荐

  1. Angular JS + Express JS入门搭建网站

    3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...

  2. Selenium 元素查找

    1.尽量使用ID或者name去定位元素,如果这个元素没有ID或者Name,那么就是用它最近的父节点的ID或者Name去定位. 2.写自动化脚本不是一个人的事情,是一个团队的事情,合作能更好,更轻松得完 ...

  3. SQL varchar转float实现数字比较

    select * from table where cast('经纬度' as float ) < 90

  4. myeclipse 10 创建webservice

    java 快捷创建webservice 收集一下,方便一下查阅 详情去看一下这个老哥,里面写得非常详细: http://hyan.iteye.com/ -- http://www.cnblogs.co ...

  5. vi使用命令

    二.移动光标类命令 h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行 ...

  6. iOS开发:小技巧积累

    1.获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] ...

  7. 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)

    点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...

  8. 高精度进位制转换,Poj(1220)

    转自ACdream. #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXS ...

  9. vue中的js动画与Velocity.js结合

    vue里面除了用css写动画,还可以用js写动画,vue的transition中,定义了几个动画钩子 第一个动画钩子:@before-enter <div id='app'> <tr ...

  10. 宝塔linux面板,修改root密码

    root,密码忘记了.但宝塔vps的密码没忘记... 翻完宝塔linux面板都没看到有修改系统root密码的选项,后来尝试定时任务shell,也没成功, 最终快绝望的时候,发现通过添加插件成功修改密码 ...