您的位置:首页 > 移动开发 > Android开发

触摸控制布局移动和缩放

2016-04-10 20:16 573 查看
布局缩放

重写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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  布局 Android