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);  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM