设为首页 加入收藏

TOP

Android中实现view可以滑动的六种方法
2015-12-01 14:11:43 来源: 作者: 【 】 浏览:4
Tags:Android 实现 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装到布局里,如下:


? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? >


? ? ? ? ? ? android:layout_width="100dp"
? ? ? ? android:layout_height="100dp"
? ? ? ? android:background="#FF0000" />



现在来运行程序。效果如下:



效果还可以吧。可以自由的滑动了。


其实上面我们用getX()和getY()获得的是在视图坐标系中的值。其实我们也可以使用绝对坐标,即使用getRawX()和getRawY()获得的值


来实现这个滑动效果。修改DragView中的onTouchEvent中的代码,如下所示:


?1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 ? ? xmlns:tools="http://schemas.android.com/tools"
3 ? ? android:layout_width="match_parent"
4 ? ? android:layout_height="match_parent"
5? ? >
6
7? ? <com.example.testdragview.DragView
8 ? ? ? ? android:layout_width="100dp"
9 ? ? ? ? android:layout_height="100dp"
10 ? ? ? ? android:background="#FF0000" />
11
12 LinearLayout>


一定注意,此时不同的是,在move过程中,我们要及时改变lastX,与lastY的值来获取正确的之前坐标(因为是在Android坐标系嘛,用的是绝对距离)。


此时再次运行程序,效果跟上图一样。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇shell基础:使用read、命令行脚本.. 下一篇Android中的坐标系以及获取坐标的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: