android中checkbox的padding引發的問題,androidcheckbox

來源:互聯網
上載者:User

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的圖片,是你自訂的吧
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.