Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android中checkbox的padding引發的問題

android中checkbox的padding引發的問題

編輯:關於Android編程

自定義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,parentds是occupyPosDrawable方法返回的。
        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();
            //selfHeight為要定義的圖片高度
            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,還真沒有注意這個問題(因為不設置兩個版本都正常,只是貼這圖片)


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved