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