Android 获取手机屏幕高度 getMetrics和getRealMetrics的区别

Android 获取手机屏幕高度 getMetrics和getRealMetrics的区别,第1张

先说正确的获取屏幕高度方式

使用以下的方法去获取获取应用的屏幕高度

此处通过 getMetrics() 获取的高度其实是去除了虚拟按键后的高度。所以和手机的实际屏幕高度可能有差异

getReaMetrics() 则是真正原始的屏幕尺寸

//遍历设置字体

public static void changeViewSize(ViewGroup viewGroup,int screenWidth,int screenHeight) {//传入Activity顶层Layout,屏幕宽,屏幕高

int adjustFontSize = adjustFontSize(screenWidth,screenHeight);

for(int i = 0; i<viewGroupgetChildCount(); i++ ){

View v = viewGroupgetChildAt(i);

if(v instanceof ViewGroup){

changeViewSize((ViewGroup)v,screenWidth,screenHeight);

}else if(v instanceof Button){//按钮加大这个一定要放在TextView上面,因为Button也继承了TextView

( (Button)v )setTextSize(adjustFontSize+2);

}else if(v instanceof TextView){

if(vgetId()== Ridtitle_msg){//顶部标题

( (TextView)v )setTextSize(adjustFontSize+4);

}else{

( (TextView)v )setTextSize(adjustFontSize);

}

}

}

}

//获取字体大小

public static int adjustFontSize(int screenWidth, int screenHeight) {

screenWidth=screenWidth>screenHeightscreenWidth:screenHeight;

/

1 在视图的 onsizechanged里获取视图宽度,一般情况下默认宽度是320,所以计算一个缩放比率

rate = (float) w/320 w是实际宽度

2然后在设置字体尺寸时 paintsetTextSize((int)(8rate)); 8是在分辨率宽为320 下需要设置的字体大小

实际字体大小 = 默认字体大小 x rate

/

int rate = (int)(5(float) screenWidth/320); //我自己测试这个倍数比较适合,当然你可以测试后再修改

return rate<1515:rate; //字体太小也不好看的

}

最后在Avtivity的oncreate完后调用一下changeViewSize就行了。。。文字大了那么它对应的背景也就跟着大,所以建议控件的背景用9宫格类型的,看起来舒服。

另外附加,如果你开发的应用想在平板电脑上浏览无碍请在AndroidManifestxml文件中的manifest节点(DTD建议放在application节点上面)里加入:

<supports-screens

android:anyDensity="true"

android:largeScreens="true"

android:normalScreens="true"

android:smallScreens="true"

android:resizeable="true"/>

如果你指的是文字写入时的宽度的话,是可以获取的到的。

高度等于字体大小,即size。

宽度可以通过FontMetrics接口可以获取的到。

参考代码如下:

// 创建对象

BufferedImage bImg = new BufferedImage(width, height, BufferedImageTYPE_INT_ARGB);

//得到Graphics2D 对象

Graphics2D g2d = (Graphics2D) bimggetGraphics();

// 设置字体

Font font = new Font("宋体", FontBOLD, 30);

g2dsetFont(font);

FontMetrics fm = g2dgetFontMetrics(font);

// 获取文字宽度

int textWidth = fmstringWidth(text);

你是指修改系统字体吗?字体本身是无法设置的,只能修改字体。修改字体的方法主要有2类:

一、通过软件修改android系统字体

这类系统字体修改软件较多,可以在各大android手机论坛(机锋论坛等等)里搜索一下,比如《字体替换》这个软件。

二、手动修改android系统字体

1、首先需要获取root权限,然后手机需要安装类似REexplorer这样的高级文件管理器。

2、将需要替换的字体放置在手机SD卡中,并重命名。重命名按照以下形式命名:

英文字体重命名为:DroidSansttf;中文字体重命名为:DroidSansFallbackttf

3、以REexplorer为例,打开该文件管理器后,访问SD卡中存放替换字体的文件夹,然后选择需要替换的字体,长按该字体,选择“复制”。在不关闭REexplorer文件管理器的前提下,点击文件管理器上的返回按钮,访问system/fonts文件夹,然后点击“粘贴”

4、粘贴完成后,需要设置替换文件的权限。(替换的DroidSansttf则设置DroidSansttf的权限,替换的DroidSansFallbackttf则设置DroidSansFallbackttf的权限)长按该文件后,选择“权限”,设置权限。(也可以参考其他文件的权限配置,和其他文件一样配置为rw-r--r--)

