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

功能一开始是需要在很多页面显示一个悬浮窗,后来改为只需要在主页显示,一开始还是用的自定义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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值