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[]{
            80,40,Color.RED,
            40,80,Color.GREEN,
            30,30,Color.BLUE,
            80,80,Color.BLACK,
        };

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

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

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

        private void drawSrc(Canvas canvas,int index){
            mPaint.setColor(srcData[index*3+2]);
            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(10, 10);

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

            canvas.translate(0, 100);
            for(int i=0;i<sFits.length;i++){
                canvas.save();
                for(int j=0;j<N;j++){
                    drawFit(canvas, j, sFits[i]);
                    canvas.translate(mDest.width()+8, 0);
                }
                canvas.drawText(sFitLabels[i], 0, HEIGHT*2/3, mLabelPaint);
                canvas.restore();
                canvas.translate(0, 60);
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值