gpt4 book ai didi

Android View 在大分辨率屏幕上的 3d 旋转变换

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:50:14 24 4
gpt4 key购买 nike

我正在为 android (api > 14) 实现 3d 卡片翻转动画,但遇到大屏幕平板电脑 (> 2048 dpi) 的问题。在问题调查期间,我遇到了以下基本 block :

尝试仅使用矩阵变换 View (简单的 ImageView)并将相机的 Y 旋转某个角度,它适用于角度 < 60 和角度 > 120(变换和显示)但图像消失(只是不显示)当角度为在 60 到 120 之间。这是我使用的代码:

private void applyTransform(float degree) 
{
float [] values = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
float centerX = image1.getMeasuredWidth() / 2.0f;
float centerY = image1.getMeasuredHeight() / 2.0f;

Matrix m = new Matrix();
m.setValues(values);

Camera camera = new Camera();
camera.save();

camera.rotateY(degree);
camera.getMatrix(m);

camera.restore();

m.preTranslate(-centerX, -centerY); // 1 draws fine without these 2 lines
m.postTranslate(centerX, centerY); // 2

image1.setImageMatrix(m);
}

这是我的布局 XML

   <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/ImageView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/naponer"
android:clickable="true"
android:scaleType="matrix">
</ImageView>
</FrameLayout>

所以我有以下情况:

  • 如果在 800X480、1024x720 等小屏幕上运行,则适用于任何角度、任何中心点...
  • 在大屏幕设备 2048x1536、2560x1600 上运行时,角度 < 60 和 > 120 时工作正常...
  • 如果旋转不居中,则在任何设备上的任何角度都可以正常工作(矩阵前后翻译已注释掉)
  • 在大屏幕设备上运行时失败(图像消失),旋转居中且角度在 60 到 120 度之间。

请告诉我做错了什么并建议一些解决方法...谢谢!!!

最佳答案

此问题是由用于计算变换的相机距离引起的。而 Camera类本身并没有对这个主题说太多,View.setCameraDistance() method 的文档中有更好的解释。 (强调我的):

Sets the distance along the Z axis (orthogonal to the X/Y plane on which views are drawn) from the camera to this view. The camera's distance affects 3D transformations, for instance rotations around the X and Y axis. (...)

The distance of the camera from the view plane can have an affect on the perspective distortion of the view when it is rotated around the x or y axis. For example, a large distance will result in a large viewing angle, and there will not be much perspective distortion of the view as it rotates. A short distance may cause much more perspective distortion upon rotation, and can also result in some drawing artifacts if the rotated view ends up partially behind the camera (which is why the recommendation is to use a distance at least as far as the size of the view, if the view is to be rotated.)

老实说,我以前没见过这种特殊效果(根本没有画),但我怀疑它可能与 this question related to perspective distortion 有关我以前遇到过。 :)

因此,解决方案是使用 Camera.setLocation()确保这种情况不会发生的方法。

View.setCameraDistance() 方法的一个重要区别是单位不同,因为 setLocation() 不不使用像素。 setCameraDistance() 会调整密度,而 setLocation() 不会。因此,如果您想根据 View 的尺寸计算适当的 z 距离,请记住调整密度。例如:

float cameraDistance = Math.max(image1.getMeasuredHeight(), image1.getMeasuredWidth()) * 5;
float densityDpi = getResources().getDisplayMetrics().densityDpi;
camera.setLocation(0, 0, -cameraDistance / densityDpi);

关于Android View 在大分辨率屏幕上的 3d 旋转变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27704670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com