简单的可拖动的ImageView,16/12/25 02

来源:互联网 发布:杭州市大数据局 编辑:程序博客网 时间:2024/05/17 02:59

功能一开始是需要在很多页面显示一个悬浮窗,后来改为只需要在主页显示,一开始还是用的自定义view发现完全没有必要,以下是一个简单的实现方法,只需要在清单文件中加一个ImageView,在监听触摸事件就可以了。

    private boolean isRiskMove;    private int mRiskLastX;    private int mRiskLastY;    /**     * 悬浮窗的触摸和点击事件     */    private void initFloatViewListener() {        mFloatRiskBtn.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                int x = (int) motionEvent.getRawX();                int y = (int) motionEvent.getRawY();                switch (motionEvent.getAction()) {                    case MotionEvent.ACTION_DOWN:                        break;                    case MotionEvent.ACTION_MOVE:                        isRiskMove = true;                        //计算距离上次移动了多远                        int deltaX = x - mRiskLastX;                        int deltaY = y - mRiskLastY;                        int translationX = (int) (mFloatRiskBtn.getTranslationX() + deltaX);                        int translationY = (int) (mFloatRiskBtn.getTranslationY() + deltaY);                        //使mFloatRiskBtn根据手指滑动平移                        mFloatRiskBtn.setTranslationX(translationX);                        mFloatRiskBtn.setTranslationY(translationY);                        break;                    case MotionEvent.ACTION_UP:                        //平移回到该view水平方向的初始点                        mFloatRiskBtn.setTranslationX(0);                        //判断什么情况下需要回到原点                        if(mFloatRiskBtn.getY()<0 || mFloatRiskBtn.getY()>(mMainContent.getMeasuredHeight()-mFloatRiskBtn.getMeasuredHeight())) {                            mFloatRiskBtn.setTranslationY(0);                        }                        break;                    default:                        break;                }                //记录上次手指离开时的位置                mRiskLastX = x;                mRiskLastY = y;                return false;            }        });        mFloatRiskBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {            //判断是否是移动过,如果是移动过则不处理点击事件                if(isRiskMove){                    isRiskMove=false;                    return;                }                //点击要处理的操作            }        });    }

注:
1,先处理的是onTochListener(),其次是onTouchEvent,最后才是onClickListener(),所以onTouListener的返回必须为false才能使onTochListener好使。
2,motionEvent.getRawX(),为获取手指触摸到的点距离屏幕左上角的距离;
motionEvent.getX(),为获取手指按下到按下的view 的左上角的距离;
mFloatRiskBtn.getX(),为mFloatRiskBtn这个View距离屏幕左上角的距离;
mFloatRiskBtn.getTranslationX(),为获取到mFloatRiskBtn水平方向平移的距离;
getScrollX(),为获取父View左边缘和子View左边缘在水平方向的距离,向左划动为正,右为负,次方法的值是需要通过scrollTo和scrollBy方法移动才能获取到的,本例子中获取只会为0,scrollTo和scrollBy方法只能改变View内容的位置而不能改变View在布局中的位置,所以例子中没有使用该方法。
3,本例中使用的是通过属性动画移动的,如果不需要移动之后可以点击也可以使用view动画和之前说到的scrollTo 方法,但例子中没有进行兼容3.0一下的版本,如果想要兼容的话需要采用开源动画库nineoldandroids,使用时只需要替换为ViewHelper.getTranslationX(mFloatRiskBtn)和ViewHelper.setTranslationX(mFloatRiskBtn,translationX)。

0 0
原创粉丝点击