自定义随手指拖动的View

来源:互联网 发布:java多线程常用方法 编辑:程序博客网 时间:2024/04/29 23:27
项目中遇到一个可随意跟随手指拖动的电话按钮,网上一搜基本上都是,先在布局文件中写一个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

0 0
原创粉丝点击