zoukankan      html  css  js  c++  java
  • Android中Tablayout设置下划线宽度 和 dp和px之间进行相互转换

    开发中遇到了一个问题,Tablayout设置下换线长度,看了点资料,分享给大家。

    效果图:

                 

    直接贴代码(要在tabLayout添加完所有的tab后调用)

    public void reflex(final TabLayout tabLayout){  
        //了解源码得知 线的宽度是根据 tabView的宽度来设置的  
        tabLayout.post(new Runnable() {  
            @Override  
            public void run() {  
                try {  
                    //拿到tabLayout的mTabStrip属性  
                    LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);  
      
                    int dp10 = dip2px(tabLayout.getContext(), 10);  
      
                    for (int i = 0; i < mTabStrip.getChildCount(); i++) {  
                        View tabView = mTabStrip.getChildAt(i);  
      
                        //拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextView  
                        Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");  
                        mTextViewField.setAccessible(true);  
      
                        TextView mTextView = (TextView) mTextViewField.get(tabView);  
      
                        tabView.setPadding(0, 0, 0, 0);  
      
                        //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度  
                        int width = 0;  
                        width = mTextView.getWidth();  
                        if (width == 0) {  
                            mTextView.measure(0, 0);  
                            width = mTextView.getMeasuredWidth();  
                        }  
      
                        //设置tab左右间距为10dp  注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的  
                        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();  
                        params.width = width ;  
                        params.leftMargin = dp10;  
                        params.rightMargin = dp10;  
                        tabView.setLayoutParams(params);  
      
                        tabView.invalidate();  
                    }  
      
                } catch (NoSuchFieldException e) {  
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    e.printStackTrace();  
                }  
            }  
        });  
      
    }  

    我的参考地址:http://blog.csdn.net/u013134391/article/details/70833903  (还是有缺点的,宽度不能比Title文字的宽度还小,最小是和它的宽度一样)

    在Android开发中,距离单位google推荐使用“dp”,文字大小的单位使用“sp”,(ps:IOS距离单位是“px”,文字单位是“pt”)

    但是在实际开发中我们经常会遇到在java代码中写入距离单位,但是这样的数字代表的是px。那我们要想办法将“dp”转换成屏幕像素点“px”。

    public class DensityUtil {  
      
        /** 
         * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
         */  
        public static int dip2px(Context context, float dpValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (dpValue * scale + 0.5f);  
        }  
      
        /** 
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
         */  
        public static int px2dip(Context context, float pxValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (pxValue / scale + 0.5f);  
        }  
    }  
  • 相关阅读:
    《团队-Android手机便签-项目进度》
    《结对-结对编项目作业名称-测试过程》
    《结对-结对编项目作业名称-开发过程》
    ios auto layout demystified (二)
    ios auto layout demystified (一)
    电子书下载地址
    轻应用、Web app 、Native app三者区别关系是什么?
    ios录制测试
    Understanding apps: mobile, native or responsive
    iOS开发工具——网络封包分析工具Charles
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7985627.html
Copyright © 2011-2022 走看看