android屏幕适配方案

曾经看了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" >

高分辨率效果:

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

时间: 2024-12-25 17:27:56

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

开源,原创,实用Android 屏幕适配方案分享

说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案.   已经用在一款成熟互联网 应用中,效果还不错 http://www.meilijie.com/ask/view/377116/http://www.meilijie.com/ask/view/377668/http://www.meilijie.com/ask/view/377838/http://www.meilijie.

原创,实用Android 屏幕适配方案分享

(说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案. 已经用在一款成熟互联网 应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会. 我在面试的时候,很多人连drawab

Android 屏幕适配方案(百分比)

博客源址:Android 屏幕适配方案 1.概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象: 为什么Web页面设计人员从来没有说过,尼玛适配好麻烦? 那么,到底是什么原

Cocos2dx-Android屏幕适配方案

本文转载于http://www.cnblogs.com/zisou/p/cocos2d-xJIqiao3.html 先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋···· 每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!! 这次新项目专项针对android,目的性强,适配方案我觉得2套图去兼容android各种分辨率: 我们先了解一下android手机上的屏幕密度: Android主要有以下几种屏: QVGA和WQVGA屏dens

Android 屏幕适配方案(转载)

3.百分比的引入 1.引入 其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹. 如下图: 然后我们根据一个基准,为基准的意思就是: 比如480*320的分辨率为基准 宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320 高度为480,将任何分辨率的高度分为480份,取值为y1-y480 例如对于800*480的宽度480: 可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ; 其他分辨率类似~~ 你可能会问,这么多文件,难道

Android 屏幕适配方案(包含生成程序dp sp与解决方案)

看之前希望先看: http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023 此方案是看完上面的了博客总结出来的 方案1与方案2兼容~ 因为都是x? y? font?为名称 方案1: //values-xhdpi.. Dp的适配 与 values-xhdpi.. Sp的适配 这种适合 默认的那种 要是想非常精确 就考虑额外添加下面那个 的方案 按照以上计算方式,大致可以将市场上的手机划分为5个像素密度等级,具体如下: (1) ld

Android 屏幕适配方案

http://www.pento.cn/board/29243127 http://www.pento.cn/board/29243128 http://www.pento.cn/board/29243133 http://www.pento.cn/board/29243129 http://www.pento.cn/board/29243131 http://www.pento.cn/board/29243130 http://www.pento.cn/board/29243132 http:

Android开发屏幕适配方案

Android屏幕适配方案总结 日常开发中,难免遇到屏幕适配的方案,网上也有很多方案,在这里本人只是做一个总结,以免日后使用 单位的概念 pt(point):磅,一个标准的固定长度单位,大小为1/72英寸,主要用于印刷与平面设计.1英寸=2.54厘米=72磅 1pt=0.03527cm px(pixel):像素,组成屏幕图像的最小点,一个相对大小单位.同尺寸屏幕中像素越小越多,代表屏幕分辨率越高,反之越高. 1pt=(ppi/72)*px 屏幕尺寸(screen size):屏幕物理尺寸,指屏幕

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

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局