图片的缩放,平移——Matrix的使用

来源:互联网 发布:mac bootcamp 编辑:程序博客网 时间:2024/06/01 09:14

Matrix,中文叫矩阵,主要用于平面的缩放、平移、旋转等操作

在android中,Matrix由9个float值构成,是一个3*3的矩阵,
cosX,-sinX,translateX
sinX, cosX,translateY
0, 0, scale。

在本项目中,实现主要实现了当前居中缩放的功能。
pre :M’ = M * T(dx, dy) ,右乘,先执行
post:M’ = S(sx, sy) * M,左乘,后执行
先通过preTranslate(0,0),将图片移动到原点,
再postScale放大或缩小,
最后通过postTranslate,设置放大,缩小后的偏移值。
为什么先移回原点,纯粹是为了好计算而已。

/**     * 按比例缩放     * @param scale 缩放比例     */    private void zoom(float scale) {        if(null == matrix){            matrix = new Matrix();        }        matrix.getValues(values);//获取缩放前的偏移值        matrix.reset();        matrix.postScale(scale, scale);//post左乘,后执行        matrix.preTranslate(0,0);//pre右乘,先执行        float left = values[2];        float top = values[5];        switch (screen_type) {        case Configuration.ORIENTATION_PORTRAIT://竖直屏幕            if(scale * bheight <= getHeight()){                if(left + scale * bwidth < getWidth()){                    float dx = getWidth() - (left + scale * bwidth);                    left += dx;                }                matrix.postTranslate(left,(getHeight() - scale*bheight)/2f);            }else{                fullScreenScale(scale, left, top);            }            break;        case Configuration.ORIENTATION_LANDSCAPE://水平屏幕            Log.i("AAAA","translateX:"+ left+","+ top +"..."+(getWidth() - scale*bwidth)/2f);            if(scale * bwidth <= getWidth()){                if(top + scale * bheight < getHeight()){                    float dy = getHeight() - (top + scale * bheight);                    top += dy;                }                matrix.postTranslate((getWidth() - scale*bwidth)/2f,top);            }else {                fullScreenScale(scale, left, top);            }            break;        }        isScale = true;        invalidate();    }/**     * 宽高铺满全屏的缩放     * @param scale 缩放比     * @param left 左边偏移值     * @param top 顶部偏移值     */    public void fullScreenScale(float scale, float left, float top) {        if(top + scale * bheight < getHeight() ){            float dy = getHeight() - (top + scale * bheight);            top += dy;        }        if(left + scale * bwidth < getWidth()){            float dx = getWidth() - (left + scale * bwidth);            left += dx;        }        matrix.postTranslate(left,top);    }
0 0