触摸控制布局移动和缩放

  • 布局缩放
    重写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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值