5

https://www.dropbox.com/s/lykyutdlo6386il/nexus%205%202.png?dl=0

这张照片是由nexus 5 拍摄的。你可以看到屏幕顶部和底部之间的差距是不同的。关闭侧边菜单时会裁剪 Android 徽标。底部屏幕的一部分隐藏在本机导航栏下。

https://www.dropbox.com/s/wcwuat1bwoqa26v/correct1.png?dl=0

另一方面,这张照片是由galaxy s5 mini拍摄的。您可能会注意到屏幕顶部和下方之间的差距是相同的量。完全没有问题。

它是具有不同设备和安卓操作系统(棒棒糖和奇巧)的同一个 ResideMenu 库。我查看布局 (residemenu.xml) 发现有问题;但对我来说一切似乎都是正确的。我找不到任何解决这个问题的方法。有没有办法修复正确缩放主要片段(顶部和底部的边距相同)?请帮我。

图书馆链接:github.com/SpecialCyCi/AndroidResideMenu

编辑:

这个链接是我正在谈论它的解决方案的问题。

4

3 回答 3

11

我通过在 ResideMenu 库中编辑方法“ResideMenu.java”解决了这个问题。

我对名为“fitSystemWindows”的方法进行了一些更改

在我进行更改之前:

 @Override
    protected boolean fitSystemWindows(Rect insets) {

        this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
                viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + insets.bottom);
        insets.left = insets.top = insets.right = insets.bottom = 0;
        return true;
    }

在我做出改变后:

@Override
    protected boolean fitSystemWindows(Rect insets) {
        int bottomPadding=insets.bottom;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Resources resources = getResources();
            int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
            if (resourceId > 0) {
                bottomPadding += resources.getDimensionPixelSize(resourceId);
            }
        }
        this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
                viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding);
        insets.left = insets.top = insets.right = insets.bottom = 0;
        return true;
    }

此更改解决了我的问题,底部屏幕的一部分隐藏在本机导航栏下。

我希望此解决方案对遇到此类问题的任何人有所帮助。干杯。

于 2015-07-07T14:15:42.090 回答
1

找到最稳定的解决方案

    public Point getNavigationBarSize(Context context) {

      Point appUsableSize = getAppUsableScreenSize(context);
      Point realScreenSize = getRealScreenSize(context);
     // navigation bar on the right
    if (appUsableSize.x < realScreenSize.x) {
        return new Point(realScreenSize.x - appUsableSize.x,    appUsableSize.y);
    }

    // navigation bar at the bottom
    if (appUsableSize.y < realScreenSize.y) {
        return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y);
    }

    // navigation bar is not present
    return new Point();
   }


  public Point getAppUsableScreenSize(Context context) {

      WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size;
}

   public Point getRealScreenSize(Context context) {

    WindowManager windowManager = (WindowManager)  
    context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point size = new Point();

    if (Build.VERSION.SDK_INT >= 17) {
        display.getRealSize(size);
    } else if (Build.VERSION.SDK_INT >= 14) {
        try {
            size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
            size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
        } catch (IllegalAccessException e) {} catch (InvocationTargetException e) {} catch (NoSuchMethodException e) {}
    }

    return size;
}

并设置主布局的填充

setPadding(getPaddingLeft(),
getPaddingTop(), getPaddingRight(),
getNavigationBarSize(getContext()).y);

编辑:将此代码保留在 ResideMenu.java 的 attachToActivity() 方法中

 if (getNavigationBarSize(getContext()).x > 0 && getNavigationBarSize(getContext()).y > 0) {
        this.postDelayed(new Runnable() {
            @Override
            public void run() {
                setPadding(getPaddingLeft(),
                        getPaddingTop(), getPaddingRight(),
                        getNavigationBarSize(getContext()).y);
            }
        }, 100);
    }
于 2017-01-27T11:31:32.780 回答
-1

我遇到了同样的问题,我通过编辑 ResideMenu 库中的方法解决了这个问题。

在库中,您可以访问名为“ResideMenu.java”的 java 类。

像这样编辑方法。

 private void setScaleDirection(int direction){

    int screenWidth = getScreenWidth();
    float pivotX;
    float pivotY = getScreenHeight() * 0.5f;

    if (direction == DIRECTION_LEFT){
        scrollViewMenu = scrollViewLeftMenu;
        pivotX  = screenWidth * 2.2f;
    }else{
        scrollViewMenu = scrollViewRightMenu;
        pivotX  = screenWidth * -0.5f;
    }

    ViewHelper.setPivotX(viewActivity, pivotX);
    ViewHelper.setPivotY(viewActivity, pivotY);
    ViewHelper.setPivotX(imageViewShadow, pivotX);
    ViewHelper.setPivotY(imageViewShadow, pivotY);
    scaleDirection = direction;
}

在这里,我对

枢轴 x = (screenWidth * 2.2f) 而不是 (screenWidth * 0.5f)。

尝试管理浮点值,它将解决您的问题。

谢谢,快乐编码

于 2015-06-27T11:01:15.017 回答