Android开发——View滑动的三种实现方式
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滑动的三种实现方式的更多相关文章
- Android开发——View滑动冲突解决方案
0. 前言 我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...
- Android 沉浸式状态栏的三种实现方式
沉浸式状态栏 Google从android kitkat(Android 4.4)開始,给我们开发人员提供了一套能透明的系统ui样式给状态栏和导航栏,这种话就不用向曾经那样每天面对着黑乎乎的上下两条黑 ...
- Android开发_Android数据的四种存储方式
Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...
- Android增加监听的三种实现方式
在Android中,为一个按钮增加监听的方式有五种 1.匿名内部类 @Override protected void onCreate(Bundle savedInstanceState) { sup ...
- 详解实现Android中实现View滑动的几种方式
注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class) ...
- [Android UI]View滑动方式总结
一.前言 在上一篇文章,介绍了View的坐标等基础知识,有了基础知识后,对下面内容的理解也将会容易很多.那么本文介绍的是View滑动的几种方式,这对于View来说,也是需要重要掌握的内容,因为用户无时 ...
- 【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发 ...
- droid开发中监听器的三种实现方法(OnClickListener)
Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般 ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
随机推荐
- 百度web应用诉讼费计算器
以前百度推开放平台的时候,利用jquery+jqueryUI做了一个诉讼费计算器,托管在BAE上.闲来无事,把代码和大家共享一下. 在百度搜索"诉讼费"相关的关键词就能看到: ...
- jupyter notebook 报错 ImportError: No module named matplotlib
解决办法: 打开Anaconda Prompt 列出conda环境: conda info --envs 结果显示: # conda environments: # tensorflow * D:\ ...
- 257. Binary Tree Paths (dfs recurive & stack)
Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...
- 【JavaScript 封装库】BETA 3.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- IOS 自定义代理delegate方法
创建一个自定义代理 @class MJTgFooterView; /** 1.协议名称: 控件类名 + Delegate 2.代理方法普遍都是@optional 3. */ @protocol MJT ...
- 引用类型(三):Function类型
一. Function类型函数实际上是对象.每个函数都是Function类型都实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象都指针.1.函数通常是使 ...
- chapter1-unions.py
#!/usr/bin/env python # _*_ coding:utf-8 _*_ from ctypes import * class barley_amount(Union): _field ...
- border-radius给元素加圆角边框
border-radius给元素加圆角边框 例: border-radius:20px; /*所有角都使用半径为20px的圆角*/ 实心圆: 把宽度(width)与高度(height)值设置为一致(也 ...
- nginx架构分析之 模块化
Nginx涉及到的模块分为核心模块.标准HTTP模块.可选HTTP模块.邮件服务模块以及第三方模块等五大类. 核心模块 核心模块是指Nginx服务器正常运行时必不可少的模块,它们提供了Nginx最基本 ...
- ThinkPHP 更新数据 save方法
ThinkPHP save() 方法 ThinkPHP 中使用 save() 方法来更新数据库,并且也支持连贯操作的使用. 例子: public function update(){ header(& ...