【问题标题】:Scaling Canvas in SurfaceView to a size bigger than the screen's size将 SurfaceView 中的 Canvas 缩放到大于屏幕尺寸的尺寸
【发布时间】:2017-05-05 19:24:00
【问题描述】:

我正在制作一个新应用,并且正在使用 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 上消失并不意味着它会出现在索尼或任何其他品牌上


注意:除非另有定义,否则 HD 指的是 HD 1080。

【问题讨论】:

  • 为什么要硬编码特定的分辨率?这是这里的主要问题:您可以查看手机的实际分辨率,然后在绘图时使用它。
  • 没错,但内容的规模也很重要。当画布以这种方式缩放时,它也会缩放内容,使内容的大小可以看到。
  • 在画布上绘制为 100 像素而不是每部手机上的 100 像素时。因此,我缩放画布,我认为在这个项目上拥有高分辨率会很好。这就是我使用 HD1080 标准以及对它进行硬编码的原因。使用硬编码比例 100px 在 nexus 1 和 s7 边缘上是 100px。
  • 要指出一件显而易见的事情:这只有在设备的纵横比为 16:9 时才有效 - 这当然是大多数设备,但到目前为止不是他们都是。在具有不同纵横比的设备上,一切都会非常奇怪地缩放。如果您希望它适用于所有设备,那么您不会用这种方法走得太远。
  • Android 已经有一个系统可以在屏幕上正确缩放对象,并且它的整个系统都围绕着与密度无关的像素(或 dp/dip)。您应该使用它们来确定界面元素的大小(以像素为单位),然后根据可用空间对其进行布局。只有这样,您才能获得适用于每部手机的系统。

标签: android android-canvas


【解决方案1】:

不要硬编码解析。不建议这样做。 Android 具有在绘图时使用 DP 单位缩放图形的内置机制。 detail on unit
通过dps * getResources().getDisplayMetrics().densitydetail将DP转换为像素
还可以浏览官方文档

顺便说一句,在固定的 HD-1080 画布上绘图,然后将其调整为其他分辨率,如下所示。

  • 让您的CustomSurfaceView 获取设备的全屏。 (不要像画布那样硬编码视图的大小)
  • 对 xScale 和 yScale 使用相同的 scaleFactor 以保持比率。请记住,在非 16:9 宽高比的设备中,您会在侧面出现黑屏。 (您可以将画布重新定位到中心并在侧面绘制某种框架)
  • 使用以下代码计算比率。 (帮助来自here 和here)

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
    }
 }

【讨论】:

  • 使用固定的 Rect(0,0,WIDTH,HEIGHT) 绘制到屏幕上,没有任何显示。我复制了代码以确保我正确添加了它,但它仍然没有在屏幕上显示任何内容。
  • @LunarWatcher 如果我最近的编辑答案有意义,请通知我
猜你喜欢
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多