参考链接:

http://blog.csdn.net/chunqiuwei/article/details/50679568#

http://blog.csdn.net/zly921112/article/details/50436538

view滑动种类:

1.根据layout()方法来产生滑动

xml代码 (下面的布局也是这个一样的)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <study.view.com.viewstudy.DragView
android:id="@+id/dv"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#000" /> </LinearLayout>

java部分(包含计算出偏移量)

 1 package study.view.com.viewstudy;
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.view.MotionEvent;
6 import android.view.View;
7
8
9 public class DragView extends View {
10
11
12 public DragView(Context context) {
13 this(context, null);
14 }
15
16 public DragView(Context context, AttributeSet attrs) {
17 this(context, attrs, 0);
18 }
19
20 public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
21 super(context, attrs, defStyleAttr);
22 init(context);
23 }
24
25 private void init(Context context) {
26 }
27
28
29 private int startX;
30 private int startY;
31
32 @Override
33 public boolean onTouchEvent(MotionEvent event) {
34 int x = (int) event.getX();//表示相对于当前View的x
35 int y = (int) event.getY();//表示相对于当前View的y
36 switch (event.getAction()) {
37 /**
38 *
39 MotionEvent中的方法
40 getX()获取点击位置距离当前View左边的距离
41 getY()获取点击位置距离当前View上边的距离
42 getRawX()获取点击位置距离屏幕左边的距离
43 getRawY()获取点击位置距离屏幕上边的距离
44 */
45 case MotionEvent.ACTION_DOWN:
46 startX = x;
47 startY = y;
48 break;
49 case MotionEvent.ACTION_MOVE:
50 int distanceX = x - startX;
51 int distanceY = y - startY;
52 /**
53 layout()中的方法
54 getTop()获取到的是View自身顶边到父布局顶边的距离
55 getBottom()获取到的是View自身底边到父布局顶边的距离
56 getLeft()获取到的是View自身左边到父布局左边的距离
57 getRight()获取到的是View自身右边到父布局左边的距离
58 */
59 layout(
60 getLeft()+distanceX,
61 getTop()+distanceY,
62 getRight()+distanceX,
63 getBottom()+distanceY
64 );
65 break;
66 case MotionEvent.ACTION_UP:
67
68
69 break;
70 }
71 return true;
72 }
73
74
75 }

2.offsetLeftAndRight(),offsetTopAndBottom()实现

计算出偏移量后只需要下面代码即可

offsetLeftAndRight(distanceX);
offsetTopAndBottom(distanceY);

3.view本身是不滑动的,滑动的是view的内容。view利用其view类内自带的方法scrollTo和ScrollBy来实现滑动

scrollTo()移动到某点,scrollBy()移动的偏移量 (把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 scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);

java部分

 package study.view.com.viewstudy;

 import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View; public class DragView extends View { public DragView(Context context) {
this(context, null);
} public DragView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
} private void init(Context context) {
} private int startX;
private int startY; @Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();//表示相对于当前View的x
int y = (int) event.getY();//表示相对于当前View的y
switch (event.getAction()) {
/**
*
MotionEvent中的方法
getX()获取点击位置距离当前View左边的距离
getY()获取点击位置距离当前View上边的距离
getRawX()获取点击位置距离屏幕左边的距离
getRawY()获取点击位置距离屏幕上边的距离
*/
case MotionEvent.ACTION_DOWN:
startX = x;
startY = y;
break;
case MotionEvent.ACTION_MOVE:
int distanceX = x - startX;
int distanceY = y - startY;
//修改的地方
((View)getParent()).scrollBy(-distanceX,-distanceY);
break;
case MotionEvent.ACTION_UP: break;
}
return true;
} }

4.利用动画,让view产生滑动效果

java代码部分

 package study.view.com.viewstudy;

 import android.animation.ObjectAnimator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button bt = (Button) findViewById(R.id.bt);
final TextView tv = (TextView) findViewById(R.id.tv);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv,"translationX",300);
objectAnimator.setDuration(2000).start(); }
});
}
}

xml部分

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity"> <TextView
android:id="@+id/tv"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#f00" /> <Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我" /> </LinearLayout>

  

5.通过动态的修改LayoutParams的margin等属性让View来产生滑动

计算出偏移量(下面有计算代码)

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
lp.topMargin = getTop()+distanceY;
lp.leftMargin = getLeft() + distanceX;
setLayoutParams(lp);

6.Scroller实现(Scroller是将一次较长的滑动,按一定时间分成多次较小的滑动实现视觉上的弹性滑动)

基于上面代码

 package study.view.com.viewstudy;

 import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;
