Androidにおけるcheckboxのpaddingによる問題
4067 ワード
カスタムcheckboxのチェックボックスアイコンは、今回はサボりたいので、アイコンが大きくなって、一連の問題が出てきました.
1、アイコン比checkboxのlayout_heightは高くて、見えません.
血を吐くでしょう、ComponentButtonの中のソースコードは以下のコードを見ることができます
ここからは、あなたが設定したlayout_ではなく、画像の高さに基づいて描かれていることがわかります.heightは画像のスケールを行います.解決策は2つあります
1つ目の方法は、元の画像を縮小することです.これが画像を作ることです.
2つ目の方法:onDrawメソッドを書き換える
2、この解決が完了したと思い込んだ結果、paddingLeftが定義された後、問題が発生し、4.1.2バージョンで異常になり(画像と文字が重なった)、4.2.2バージョンで正常にpaddingLeftが表示された
これは本当に時間がかかりましたが、4.1.2バージョンのCompoundButtonにはgetCompoundPaddingLeftがないことがわかりました.これは人を怒らせませんか.2つのバージョンの計算方法は異なり、4.2.2バージョンで文字を描く場合、画像の幅とpaddingLeftの幅を加算しますが、4.1.2バージョンでは設定されたpaddingLeftだけを計算しています.ここから見ても4.2.2バージョンは人間的です.
そこで前後のバージョンを調べてみると、4.1.2バージョンが境界線で、後続バージョンのComponentButtonにはgetCompoundPaddingLeftメソッドがあります.そこでまたgetCompoundPaddingLeftメソッドを書き直し、バージョンによって判断
ここでは、基本的に自分のcheckboxを定義します.画像の大きさはあまり気にせず、自分で設定した大きさで画像をズームすることができます.appアプリケーションでは比較的柔軟であり、androidのバージョンの違いの問題も発見された.以前はcheckboxでpaddingLeftをほとんど設定していなかったのですが、本当にこの問題に注意していません(2つのバージョンを設定しないのは正常なので、この画像を貼るだけです)
1、アイコン比checkboxのlayout_heightは高くて、見えません.
血を吐くでしょう、ComponentButtonの中のソースコードは以下のコードを見ることができます
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は画像のスケールを行います.解決策は2つあります
1つ目の方法は、元の画像を縮小することです.これが画像を作ることです.
2つ目の方法: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がないことがわかりました.これは人を怒らせませんか.2つのバージョンの計算方法は異なり、4.2.2バージョンで文字を描く場合、画像の幅とpaddingLeftの幅を加算しますが、4.1.2バージョンでは設定されたpaddingLeftだけを計算しています.ここから見ても4.2.2バージョンは人間的です.
そこで前後のバージョンを調べてみると、4.1.2バージョンが境界線で、後続バージョンのComponentButtonには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をほとんど設定していなかったのですが、本当にこの問題に注意していません(2つのバージョンを設定しないのは正常なので、この画像を貼るだけです)