自定义随手指拖动的View

项目中遇到一个可随意跟随手指拖动的电话按钮,网上一搜基本上都是,先在布局文件中写一个button或ImageView,然后找到这个控件,重写ontouch方法,并不是我想要的,然后就自定义一个可随手机拖动的View。
    我这里是集成ImageView写的,大家要使用时,可随意集成某个控件来写。其实也是很简单好实现的,原理就是重写控件本身onTouchEvent,然后在move方法中,让其跟随触摸拖动的动作滑动。 这里主要解决两个问题:①避免手指拖动时触发其点击事件问题;
    ② 滑出边缘的问题。

先看一下效果
这里写图片描述

  1. 为了避免滑出手机屏幕边界,首先要获取手机屏幕宽高

获取手机屏幕宽高的工具类

class ScreenUtils {
    /**
     * 获取手机屏幕大小
     * 
     * @author
     */

    public static int getWidth(Context context) {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.widthPixels;
    }

    /**
     * 高
     * 
     * @return
     */
    public static int getHeight(Context context) {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.heightPixels;
    }


- 自定义view最主要的部分,重写本身的onTouchEvent方法

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();
            movex = lastX;
            movey = lastY;
            break;
        case MotionEvent.ACTION_MOVE:
            dx = (int) event.getRawX() - lastX;
            dy = (int) event.getRawY() - lastY;

            int left = getLeft() + dx;
            int top = getTop() + dy;
            int right = getRight() + dx;
            int bottom = getBottom() + dy;
            if (left < 0) {
                left = 0;
                right = left + getWidth();
            }
            if (right > screenWidth) {
                right = screenWidth;
                left = right - getWidth();
            }
            if (top < 0) {
                top = 0;
                bottom = top + getHeight();
            }
            if (bottom > screenHeight) {

                bottom = screenHeight;
                top = bottom - getHeight();
            }

            layout(left, top, right, bottom);
            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();
            break;
        case MotionEvent.ACTION_UP:

            break;
        default:
            break;
        }
        return super.onTouchEvent(event);
    }
  • 一般这样这个自定义控件就能够跟随手机随意拖动了,但你要是添加点击事件后,拖动就会触发点击事件,这里就需要简单处理一下。

在MotionEvent.ACTION_UP中做下处理

case MotionEvent.ACTION_UP:
            //避免滑出触发点击事件
            if ((int) (event.getRawX() - movex) != 0
                    || (int) (event.getRawY() - movey) != 0) {
                return true;
            }
            break;

到这一个简单的自定义随手指随意拖动的ImageView就已经实现了!

资源路径:http://download.csdn.net/download/zane_xiao/9494690

猜你喜欢

转载自blog.csdn.net/zane_xiao/article/details/51188867