5、替换完成后,重启手机

常见问题:

Q1:替换后为什么部分中文字体是方框?

A1:出现该情况是由于替换字体本身就不支持部分中文汉字的显示,需要换一个字体。一般微软雅黑、圆体等常见字体都不会出现该异常情况。

Q2:替换后为什么英文字体还是原样?

A2:英文字体和中文字体由两个字体文件分别管理,如果只替换了中文字体,英文字体就仍然是默认的样式

Q3:为什么没有替换英文字体,英文字体的样式也变了呢?

A3:出现该情况,一般是由于替换的中文字体本身就包含了英文字符的样式。替换这样的中文字体后,当需要显示英文时,会显示中文字体包中含有的英文字符样式

1 TextView tv=new TextView(this);

tvgetPaint()setFlags(PaintUNDERLINE_TEXT_FLAG);//下划线

tvsetText("使用代码实现下划线样式");

tvsetTextColor(ColorWHITE);

2 tv=new TextView(this);

tvsetText(HtmlfromHtml("<u>使用html实现下划线样式</u>"));

下面给出我的实现方式吧,希望对你有帮助

public class MySimpleAdapter extends SimpleAdapter {

 private LayoutInflater mInflater;

 private final float titleFontSize;

 private final float screenWidth; //屏幕宽

 private final float screenHeight; //屏幕高

 public MySimpleAdapter(Context context,

   List< extends Map<String, >> data, int resource, String[] from,

   int[] to) {

  super(context, data, resource, from, to);

  

  

  // 获取屏幕的长和宽

  DisplayMetrics dm = new DisplayMetrics();  

  dm = contextgetResources()getDisplayMetrics();  

  screenWidth = dmwidthPixels;   

  screenHeight = dmheightPixels;

  //设置标题字体大小

  titleFontSize = adjustTextSize();

  mInflater = (LayoutInflater) contextgetSystemService(ContextLAYOUT_INFLATER_SERVICE);

 }

 

 @Override

 public View getView(int position, View convertView, ViewGroup parent) {

  if(convertView == null){

   convertView = mInflaterinflate(Rlayoutjudge_item, null);

  }

  TextView tv_title = (TextView) convertViewfindViewById(RiditemTitle);

  TextView tv_content = (TextView) convertViewfindViewById(RiditemContext);

  tv_titlesetTextSize(titleFontSize); //设置字体大小,

  return supergetView(position, convertView, parent);

 }

 

 float adjustTextSize(){

  float textsize = 12;

  //在这实现你自己的字体大小算法,可根据之前计算的屏幕的高和宽来按比例显示

  textsize = screenWidth/320  12;

  

  return textsize;

 }

}

这是我的算法,希望对你有帮助哈。用的时候直接把SimpleAdapter替换成MySimpleAdapter即可~

主题里添加如下,可以修改title的字体的大小和样式

比如没有ActionBar的Activity中,定义如下的样式

<style name="AppTheme" parent="android:ThemeLight">

<!-- 不要ActionBar -->

<item name="android:windowActionBar">false</item>

<item name="android:windowTitleStyle">@style/WindowTitle</item>

</style>

<style name="WindowTitle" parent="@android:style/TextAppearance">

<item name="android:textColor">#fff</item>

<item name="android:textSize">20sp</item>

<item name="android:textStyle">bold</item>

</style>

如果是在ActionBar存在的前提下,主题样式要如下

<style name="AppTheme" parent="android:ThemeLight">

<!-- 这个是设置ActionBar上的menu的文本显示样式-->

<item name="android:actionMenuTextAppearance">@style/TextAppearance</item>

<!-- 这个是设置ActionBar上的menu的文本显示颜色-->

<item name="android:actionMenuTextColor">@color/main_color</item>

<item name="android:actionBarStyle">@style/ActionBar</item>

</style>

<style name="ActionBar" parent="@android:style/WidgetActionBar">

<!-- 这个是设置ActionBar上的title的文本显示样式-->

<item name="android:titleTextStyle">@style/TextAppearance</item>

</style>

以上就是关于Android 获取手机屏幕高度 getMetrics和getRealMetrics的区别全部的内容,包括:Android 获取手机屏幕高度 getMetrics和getRealMetrics的区别、android自定义样式的字体大小咋样改、java 能获取到文字所使用某种字体后的宽度及高度吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9595999.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存