安卓触屏进行的图形变换--平移,缩放核心代码

平移核心代码

...
//单指针起始位置
MotionEvent.ACTION_DOWN,第一个指针
float originalx = motionevent.getX(index);
float originaly = motionevent.getX(index);
...

private void handleTranslate(MotionEvent ev){
        final int historySize = ev.getHistorySize();
        float currentx=0,currenty=0;
        for(int h=0;h<historySize;h++){
            currentx = ev.getHistoricalX(h);
            currenty = ev.getHistoricalY(h);

            matrix.postTranslate(-(originalx - currentyx), -(originaly - currentyy));
            imageView.setImageMatrix(matrix);//通过图形变换完成
            //等价于imageView.scrollBy((int)(originalx-currentx),(int)(original-currenty));//通过移动坐标系完成
            originalx = currentx;
            originaly = currenty;
        }

        currentx = ev.getX();
        currenty = ev.getY();
        matrix.postTranslate(-(originalx-currentx),-(originaly-currenty));
        imageView.setImageMatrix(matrix);
        originalx = currentx;
        originaly = currenty;
    }

缩放核心代码

...
//双指针起始位置
//MotionEvent.ACTION_DOWN,第一个指针
float originalx1 = motionevent.getX(index);
float originaly1 = motionevent.getX(index);
...
//MotionEvent.ACTION_POINTER_DOWN,第二个指针
float originalx2 = motionevent.getX(index);
float originaly2 = motionevent.getX(index);
...

private void handleScale(MotionEvent ev){
        final int historySize = ev.getHistorySize();
        float firstpointercurrentx1 = 0,firstpointercurrenty1 = 0,secondpointercurrentx2 = 0,secondpointercurrenty2 = 0;
        //中心点
        float pivotx,pivoty;
        //点间距离
        float old_distance,new_distance;
        for(int h=0;h<historySize;h++){
            firstpointercurrentx1 = ev.getHistoricalX(0,h);
            firstpointercurrenty1 = ev.getHistoricalY(0,h);
            secondpointercurrentx2 = ev.getHistoricalX(1,h);
            secondpointercurrenty2 = ev.getHistoricalY(1,h);

            pivotx = (firstpointercurrentx1+secondpointercurrentx2)/2;
            pivoty = (firstpointercurrenty1+secondpointercurrenty2)/2;

            old_distance = distance(originalx1,originaly1originalx2,originaly2);
            new_distance = distance(firstpointercurrentx1,t\firstpointercurrenty1,secondpointercurrentx2,secondpointercurrenty2);
            matrix.postScale(new_distance/old_distance,new_distance/old_distance,pivotx,pivoty);
            imageView.setImageMatrix(matrix);

            originalx1 = firstpointercurrentx1;
            originaly1 = firstpointerecurrenty1;
            originalx2 = secondpointercurrent2;
            originaly2 = secondpointercurrenty2;
        }

        firstpointercurrentx1 = ev.getX(0);
        firstpointercurrenty1 = ev.getX(0);
        secondpointercurrentx2 = ev.getX(1);
        secondpointercurrenty2 = ev.getX(1);

        pivotx = (originalx1+originalx2)/2;
        pivoty = (originaly1+originaly2)/2;

        old_distance = distance(originalx1,originaly1,originalx2,originaly2);
        new_distance = distance(firstpointercurrentx1,firstpointercurrenty1,secondpointercurrentx2,secondpointercurrenty2);

        matrix.postScale(new_distance/old_distance,new_distance/old_distance,pivotx,pivoty);
        imageView.setImageMatrix(matrix);

        originalx1 = firstpointercurrentx1;
        originaly1 = firstpointercurrenty1;
        originalx2 = secondpointercurrentx2;
        originaly2 = secondpointercurrenty2;

    }

//距离计算代码
private float distance(float x1,float y1,float x2,float y2){
        return (float)Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值