安卓觸屏進行的圖形變換--平移,縮放核心代碼

平移核心代碼

...
//單指針起始位置
////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));
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章