我正在为Android实现3d卡翻转动画(api> 14),并且大屏幕平板电脑(> 2048 dpi)有问题。在问题调查期间,我进入了以下基本步骤:

尝试仅使用矩阵和照相机的rotateY角度将 View (简单的ImageView)转换为某个角度,并且对于角度 120(已转换并显示)可以正常使用,但是当角度在60至120之间时图像会消失(只是不显示) 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上运行时,
  • 对于 120的角度都可以正常工作...
  • 如果旋转不居中(矩阵的前后翻译均已注释掉),则在任何设备上的任何角度都可以正常工作
  • 在大屏幕设备上运行时
  • 失败(图像消失),旋转居中并且角度在60至120度之间。

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

    最佳答案

    此问题是由用于计算变换的摄像机距离引起的。尽管 Camera 类本身并未对主题进行过多说明,但在 View.setCameraDistance() method(强调我的文档)的文档中对此进行了更好的解释:



    老实说,我以前从未见过这种特殊效果(根本没有画图),但我怀疑它可能与我过去遇到的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 - Android View 3d在高分辨率屏幕上旋转变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27704670/

    10-15 00:04
    查看更多