Android中的自定义绘图和利用布局文件的绘图不太一样,布局文件的设计基本决定了UI的显示效果,而自定义View绘图时,所绘制的画面并不直接等同于屏幕上显示的效果,通常还需要进行画布到屏幕的映射处理,此时就需要考虑画布大小和屏幕大小的缩放关系,常用的处理方式有以下三种。
(1)非等比例缩放
将画布按照屏幕的实际宽度和高度分别做比例缩放,使画布充满整个屏幕。但由于可能改变了画布的原有比例,画布中所绘制对象的原有比例也可能发生改变,从而导致对象的比例被拉伸或缩小,一定程度会影响到画面的整体效果。
处理非等比例缩放的主要工作时确定画布左上角在屏幕上的起始坐标,此时一般为(0,0)点,同时还要分别计算画布的宽、高相对于屏幕的宽、高缩放比。
public static void ScreenScaleWithNotEqualRatio(){//非等比例缩放
//直接计算宽高比
decideScreenOrientation();
if(screenOrient == LANDSCAPE){//横屏时
ratio1 = SCREEN_HEIGHT / sHpHeight;//横屏高度缩放比
ratio2 = SCREEN_WIDTH / sHpWidth;//横屏宽度缩放比
x = 0;
y = 0;
}
if(screenOrient == PORTRAIT){//竖屏时
ratio1 = SCREEN_HEIGHT / sSpHeight;//竖屏高度缩放比
ratio2 = SCREEN_WIDTH / sSpWidth;//竖屏宽度缩放比
x = 0;
y = 0;
}
return;
}
(2)等比例缩放并裁剪
将画布按照某条边(宽或高)做等比例缩放,在保持画布原有比例的同时,使画布和屏幕在该边上相等,而另一条边上画布超出屏幕,此时可以计算超出屏幕的边上的起始坐标,再将画布平移,使某部分超出屏幕,从而实现“裁剪”。
此时的主要工作是计算画布的整体缩放比例,以及画布左上角的起始坐标。
public static void ScreenScaleWithEqualRatioAndCrop(){//等比例缩放并裁剪
//需计算左上角x、y坐标用于移动画布,实现“裁剪”
decideScreenOrientation();
if(screenOrient == LANDSCAPE){//横屏时
ratio = SCREEN_HEIGHT/sHpHeight;
float width = sHpWidth*ratio;
if(width > SCREEN_WIDTH){
x = (int)(SCREEN_WIDTH -