Android:自定义Viewgroup错误地绘制子项(在旧设备上)

时间:2013-01-17 13:57:17

标签: android custom-controls android-canvas

我实现了一个与ViewPager非常相似的自定义寻呼机。它使用canvas来制作滚动效果。它适用于新设备(Android 4.2),但不适用于旧设备(Android 2.3)。

onDraw看起来像

    Log.d(TAG, "onDraw()");
    if (mSwipe != null) {
        Log.d(TAG, "Swipe effect=" + (mSwipe.lastX - mSwipe.startX));
        canvas.translate(mSwipe.lastX - mSwipe.startX, 0);
    }

    Page current;

    current = getPage(mPosition);
    if (current != null) {
        if (mPosition != 0) {
            Log.d(TAG, "Offset effect=" + current.offset.left);
            canvas.translate(current.offset.left, 0);
        }

        Log.d(TAG, "Pager width=" + getWidth());

        Log.d(TAG, "Child width=" + current.view.getWidth());
        current.view.draw(canvas);
        // ...
        // Commented out. Used to draw pages around.
        // ...
    }

Android 4.2打印:

onDraw()
Pager width=1080
Child width=960

Android 2.3打印:

onDraw()
Pager width=480
Child width=420

我的测试页面只是具有扎实背景和一些文本的TextView。

我在新设备上得到的是背景只占用了很多,因为视图和绘图附近的视图效果很好。

在较旧的设备上,我得到一个全屏红色(当前视图的颜色),上面有文字。当我画儿童时,他们的文字处于正确的位置,但他们的背景实际上占据了整个屏幕,并且(意味着什么)透支了当前的页面。

任何人都知道它为什么会发生?我该怎么办呢?

P.S。子宽度是正确的。这两个设备具有非常不同的规范,但子视图应该比父(我的自定义)视图小一点。

截图: 忽略应用程序标题。它与碎片无关。这个测试项目恰好位于Eclipse项目列表中,我在那里实现了代码。

没有邻居:

Android 2.3 Android 4.2

与邻居:

Android 2.3 (n) Android 4.2 (n)

1 个答案:

答案 0 :(得分:0)

检查在自定义视图中对xml进行充气的方式 - 您是否为inflate方法提供了父视图?如果您将null设置为此方法的父级(第二个参数),那么父级的布局参数将不会用于布局您的自定义视图。