import android.widget.TextView; @SuppressLint("AppCompatCustomView")
public class DragView extends TextView { private Scroller scroller; public DragView(Context context) {
this(context, null);
} public DragView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
} private void init(Context context) {
scroller = new Scroller(context);
} @Override
public void computeScroll() {
super.computeScroll();
if(scroller.computeScrollOffset()){
((View)getParent()).scrollTo(scroller.getCurrX(),scroller.getCurrY());
invalidate();//这里不断的递归修改坐标形成视觉上的弹性滑动
}
} private int startX;
private int startY; @Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();//表示相对于当前view的x
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = x;
startY = y;
break;
case MotionEvent.ACTION_MOVE:
int distanceX = x - startX;
int distanceY = y - startY;
((View)getParent()).scrollBy(-distanceX, -distanceY); break;
case MotionEvent.ACTION_UP:
View parent = (View) getParent();
scroller.startScroll(
parent.getScrollX(),
parent.getScrollY(),
-parent.getScrollX(),
-parent.getScrollY());
invalidate();//这里调用了就会触发ondraw()然后会调用computeScroll()方法
break;
}
return true;
} }

View的滑动原理和多种滑动方法的更多相关文章

  1. Appium python自动化测试系列之页面滑动原理讲解(十)

    10.1.1 页面滑动原理分析 在页面滑动查找章节我们就讲了滑动的知识点,只是不知道大家是否有认真练习以及去理解,如果你认真练习.理解了那么我相信这一章节的东西不用看也能够完成,下面我们还是简单分析一 ...

  2. 透过 NestedScrollView 源码解析嵌套滑动原理

    NestedScrollView 是用于替代 ScrollView 来解决嵌套滑动过程中的滑动事件的冲突.作为开发者,你会发现很多地方会用到嵌套滑动的逻辑,比如下拉刷新页面,京东或者淘宝的各种商品页面 ...

  3. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  4. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  5. Android自定义View实战(SlideTab-可滑动的选择器)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52178553 本文出自:[openXu的博客] 目录: 初步分析重写onDraw绘制 重写o ...

  6. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  7. jquery 连写注释;siblings() 方法;jQuery 的3种滑动方法;slideUp()向上滑动;slideDown()向下滑动;slideToggle()来回滑动

    首先我们看两个连写注释 第一个:   /* 点击头像,显示基本资料 */ $(".f-chatTit a.avatar").click(function(){ $(this).hi ...

  8. 同ListView该接口无法通过手势滑动左右切换界面问题解决方法

    同ListView该接口无法通过手势滑动左右切换界面问题解决方法 问题描写叙述: 在做OnGestureListener滑动切换窗体的时候,会遇到这种问题.就是当界面中含有ListView的时候.On ...

  9. Android艺术开发探索第四章——View的工作原理(上)

    这章就比较好玩了,主要介绍一下View的工作原理,还有自定义View的实现方法,在Android中,View是一个很重要的角色,简单来说,View是Android中视觉的呈现,在界面上Android提 ...

随机推荐

  1. UNIX环境高级编程------apue.h找不到

    运行1-3代码时,出现问题:apue.h 没有找到问题 1.去此网址下载源码: http://www.apuebook.com/code3e.html 压缩包名为:src.3e.tar.gz 2.解压 ...

  2. 宽域POST提交数据

    小数据宽域可以使用jsonp,但是大数据跨域必须post那么有以下2种方式 1,传统方式 动态生成form var url = ''var $iframe = $("<iframe s ...

  3. laravel框架5.5 连接redis和redis集群

    'redis' => [ 'client' => 'predis', 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1 ...

  4. 苹果CMS

    本篇将主要讲解使用过程中普遍遇到的“问题”,这些问题并非是BUG,通常是需要我们自己去注意的一些点.(会结合用户反馈持续补充)http://www.maccms.com/doc/v10/faq.htm ...

  5. MyEclipse使用总结——MyEclipse安装maven插件[转]

    打开 myeclipse, MyEclipse -->  Preferences -->Maven4MyEclipse 确定jdk是可用的 选择自己安装的maven: 点击Add选中我们的 ...

  6. centos7 安装 python3

    sudo yum -y groupinstall "Development tools" sudo yum -y install zlib-devel bzip2-devel op ...

  7. Python学习day23-面向对象的编程

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. Open CASCADE Technology: IGES Support

    2015/6/4 Open CASCADE Technology: IGES Support http://www.opencascade.org/doc/occt­6.7.0/overview/ht ...

  9. springboot新增jsp的支持

    一.添加依赖 <!-- 添加对jsp的支持 --> <!-- web 依赖 --> <dependency> <groupId>org.springfr ...

  10. 自动化运维工具Ansible工具

    目录 一.初识Ansible 二.Ansible的架构 三.Ansible基础使用 安装 主机清单 管理主机 四.Ansible用脚本管理主机 五.Ansible模块Module 六.Ansible常 ...