简单的可拖动的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)。
- 简单的可拖动的ImageView,16/12/25 02
- Android可拖动的ImageView
- 简单的可拖动的TitleWindow
- 简单可拖动的div层
- jquery简单可拖动可关闭的div
- Android 简单实现可全屏拖动,可点击的View
- 可移动的ImageView
- 可缩放的ImageView
- 可拖动的DIV
- 可拖动的div
- 可拖动的div
- 可拖动的层
- 可拖动的控件
- 可拖动的div
- 可拖动的控件
- 可拖动的层
- 可拖动的圆角遮罩层
- 可拖动的DIV
- Linux操作系统下运行命令时Ctrl+C和Ctrl+Z的作用及恢复
- php-变量常量
- java IO最详解
- 抽象工厂模式
- 20、(知识篇)Mybatis使用
- 简单的可拖动的ImageView,16/12/25 02
- Can't create more than max_prepared_stmt_count statements
- ssh注解配置
- 关于C++里面的函数中,按值传递与按引用传递的区别
- 【问题解决】ava.lang.NoSuchMethodError: antlr.collections.AST.getLine()
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- solr replication原理探究
- OJ 1997: C语言实验——分割整数
- 百度地图开发(一)