android中checkbox的padding引發的問題,androidcheckbox
自訂checkbox中的勾選框表徵圖,這次因為想偷懶,表徵圖弄的大了些,然後一系列的問題就都引出來了。
1、表徵圖比checkbox的layout_height高,看不見了。
很吐血吧,CompoundButton中的源碼可以看到下面代碼
protected void onDraw(Canvas canvas) { super.onDraw(canvas); final Drawable buttonDrawable = mButtonDrawable; if (buttonDrawable != null) { final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; final int height = buttonDrawable.getIntrinsicHeight();//可以看到是根據圖片的原始高度對圖片進行繪製的,,danielinbiti int y = 0; switch (verticalGravity) { case Gravity.BOTTOM: y = getHeight() - height; break; case Gravity.CENTER_VERTICAL: y = (getHeight() - height) / 2; break; } buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height); buttonDrawable.draw(canvas); }}
從這裡可以看到是根據圖片的高度進行繪製的,而不是根據你設定的layout_height進行圖片縮放。所以解決的途徑也就兩種:
第一種方法:把原始圖片縮小,這就就是製作圖片了
第二種方法:重寫onDraw方法
@Override protected void onDraw(Canvas canvas) { setButtonDrawable(parentds);//danielinbiti,<span style="font-family: Arial, Helvetica, sans-serif;">parentds是</span><span style="font-family: Arial, Helvetica, sans-serif;">occupyPosDrawable方法返回的。</span><span style="font-family: Arial, Helvetica, sans-serif;"></span> super.onDraw(canvas); setButtonDrawable(ds);//真正要顯示的圖片 final Drawable buttonDrawable = ds; if (buttonDrawable != null) { final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; final int drawableHeight = buttonDrawable.getIntrinsicHeight()>selfHeight ?selfHeight:buttonDrawable.getIntrinsicHeight(); final int drawableWidth = buttonDrawable.getIntrinsicWidth()>selfHeight ?selfHeight:buttonDrawable.getIntrinsicWidth(); //<span style="font-family: Arial, Helvetica, sans-serif;">selfHeight為要定義的圖片高度</span> int top = 0; switch (verticalGravity) { case Gravity.BOTTOM: top = getHeight() - drawableHeight; break; case Gravity.CENTER_VERTICAL: top = (getHeight() - drawableHeight) / 2; break; } int left = 0; int right = left+drawableWidth; int bottom = top+drawableHeight; buttonDrawable.setBounds(left, top, right, bottom); buttonDrawable.draw(canvas); } } // drawable 轉換成bitmap private Drawable occupyPosDrawable(int height){// Picture p=new Picture(); Canvas c=p.beginRecording(height,height); p.endRecording(); PictureDrawable pd=new PictureDrawable(p); return pd; }
2、當這個解決後,自以為已經完成了,結果定義了paddingLeft後,問題出現了,在4.1.2版本不正常了(圖片和文字疊在一起了),在4.2.2版本中正常顯示了paddingLeft
這真的是花了不少時間,結果發現4.1.2版本中CompoundButton沒有getCompoundPaddingLeft,這不坑人嘛。兩個版本的計算方式不一樣,4.2.2版本繪製文字時,會把圖片的寬度和paddingLeft的寬度加上,而4.1.2版本只計算設定的paddingLeft,從這裡看也是4.2.2版本人性化一些。
於是又查了一下前後版本,發現4.1.2版本是分界線,後續版本CompoundButton都有getCompoundPaddingLeft方法。於是又重寫了getCompoundPaddingLeft方法,根據版本判斷
@Override public int getCompoundPaddingLeft() { int padding = super.getCompoundPaddingLeft(); if(getAndroidSDKVersion()<=16){//4.1.2 if (!isLayoutRtl()) { padding = selfHeight + padding; } } return padding; }
到這裡,基本就定義了一個自己的checkbox。圖片大小就不用太在意了,可以根據自己設定的大小把對圖片進行縮放。在app應用中相對比較靈活些,同時也發現了一個android的版本差異性問題。以前用checkbox的時候基本沒有設定過paddingLeft,還真沒有注意這個問題(因為不設定兩個版本都正常,只是貼這圖片)
android中動態布局CheckBox的時出現這些異常問題
你在ScrollView 中是不是放了幾個組件?ScrollView也是一個Layout布局,可以讓它內部的資料顯示不下的時候出現捲軸,要注意的是不能在ScrollView中放多個組件
android中checkbox的框在他的text上面,解
把XML發出來。 估計你這個checkBox的圖片,是你自訂的吧