android布局适配

本文探讨了在Android中进行布局适配的问题,特别是针对不同屏幕分辨率下按钮位置错乱的挑战。通过使用相对布局和设置固定dp值的方法初尝失败后,提出了两种解决方案:一是为不同分辨率创建不同values文件夹下的dimen文件,调整尺寸值;二是利用数学几何关系,设定按钮间的角度和半径比例,确保布局在各种屏幕上保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于屏幕的适配解决方案:
    对于比较灵活的布局:其他按钮的布局是根据按钮的布局进行显示的!
    该布局不能以简单的横向或者竖向的比例关系进行计算出!
    解决方案1:
        需要切不同屏幕分辨率一些背景图片!
        需要建立不同分辨率的values文件夹,里面对应的值不一样!

    解决方案2:

        建立其中的布局中的view对象的显示位置的关系式:进行计算!



例子:

      


如上图所示:

       如何在布局中进行设置四个按钮的位置!


      初始想法:

           使用相对布局:将"文明监督"的按钮进行相对布局中"center_horizontal"----"横向居中显示",设置对象的半径长度"dp"值,"文明评论","文明动态","我的"--这几个模块进行设置对应的marginTop,marginLeft,marginRight值,以及半径设置成一个固定的dp值。


      出现的问题:

        在不同屏幕分辨率的手机上会导致四个按钮的位置或错乱!固定的半径的dp值并不能解决布局错乱的问题!


    解决方案:

       1:一个布局文件,但是对应的Values文件夹有不同分辨率的文件夹:

               如下图:

          不同values文件夹下的dimen文件:同一个字段名称--对应的值会不一样!

   

     2:其实四个按钮:“文明监督”按钮是固定的位置:水平居中------其他三个按钮与文明监督按钮成一定的角度关系,半径成一定的比例关系,可以进行利用数学的几何关系:列出横向和竖向的关系式:

       角度图如下:

https://img-blog.youkuaiyun.com/20161024190219990?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

         关系变量:

            

      final float comment_jiaodu=(float)((35.0/180.0)*Math.PI);
      final float state_jiaodu=(float)((16.0/180.0)*Math.PI);
      final float mine_jiaodu=(float)((20.0/180.0)*Math.PI);

      //文明评论,文明动态,我的与"文明监督"之间的半径比例关系
      float comment_radius_rate=0.8f;//文明评论半径与文明监督半径关系比例
      float comment_radius_rate_left=0.9f;//文明评论半径与文明监督半径交叉比例
      float state_radius_rate=0.95f;//文明动态半径与文明监督半径关系比例
      float state_radius_rate_left=0.9f;//文明动态半径与文明监督半径交叉比例
      float mine_radius_rate=0.6f;//我的半径与文明监督半径关系比例
      float mine_radius_rate_left=0.9f;//我的半径与文明监督半径交叉比例

     //横向和属性空白之间的比例
     float rate_x_1=0.06f,rate_x_2=0.06f,//
           rate_y_1=0.25f,rate_y_2=0.15f;

     float rate_supervise_radius=0.1f;//文明监督背景的比例/实际半径
     float rate_supervise_background_width_height_1=0.9533f;


      <pre style="background-color:#ffffff;color:#000000;font-family:'宋体';font-size:9.0pt;">
               //进行横向和竖向的条件:获取min(r1,r2)
                float r1=(float)((scressWidth*(1-rate_x_1-rate_x_2))/
                                     (((1+rate_supervise_radius+comment_radius_rate*comment_radius_rate_left)*Math.cos(comment_jiaodu))+//
                                                            (1+rate_supervise_radius+mine_radius_rate*mine_radius_rate_left)*Math.cos(mine_jiaodu)+//
                                                                                                                            mine_radius_rate+comment_radius_rate));

                float r2=(float)(((main_rl_height*(1-rate_y_2))/(1+//
                                                                (1+rate_supervise_radius+state_radius_rate*state_radius_rate_left)*Math.cos(state_jiaodu)+//
                                                                                                                                    state_radius_rate+rate_y_1)));

                System.out.println("radius_supervise r1:"+r1+"..r2:"+r2);
                //进行获取最小的半径
                radius_supervise=Math.min(r1,r2);
                System.out.println("radius_supervise:"+radius_supervise+"..comment_jiaodu:"+comment_jiaodu+"..state_jiaodu:"+state_jiaodu+"..mine_jiaodu:"+mine_jiaodu);
                radius_supervise_out=radius_supervise+radius_supervise*rate_supervise_radius;
                //进行设置各自的宽度和margin值

                //文明监督
                rl_supervise_background.getLayoutParams().width=//
                                                             (int)(radius_supervise*(rate_supervise_radius+1))*2;
                rl_supervise_background.getLayoutParams().height=//
                                                             (int)(rl_supervise_background.getLayoutParams().width/rate_supervise_background_width_height_1);
//                rl_supervise_background.getLayoutParams().width=(int)radius_supervise_out;

                rl_supervise_background.requestLayout();

                rl_civilization_supervise.getLayoutParams().height=(int)radius_supervise*2;
                rl_civilization_supervise.getLayoutParams().width=(int)radius_supervise*2;

                ((ViewGroup.MarginLayoutParams)rl_civilization_supervise.getLayoutParams()).topMargin=(int)((rate_y_1)*radius_supervise);
                rl_civilization_supervise.requestLayout();
                //设置btnSupervise的padding值
                btnSupervise.setPadding(btnSupervise.getPaddingLeft(),(int)(radius_supervise*0.7),btnSupervise.getPaddingRight(),btnSupervise.getPaddingBottom());
                
                //文明评论
                rl_comment.getLayoutParams().height=(int)(comment_radius_rate*radius_supervise)*2;
                rl_comment.getLayoutParams().width=(int)(comment_radius_rate*radius_supervise)*2;
                ((ViewGroup.MarginLayoutParams)rl_comment.getLayoutParams()).topMargin=//
                                                             (int)(radius_supervise+rate_y_1*radius_supervise+//
                                                                             Math.sin(comment_jiaodu)*(1+comment_radius_rate*comment_radius_rate_left+rate_supervise_radius)*radius_supervise-//
                                                                                                                                                        comment_radius_rate*radius_supervise);
                ((ViewGroup.MarginLayoutParams)rl_comment.getLayoutParams()).leftMargin=//
                                                            (int)(scressWidth*0.5-(Math.cos(comment_jiaodu)*(1+comment_radius_rate*comment_radius_rate_left+rate_supervise_radius)*radius_supervise)- comment_radius_rate*radius_supervise);
                System.out.println("radius_supervise rl_comment.getLayoutParams()).leftMargin:" + ((ViewGroup.MarginLayoutParams) rl_comment.getLayoutParams()).leftMargin + "...");//- comment_radius_rate*radius_supervise

                rl_comment.requestLayout();

                //我的模块
                rl_mine.getLayoutParams().height=(int)(mine_radius_rate*radius_supervise)*2;
                rl_mine.getLayoutParams().width=(int)(mine_radius_rate*radius_supervise)*2;

                ((ViewGroup.MarginLayoutParams)rl_mine.getLayoutParams()).topMargin=
                                                            (int)(radius_supervise+rate_y_1*radius_supervise+(1+mine_radius_rate*mine_radius_rate_left+rate_supervise_radius)*radius_supervise*Math.sin(mine_jiaodu)-//
                                                                                                                                                        mine_radius_rate*radius_supervise);

                ((ViewGroup.MarginLayoutParams)rl_mine.getLayoutParams()).rightMargin=//
                                                            (int)(scressWidth*0.5-Math.cos(mine_jiaodu)*(1+rate_supervise_radius+mine_radius_rate*mine_radius_rate_left)*radius_supervise-//
                                                                                                                                                        mine_radius_rate*radius_supervise);
                rl_mine.requestLayout();

                //文明动态
                rl_civi_state.getLayoutParams().height=(int)(state_radius_rate*radius_supervise)*2;
                rl_civi_state.getLayoutParams().width=(int)(state_radius_rate*radius_supervise)*2;

                ((ViewGroup.MarginLayoutParams)rl_civi_state.getLayoutParams()).topMargin=//
                                                            (int)((Math.cos(state_jiaodu)*(1+state_radius_rate*state_radius_rate_left+rate_supervise_radius))*radius_supervise-radius_supervise+
                                                                                                                        radius_supervise+rate_y_1*radius_supervise);

                ((ViewGroup.MarginLayoutParams)rl_civi_state.getLayoutParams()).leftMargin=//
                                                            (int)(0.5*scressWidth-(radius_supervise*state_radius_rate-//
                                                                                                                        Math.sin(state_jiaodu)*(1+state_radius_rate*state_radius_rate_left+rate_supervise_radius)*radius_supervise));

                rl_civi_state.requestLayout();




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值