Android ResideMenu库,Fragment底部有裁剪问题

Android ResideMenu library, bottom of Fragment has Cropping issue

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拍摄的。您可能会注意到屏幕顶部和底部之间的间隙是相同的。完全没有问题。

不同设备和android OS (lollipop & kitkat) 是同一个 ResideMenu 库。我查看布局 (residemenu.xml) 发现有问题;但对我来说一切似乎都是正确的。我找不到解决这个问题的方法。有什么方法可以正确缩放主要片段(顶部和底部的边距相同)?请帮我。

link 到图书馆:github.com/SpecialCyCi/AndroidResideMenu

编辑:

This link 是我正在谈论的问题及其解决方案。

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

在图书馆内,您可以访问名为 "ResideMenu.java".

的 java class

像这样编辑方法。

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

这里我做了修改

pivot x = (screenWidth * 2.2f) instead of (screenWidth * 0.5f).

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

谢谢, 快乐编码

我通过在 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;
    }

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

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

找到最稳定的解决方案

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

并设置主布局的padding

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