【发布时间】: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)。您应该使用它们来确定界面元素的大小(以像素为单位),然后根据可用空间对其进行布局。只有这样,您才能获得适用于每部手机的系统。