天天看点

Android Api Demos登顶之路(八十八)Graphics-->ScaleToFit

/*
 * Matrix的setRectToRect(RectF src, RectF dst, Matrix.ScaleToFit stf)方法实现了从源图形向目标区域图形的变换。
 * Matrix.ScaleToFit参数定义了四种缩放选项
 * 1.CENTER: 保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠,原图形在目标图形中居中显示。
 * 2.END:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。END提供右下对齐。
 * 3.FILL: 可能会变换矩形的长宽比,保证变换和目标矩阵长宽一致。
 * 4.START:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。START提供左上对齐。
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }

    private static class SampleView extends View{
        private Paint mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        private Paint mStrokePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        private Paint mLabelPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        private Matrix mMatrix=new Matrix();
        private RectF mSrc=new RectF();

        //定义缩放模式
        private static final Matrix.ScaleToFit[] sFits=new Matrix.ScaleToFit[]{
                Matrix.ScaleToFit.CENTER,
                Matrix.ScaleToFit.END,
                Matrix.ScaleToFit.FILL,
                Matrix.ScaleToFit.START,
        };

        private static final String[] sFitLabels=new String[]{
            "CENTER","END","FILL","START"
        };

        //定义源图形的大小及颜色
        private static final int[] srcData=new int[]{
            ,,Color.RED,
            ,,Color.GREEN,
            ,,Color.BLUE,
            ,,Color.BLACK,
        };

        private int N=;
        private static final int WIDTH=;
        private static final int HEIGHT=;
        //定义目标区域
        private RectF mDest=new RectF(,,WIDTH,HEIGHT);

        public SampleView(Context context) {
            super(context);
            mStrokePaint.setStyle(Paint.Style.STROKE);
            mLabelPaint.setTextSize();
        }

        //设置源图形
        private void setSrc(int index){
            int w=srcData[index*];
            int h=srcData[index*+];
            //设置源图形的区域
            mSrc.set(, , w, h);
        }

        private void drawSrc(Canvas canvas,int index){
            mPaint.setColor(srcData[index*+]);
            canvas.drawOval(mSrc, mPaint);
        }

        //按绽放模式将源图形转换为目标区域内的图形
        private void drawFit(Canvas canvas,int index,Matrix.ScaleToFit fit){
            canvas.save();
            setSrc(index);
            mMatrix.setRectToRect(mSrc, mDest, fit);
            canvas.concat(mMatrix);
            drawSrc(canvas, index);
            canvas.restore();

            canvas.drawRect(mDest, mStrokePaint);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawColor(Color.WHITE);
            canvas.translate(, );

            canvas.save();
            //绘制源图形
            for(int i=;i<N;i++){
                setSrc(i);
                drawSrc(canvas, i);
                canvas.translate(mSrc.width()+, );
            }
            canvas.restore();

            canvas.translate(, );
            for(int i=;i<sFits.length;i++){
                canvas.save();
                for(int j=;j<N;j++){
                    drawFit(canvas, j, sFits[i]);
                    canvas.translate(mDest.width()+, );
                }
                canvas.drawText(sFitLabels[i], , HEIGHT*/, mLabelPaint);
                canvas.restore();
                canvas.translate(, );
            }
        }
    }
}