三星Galaxy Note 3的布局不同
问题描述:
在我的Android应用程序中,我有一个页面,我想在该页面中缩放页面上相对于屏幕大小的所有对象。为此我创建了一个自定义布局。除了1位用户使用三星Galaxy Note 3外,它在我们测试过的所有设备上都能很好地工作。在该设备上,所有设备的尺寸都过大,并且运行在边缘,甚至是顶部边缘。看起来好像布局本身正在运行在屏幕的边缘,并在ActionBar选项卡后面。这里是我的代码:三星Galaxy Note 3的布局不同
package org.mesonet.app;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ScalableLayout extends LinearLayout
{
static final int STANDARD_DPI = 160;
private float mBaseWidthInches;
private float mBaseHeightInches;
private float mWidthScale;
private float mHeightScale;
private float mTextScale;
private boolean mFirstMeasure = true;
public ScalableLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
TypedValue dimen = new TypedValue();
getResources().getValue(R.dimen.base_width, dimen, true);
mBaseWidthInches = dimen.getFloat();
getResources().getValue(R.dimen.base_height, dimen, true);
mBaseHeightInches = dimen.getFloat();
DisplayMetrics display = new DisplayMetrics();
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(display);
float xDpi = display.xdpi;
float yDpi = display.ydpi;
if(Math.round(xDpi) == STANDARD_DPI)
xDpi = display.densityDpi;
if(Math.round(yDpi) == STANDARD_DPI)
yDpi = display.densityDpi;
float currentWidthInches = display.widthPixels/xDpi;
float currentHeightInches = display.heightPixels/yDpi;
mWidthScale = currentWidthInches/mBaseWidthInches;
mHeightScale = currentHeightInches/mBaseHeightInches;
mTextScale = (mHeightScale/display.scaledDensity)/getResources().getConfiguration().fontScale;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
View view;
for(int i = 0; i < getChildCount(); i++)
{
view = getChildAt(i);
if(mFirstMeasure)
{
LayoutParams params = (LayoutParams)view.getLayoutParams();
params.leftMargin *= mWidthScale;
params.topMargin *= mHeightScale;
params.rightMargin *= mWidthScale;
params.bottomMargin *= mHeightScale;
if(params.width != LayoutParams.WRAP_CONTENT && params.width != LayoutParams.MATCH_PARENT)
params.width *= mWidthScale;
if(params.height != LayoutParams.WRAP_CONTENT && params.height != LayoutParams.MATCH_PARENT)
params.height *= mHeightScale;
if(view instanceof TextView)
((TextView)view).setTextSize(((TextView)view).getTextSize() * mTextScale);
view.setLayoutParams(params);
}
}
mFirstMeasure = false;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean inChanged, int inLeft, int inTop, int inRight, int inBottom)
{
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1)
{
super.onLayout(inChanged, inLeft, inTop, inRight, inBottom);
return;
}
super.onLayout(inChanged, Math.round(inLeft * mWidthScale), Math.round(inTop * mHeightScale), Math.round(inRight * mWidthScale), Math.round(inBottom * mHeightScale));
}
}
答
我已经创建了ScalableLayout。
这可能是你想要的,我希望这会对你有帮助。
此ScalableLayout缩放布局相对于布局大小的所有对象。
虽然此链接可以回答这个问题,最好是在这里有答案的主要部件,并提供链接以供参考。如果链接页面更改,则仅链接答案可能会失效。 –
@MarcelGwerder对,我很抱歉。我改变了我的答案。 –
我的版本也相对于版面大小缩放。问题在于它对Galaxy Note设备不正确。 – KairisCharm