触摸控制布局移动和缩放
2016-04-10 20:16
573 查看
布局缩放
重写onMeasure,onLayout,根据onTouch中取得的比例改变大小和位置
让子布局大小随缩放改变
移动
根据位移使用scrollBy,scrollTo移动
Demo地址:https://github.com/kangsbk/SlideZoomDemo
重写onMeasure,onLayout,根据onTouch中取得的比例改变大小和位置
让子布局大小随缩放改变
移动
根据位移使用scrollBy,scrollTo移动
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, height); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); //设置子布局大小 child.measure((int)defultzoomTimes*DEFWIDTH,(int)defultzoomTimes*DEFHEIGHT); } }
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mvMaxwidth = 0;//最大横向偏移 mvMaxheight = 0;//最大纵向偏移 int margin = 50; int left = margin; int top = margin; int column =0; int realwidth=(int)defultzoomTimes*DEFWIDTH; int realheight=(int)defultzoomTimes*DEFHEIGHT; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); //设置子布局的位置 child.layout(left,top,left +realwidth,top + realheight); left = left + realwidth +margin; if (mvMaxwidth<left){ mvMaxwidth=left; } //每行三列 column++; if (column==3){ left=margin; top += realheight +margin; column=0; } } if (column==0){ mvMaxheight = top+margin; }else { mvMaxheight = top + realheight+margin; } mvMaxwidth += margin; }
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()&MotionEvent.ACTION_MASK){ case MotionEvent.ACTION_DOWN: //获取按下的位置 startX = event.getX(); startY = event.getY(); touchType = TYPE_MOVE; break; //多点触摸 case MotionEvent.ACTION_POINTER_DOWN: touchType = TYPE_ZOOM; //获取两点之间的距离 startDis = getDistance(event); break; case MotionEvent.ACTION_MOVE: if (touchType ==TYPE_MOVE){ //移动 positionX = event.getX(); positionY = event.getY(); scrollBy((int)(positionX-startX),(int)(positionY-startY)); //控制移动范围 if (getScrollX()<=0){ scrollTo(0,getScrollY()); } if (getScrollY()<=0){ scrollTo(getScrollX(),0); } if (getScrollY()>= mvMaxheight -screenheight){ scrollTo(getScrollX(),(mvMaxheight-screenheight)>0?(mvMaxheight-screenheight):0); } if (getScrollX()>=mvMaxwidth-screenwidth){ scrollTo((mvMaxwidth-screenwidth)>0?(mvMaxwidth-screenwidth):0,getScrollY()); } startX =positionX; startY =positionY; }else if (touchType==TYPE_ZOOM){ positionDis = getDistance(event); //计算缩放比例 zoomTimes = positionDis/startDis; startDis = positionDis; defultzoomTimes *=zoomTimes; //控制最大最小值 defultzoomTimes = defultzoomTimes>MAXZOOM?MAXZOOM:defultzoomTimes; defultzoomTimes = defultzoomTimes<MINZOOM?MINZOOM:defultzoomTimes; //重绘 requestLayout(); } break; case MotionEvent.ACTION_POINTER_UP: touchType = TYPE_MOVE; break; case MotionEvent.ACTION_UP: touchType = TYPE_NONE; break; default: return false; } return true; }
Demo地址:https://github.com/kangsbk/SlideZoomDemo
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories