参考链接:

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. 对this的理解与总结

    this既不指向函数自身,也不指向函数的词法作用域!它指向谁完全取决于它在哪里被调用,被谁调用! 绑定规则 总体来说,this的绑定规则有: 默认绑定(严格模式/非严格模式) 隐式绑定 显式绑定 ne ...

  2. [JZOJ5233] 【GDOI模拟8.5】概率博弈

    题目 题目大意 给你一棵树,这棵树上的所有叶子节点的权值是随机的排列. 两个人博弈,从根开始,轮流往下走. 先手希望权值最大,后手希望权值最小. 问期望的最终结果. 思考历程 这场比赛实在是太丧心病狂 ...

  3. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  4. thinkPHP 字段映射功能

    thinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能,假设我们的User表里面有username和email字段,我们需要映射成另外的字段,定义方式 ...

  5. 暑期集训日志(Day0~Day5)

    章·五:2019-07-15:明月不谙离恨苦,斜光到晓穿朱户 ·昨日小结: 昨天考试又是爆零边缘,除了难过就剩难过了. T1暴力打崩了只拿了5分. T2没给分时间.最后20分钟打了个残码.没仔细观察数 ...

  6. 关于iosselectjs插件设置同步值的操作实践

    关于移动端选择器的插件选择百度可以搜到很多,之前用过iosselect.js(https://github.com/zhoushengmufc/iosselect)感觉还不错,比mobiscorll. ...

  7. VS2010-MFC(MFC应用程序框架分析)

    转自:http://www.jizhuomi.com/software/145.html 一.SDK应用程序与MFC应用程序运行过程的对比 程序运行都要有入口函数,在之前的C++教程中都是main函数 ...

  8. Oracle的UTL_FILE.FOPEN学习笔记

    Oracle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件. UTL_FILE.FOPEN(location in varchar2, filename in va ...

  9. CAS添加验证码功能

    1.  cas.war 下面的web-inf/web.xml  lib添加  kaptcha.jar kaptcha.jar通过maven获取 <dependency> <group ...

  10. Gym - 100543L

    Gym - 100543Lhttps://vjudge.net/problem/153854/origin区间dp,要从区间长度为1开始dp #include<iostream> #inc ...