/*
* 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(, );
}
}
}
}