android中实现view可以滑动的六种方法
2015-11-22 10:59
423 查看
在android开发中,经常会遇到一个view需要它能够支持滑动的需求。今天就来总结实现其滑动的六种方法。其实每一种方法的
思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果。
一、通过Layout方法来实现滑动
如果你将滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。
这就是利用Layout方法实现滑动的核心思路。我们来看一下代码:
新建项目,然后自定义一个view,代码如下:
核心代码就是onTouchEvent方法了。代码很简单,无非就是记录手指的上次坐标与下次坐标,然后将前后移动的增量传递给layout方法而已。
值得注意的是,onTouchEvent的返回值为true,表示我们要成功消化掉这个触摸事件。
然后再修改activity_main.xml的代码,将这个view装到布局里,如下:
现在来运行程序。效果如下:
效果还可以吧。可以自由的滑动了。
其实上面我们用getX()和getY()获得的是在视图坐标系中的值。其实我们也可以使用绝对坐标,即使用getRawX()和getRawY()获得的值
来实现这个滑动效果。修改DragView中的onTouchEvent中的代码,如下所示:
一定注意,此时不同的是,在move过程中,我们要及时改变lastX,与lastY的值来获取正确的之前坐标(因为是在Android坐标系嘛,用的是绝对距离)。
此时再次运行程序,效果跟上图一样。
二、offsetLeftAndRight()和offsetTopAndBottom()方法来实现
其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。此时将DragView中的onTouchEvent代码简单替换即可,如下:
红色部分就是关键代码了,运行一下程序,跟上面的效果是一样的,不再贴图。
三、使用LayoutParams来实现
依旧修改DragView的onTouchEvent代码,如下:
红色部分依旧是关键代码。注意这里我们一般通过改变view的Margin属性来改变其位置的。
运行程序,结果依旧,不再贴图。
四、通过scrollTo和scrollBy方法
在一个view中,系统也提供了scrollTo和scrollBy方法来移动view。很好理解,sceollTo(x,y)传入的应该是移动的终点坐标,而scrollBy(dx,dy)传入的是
移动的增量。这两个方法要在view所在的viewGroup中使用!但是一定要注意:通过scrollBy传入的值应该是你需要的那个增量的相反数!这样子才能达到你想
要的效果!!切记切记
依旧是hi修改DragView的onTouchEvent代码,如下:
红色部分为修改的核心代码,运行一下,效果依旧,不再贴图。
限于篇幅,请保存好这些代码,在下一篇文章中仍旧在此基础上编写。未完待续....
点击下面链接,查看滑动的第五种方法:
/article/6123663.html
思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果。
一、通过Layout方法来实现滑动
如果你将滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。
这就是利用Layout方法实现滑动的核心思路。我们来看一下代码:
新建项目,然后自定义一个view,代码如下:
package com.example.testdragview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class DragView extends View{ private int lastX; private int lastY; public DragView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public DragView(Context context, AttributeSet attrs) { super(context, attrs); } public DragView(Context context) { super(context); } public boolean onTouchEvent(MotionEvent event) { // Log.d("付勇焜----->","TouchEvent"); // Log.d("付勇焜----->",super.onTouchEvent(event)+""); //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; //调用layout方法来重新放置它的位置 layout(getLeft()+offX, getTop()+offY, getRight()+offX , getBottom()+offY); break; } return true; } }
核心代码就是onTouchEvent方法了。代码很简单,无非就是记录手指的上次坐标与下次坐标,然后将前后移动的增量传递给layout方法而已。
值得注意的是,onTouchEvent的返回值为true,表示我们要成功消化掉这个触摸事件。
然后再修改activity_main.xml的代码,将这个view装到布局里,如下:
<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" > <com.example.testdragview.DragView android:layout_width="100dp" android:layout_height="100dp" android:background="#FF0000" /> </LinearLayout>
现在来运行程序。效果如下:
效果还可以吧。可以自由的滑动了。
其实上面我们用getX()和getY()获得的是在视图坐标系中的值。其实我们也可以使用绝对坐标,即使用getRawX()和getRawY()获得的值
来实现这个滑动效果。修改DragView中的onTouchEvent中的代码,如下所示:
public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; //调用layout方法来重新放置它的位置 layout(getLeft()+offX, getTop()+offY, getRight()+offX , getBottom()+offY); lastX = x; lastY = y; break; } return true; }
一定注意,此时不同的是,在move过程中,我们要及时改变lastX,与lastY的值来获取正确的之前坐标(因为是在Android坐标系嘛,用的是绝对距离)。
此时再次运行程序,效果跟上图一样。
二、offsetLeftAndRight()和offsetTopAndBottom()方法来实现
其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。此时将DragView中的onTouchEvent代码简单替换即可,如下:
public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; offsetLeftAndRight(offX); 23 offsetTopAndBottom(offY); break; } return true; }
红色部分就是关键代码了,运行一下程序,跟上面的效果是一样的,不再贴图。
三、使用LayoutParams来实现
依旧修改DragView的onTouchEvent代码,如下:
public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; 22 ViewGroup.MarginLayoutParams mlp = 23 (MarginLayoutParams) getLayoutParams(); 24 25 mlp.leftMargin = getLeft()+offX; 26 mlp.topMargin = getTop()+offY; 27 28 setLayoutParams(mlp); 29 break; } return true; }
红色部分依旧是关键代码。注意这里我们一般通过改变view的Margin属性来改变其位置的。
运行程序,结果依旧,不再贴图。
四、通过scrollTo和scrollBy方法
在一个view中,系统也提供了scrollTo和scrollBy方法来移动view。很好理解,sceollTo(x,y)传入的应该是移动的终点坐标,而scrollBy(dx,dy)传入的是
移动的增量。这两个方法要在view所在的viewGroup中使用!但是一定要注意:通过scrollBy传入的值应该是你需要的那个增量的相反数!这样子才能达到你想
要的效果!!切记切记
依旧是hi修改DragView的onTouchEvent代码,如下:
public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; ((View) getParent()).scrollBy(-offX,- offY); break; } return true; }
红色部分为修改的核心代码,运行一下,效果依旧,不再贴图。
限于篇幅,请保存好这些代码,在下一篇文章中仍旧在此基础上编写。未完待续....
点击下面链接,查看滑动的第五种方法:
/article/6123663.html
相关文章推荐
- Android Activity生命周期以及Fragment生命周期的区别与分析
- Android setLayerType 硬件加速问题
- Android属性动画---Property Animation
- android109 结构体,联合体,枚举,自定义
- Android的一些总结
- Android按钮单击事件的四种常用写法总结
- android中接口回调机制
- android108 内存分配
- github android优秀的开源项目、作者推荐
- Android 多媒体之music之舞
- [Android]百度地图初使用(3)
- [Android]百度地图初使用(2)
- [Android]百度地图初使用(1)
- android studio 中使用aidl
- android 蓝牙开发
- Android自定义ScrollView实现一键置顶功能
- Android的材料设计兼容库(Design Support Library)
- android直接读取数据库文件
- android 5.0 -- Activity 过渡动画
- Android ADB命令大全