曾经看了android的屏幕适配方案,有非常多种。当中自己用到的一种是:先找一款主流的分辨率的android机,如:1080*1920的分辨率做基准,然后在这个基准上。调整好一切布局。图片。适配其它手机分辨率的手机。用百分比来调节。比如:在480*800的主流手机上,写了一个height=520,那么在480*800的手机上,这个控件的高度则为

480height = 520 * 屏幕高度/1920. 这种方案做屏幕适配。

项目遇到一个问题。

在剩余空间里。在1080*1920的手机上适配非常好,可是在480*800的低分辨率手机上则显示不完整。

查看了原因:由于我的图片资源是240*240的。

布局的ImageView的宽高是自适应的。

所以会导致图片太大。而其余的字体,图片就不能全然显示。所以解决方式有2种:一是做低分辨率的资源图。二是外层嵌套scrollView控件,让其滑动显示剩余不能全然的部分。

动态布局首先要得到xml控件的宽高:

前几天。在自己定义控件的时候碰到个问题。就是在怎样获取自己定义控件的高宽。在自己定义控件类的构造函数中,本来以为能够轻松获取。但事实不是这样。

我測试了以下代码: 

先是布局代码: 

<com.lml.getvalues.MyView 

        android:id="@+id/myView" 

        android:layout_width="match_parent" 

        android:layout_height="150px" 

        android:background="#ff0000" /> 

再是MyView的构造函数的代码: 

public MyView(Context context, AttributeSet attrs) { 

super(context, attrs); 

a="在MyView构造函数中 : MeasuredWidth:"+this.getMeasuredWidth()+";"+"MeasuredHeight:"+this.getMeasuredHeight()+";" 

+"Width:"+this.getWidth()+";"+"Height:"+this.getHeight()+"\n"; 

String h="",w=""; 

for(int i =0 ;i < attrs.getAttributeCount();i++){ 

if("layout_height".equals(attrs.getAttributeName(i))){ 

h=attrs.getAttributeValue(i); 

}else if("layout_width".equals(attrs.getAttributeName(i))){ 

w=attrs.getAttributeValue(i); 

} 

} 

b="在构造函数attrs中 :  width:"+w+";"+"height:"+h+"\n"; 



} 



编译得到a="在MyView构造函数中 : MeasuredWidth:0;MeasuredHeight:0;Width:0;Height:0". 

b="在构造函数attrs中 :  width:-1;height:150.0px 



结果显示当width为match_parent等数值时。仅仅显示-1等。不能满足我的需求。

然后我试着在对应Activity的onCreate中获取高宽。获得的所有是0.但我在onCreate中的加了个点击控件获取高宽事件,能正确获取高宽。

我在网上查了下资料,由于在onCreate中控件还未被度量,所以获取肯定为0.网上有获取三个方法,方法例如以下: 

方法一,在onCreate中加入例如以下代码: 

int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 

int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 

myView.measure(w, h); 

int height = myView.getMeasuredHeight(); 

int width = myView.getMeasuredWidth(); 

tvValues.append("方法一: height:"+height + ",width:" + width+"\n"); 



方法二能够实现,代码例如以下: 

ViewTreeObserver vto2 = myView.getViewTreeObserver(); 

vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

@Override 

public void onGlobalLayout() { 

myView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

tvValues.append( "方法二: height:"+myView.getHeight() + ",width:" + myView.getWidth()+"\n"); 

} 

}); 

但我发现removeGlobalOnLayoutListener在API 级别 16 開始已经废弃,假设去掉。系统会读取多次。 



再来看看方法三。代码例如以下: 



ViewTreeObserver vto = myView.getViewTreeObserver(); 

vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 

public boolean onPreDraw() { 

myView.getViewTreeObserver().removeOnPreDrawListener(this); 

int height = myView.getMeasuredHeight(); 

int width = myView.getMeasuredWidth(); 

tvValues.append("方法三: height:"+height + ",width:" + width + "..\n"); 

return true; 

} 

}); 

我在网上资料的基础上加入了myView.getViewTreeObserver().removeOnPreDrawListener(this);这一条,这个能够保证系统执行一次。

_____________________________________________________________________________________________________________

出现的问题:(1)用上面的2个回调监听函数。监听函数会一直调用,关闭不了。并且屏幕跳转会出现闪屏的现象。所以放弃了

