将SurfaceView中的画布缩放到大于屏幕大小的大小

时间:2016-12-20 14:31:09

标签: android android-canvas

我正在制作一款新应用,而我正在使用Canvas。我正在缩放画布,但我将大小设置为:

public static final int WIDTH =  1920;
public static final int HEIGHT = 1080;

(屏幕将处于横向状态。这就是宽度大于高度的原因) 这个应用程序是否用于纵向方向的含义:

public static final int WIDTH =  1080;
public static final int HEIGHT = 1920;

画布通常为:

public void render(Canvas c) {
    super.draw(c);
    final float scaleFactorX = getWidth()/(WIDTH*1.f);
    final float scaleFactorY = getHeight()/(HEIGHT*1.f);
    if (c != null) {
        final int savedState = c.save();
        c.scale(scaleFactorX, scaleFactorY);
        /////render


        /////render end
        c.restoreToCount(savedState);
    }
}

今天的大多数手机都是高清或更好的,很少有更差的分辨率。但仍然有手机,我担心缩放将如何对其他非高清/更好的手机作出反应,因为我的应用程序将推动比屏幕支持更好的分辨率。

任何想法手机将如何回应这个?有些手机可以自动调整缩放比例,但只是某些手机有普通功能或功能吗?

SurfaceView在Activity中激活,并使用setContentView:

进行设置
@Override
public void onCreate(Bundle sis){
    super.onCreate(sis);

    CustomSurfaceView sf = new CustomSurfaceView(this);
    setContentView(sf);
    //initialize
    sf.init(this, this);

}

修改

澄清:

我正在将画布缩放到与HD 1080分辨率相同的特定大小。与屏幕相比,HD 1080屏幕不会进行任何缩放。 2K屏幕将扩展到HD 1080分辨率,这意味着它的分辨率将低于屏幕的最大分辨率 HD1080尺寸为1080x1920,将应用于小于该尺寸的屏幕上的画布 但是,如何在HD 720屏幕上进行缩放,或者通常比HD 1080更差的分辨率?该应用程序将推动比屏幕支持更大的尺寸。手机将如何应对?

在nexus仿真器(nexus 4,api 23)上运行应用程序会导致画布稍微离开屏幕。并非所有手机都像nexus一样,因为固件已经由制造商编辑,所以仅仅因为它在Nexus的屏幕上显示并不意味着它将出现在Sony或任何其他品牌上

注意:HD除非另有定义,否则引用HD 1080。

1 个答案:

答案 0 :(得分:-1)

不要硬编码解决方案。不推荐。 Android具有内置机制,可在绘图时使用DP单元缩放图形。 detail on unit
dps * getResources().getDisplayMetrics().density detail将DP转换为像素
还要浏览官方文档

顺便使用固定的HD-1080画布,然后调整其他分辨率的大小将如下工作。

  • 让您的CustomSurfaceView全屏显示设备。 (不要像画布那样硬编码视图的大小)
  • 对xScale和yScale使用相同的scaleFactor来保持比率。请记住,在宽高比为16:9的设备中,您将在侧面出现黑屏。 (您可以将画布重新定位到中心并在侧面绘制某种框架)
  • 使用以下代码计算比率。 (帮助来自herehere
public void render(Canvas c) {
    super.draw(c);
    float scaleFactor = 1f;
    if ((getWidth()> 0) || (getHeight() > 0)) {
        scaleFactor = Math.min(WIDTH/getWidth()*1f, HEIGHT/getHeight()*1f);
    }
    if (c != null) {
        c.scale(scaleFactor, scaleFactor );
        //your code
    }
 }