android - 将 SurfaceView 中的 Canvas 缩放到大于屏幕尺寸的尺寸

标签 android android-canvas

我正在制作一个新应用,并且正在使用 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;

按 Canvas 通常的比例缩放:

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

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

您知道手机将如何对此作出回应吗?有些手机可以自动调整缩放比例,但这是通用功能还是只有部分手机才有的功能?

SurfaceView 在 Activity 中激活并使用 setContentView 设置:

@Override
public void onCreate(Bundle sis){
    super.onCreate(sis);

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

}

编辑

澄清一下:

我正在将 Canvas 缩放到与 HD 1080 分辨率相同的特定尺寸。 HD 1080 屏幕与屏幕相比不会做任何缩放。 2K 屏幕将缩放至高清 1080 分辨率,这意味着它的分辨率将低于屏幕的最大适合度。
HD1080 尺寸为 1080x1920,将应用于小于该尺寸的屏幕上的 Canvas 。
但是缩放将如何作用于 HD 720 屏幕或通常比 HD 1080 更差的分辨率?该应用程序将插入比屏幕支持更大的尺寸。手机将对此做出什么 react ?


在 nexus 模拟器(nexus 4,api 23)上运行应用程序会导致 Canvas 被稍微推离屏幕。并非所有手机都像 nexus 一样运行,因为制造商已经编辑了固件,所以仅仅因为它在 Nexus 上从屏幕上消失并不意味着它会在索尼或任何其他品牌上出现


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

最佳答案

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

顺便说一句,在固定的 HD-1080 Canvas 上绘图,然后调整其大小以适应其他分辨率,其工作方式如下。

  • 让您的 CustomSurfaceView 全屏显示设备。 (不要像 Canvas 一样硬编码 View 的大小)
  • 对 xScale 和 yScale 使用相同的 scaleFactor 以保持比率。请记住,在纵横比不是 16:9 的设备中,您会在侧面看到黑屏。 (您可以将 Canvas 重新定位到中心并在两侧绘制某种框架)
  • 使用以下代码计算比率。 (帮助来自 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
    }
 }

关于android - 将 SurfaceView 中的 Canvas 缩放到大于屏幕尺寸的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244673/

相关文章:

android - 如何更新 Canvas 绘制文本而不是重绘 Canvas

android - 位图在Android中是如何存储在内存中的?

java - Android 在 Canvas 上获取 Bitmap Rect (left, top, right, bottom)

java - 即使更改后,Android 通知图标仍保留默认图标

android - 根据BuildType选择 flavor

android - 我如何在 Android 中使用 this.getSelectedItemId()

java - 用户移动手指时如何在android中绘制矩形?

android - 使用触摸监听器围绕其中心旋转 android 布局 View

java - 尝试从 imagebutton 启动新 Activity ,但我的应用程序在模拟器中停止工作

android - 如何在android中的 Canvas 中绘制垂直文本