public void setActionBar(){
ViewTreeObserver observer = mScrollView.getViewTreeObserver();
// observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
// @Override
// public boolean onPreDraw() {
// int i = 0;
// Log.e("HomeFragment:" + (i++));
// //int scrollHeight = mScrollView.getChildAt(0).getHeight();
// int scrollHeight = getScreenHeight() - getActionView().getHeight() - mHomeAd.getHeight() - mMineCare.getHeight() -MainUI.bottomHeight;
// int TextHeight = mHomeProgramTxt.getHeight();
//
// if(scrollHeight > (bitmapHeight+TextHeight)*2){
// //大屏幕
// int firstBarHeight = mFirstBar.getHeight();
// int blankHeight = scrollHeight - firstBarHeight*2;
//
// LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mFirstBar.getLayoutParams();
// params.setMargins(0, blankHeight / 3, 0, 0);
// mFirstBar.setLayoutParams(params);
//
// LinearLayout.LayoutParams secondParams = (LinearLayout.LayoutParams) mSecondBar.getLayoutParams();
// secondParams.setMargins(0,blankHeight/3,0,0);
// mSecondBar.setLayoutParams(secondParams);
// }
// mScrollView.getViewTreeObserver().removeOnPreDrawListener(this);
// return true;
// }
// });

(2) 选择使用第一种方法。假设xml里面是用的wrap_content宽高的,能够用getMeasureHeight()方法获取到控件的值,可是动态设置的值仅仅有自己记住这个值大小

 public void set(){
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); getActionView().measure(w, h);
mMineCare.measure(w,h);
//详细值单独赋值
int homeAdHeight = 520 * getScreenHeight() / 1920;
int scrollHeight = getScreenHeight() - getActionView().getMeasuredHeight() - homeAdHeight - mMineCare.getMeasuredHeight() -MainUI.bottomHeight;
mHomeProgramTxt.measure(w,h);
int TextHeight = mHomeProgramTxt.getMeasuredHeight(); if(scrollHeight > (bitmapHeight+TextHeight)*2.5){
//大屏幕
mFirstBar.measure(w,h);
int firstBarHeight = mFirstBar.getMeasuredHeight();
int blankHeight = scrollHeight - firstBarHeight*2; LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mFirstBar.getLayoutParams();
params.setMargins(0, blankHeight / 3, 0, 0);
mFirstBar.setLayoutParams(params);
mSecondBar.setLayoutParams(params);
}
}

实现低分辨率适配效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

高分辨率效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

android屏幕适配方案的更多相关文章

  1. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  2. 实用Android 屏幕适配方案分享

    转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...

  3. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  4. Android 屏幕适配方案(转载)

    3.百分比的引入 1.引入 其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹. 如下图: 然后我们根据一个基准,为基准的意思就是: 比如480*320的分辨率为基准 ...

  5. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  6. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  7. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

  8. Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...

  9. 【转】Android屏幕适配全攻略(最权威的官方适配指导)

    原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...

随机推荐

  1. 分享一个tom大叔的js 深入理解系列 (有助于提升)

    http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html#3620172

  2. cf 864 F. Cities Excursions

    F. Cities Excursions There are n cities in Berland. Some pairs of them are connected with m directed ...

  3. 使用sh库执行shell命令

    python中执行shell命令 之前执行shell命令多是通过os.system(shell命令)的方式来执行,比较麻烦. 了解到sh是一个比subprocess好的库,能够执行shell命令 1. ...

  4. rpm2cpio---如何不安装但是获取rpm包中的文件

    如何不安装但是获取rpm包中的文件 使用工具rpm2cpio和cpio rpm2cpio xxx.rpm | cpio -idmv 参数i表示提取文件.v表示指示执行进程,d和make-directo ...

  5. Java的位运算符——&0xFF的运算与讲解

    快放元旦假,没心思做啥的事,就去翻以前的代码遇到这句,但是又不懂,所以只好上网找,终于懂了那么一点点. 所以那个大神看到我说的有问题,请指出!谢谢.... 一:首先区分一下 A~F的意思先 A,代表十 ...

  6. 【Henu ACM Round #13 B】Spider Man

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现每个环可以操作的次数是固定的. (环的大小-1 也就是说一旦环确定了.其实结果就已经确定了. 则直接看操作总数的奇偶性就可以了 ...

  7. Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SEL ...

  8. Java Swing设置主窗体位置居中方法

    01.第一种方法 int windowWidth = frame.getWidth(); //获得窗体宽  int windowHeight = frame.getHeight(); //获得窗体高 ...

  9. P2P进入整顿期,平衡风险和收益之间的矛盾是关键

        毫无疑问,P2P网贷进入了其诞生以来最为关键的整顿期,随着大量提现困难.跑路的P2P平台被曝光之后.行业对P2P网贷的发展也多了几分慎重.少了几分浮躁.只是,P2P网贷所面临的问题正是其它不论 ...

  10. 强悍的 vim —— 删除空行、删除注释以及加注释解注释

    强悍的 vim -- 删除空行.删除注释以及加注释解注释 原文 https://blog.csdn.net/lanchunhui/article/details/51588198 1. 删除空行空行的 ...