こちらの記事で丁寧に書かれて居るのだけれども、Javaで書いた場合とXMLで書いた場合に微妙な差異があって、機種によってはJavaで書いた場合に意図しない挙動を起こす可能性があるので補足。
元記事
private int BORDER_WEIGHT = 2; /* 中略 */ // 白(半透明),太さ2pxのボーダーをつける GradientDrawable borderDrawable = new GradientDrawable(); borderDrawable.setStroke(BORDER_WEIGHT, 0x55ffffff); // LayerDrawableにボーダーを付けたDrawableをセット LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{borderDrawable}); // ボーダーがいらない辺にオフセット(負値)をつける layerDrawable.setLayerInset(0, 0, -BORDER_WEIGHT, 0, -BORDER_WEIGHT); // ボーダーを付けたいViewにセットする view.setBackground(layerDrawable);
修正後
private int BORDER_WEIGHT = 2; /* 中略 */ // 白(半透明),太さ2pxのボーダーをつける GradientDrawable borderDrawable = new GradientDrawable(); borderDrawable.setStroke(BORDER_WEIGHT, 0x55ffffff); // ボーダーの背景を透明にする borderDrawable.setStroke(0x00000000); // LayerDrawableにボーダーを付けたDrawableをセット LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{borderDrawable}); // ボーダーがいらない辺にオフセット(負値)をつける layerDrawable.setLayerInset(0, 0, -BORDER_WEIGHT, 0, -BORDER_WEIGHT); // ボーダーを付けたいViewにセットする view.setBackground(layerDrawable);
元記事のXMLの方ではsolidで透明を指定していたけど、Javaの方にはなかったのでこのままだと京セラの端末とかで背景が真っ黒になる為、律儀に透明を指定してやる必要がある。指定しないの端末が勝手に設定してくださるので真っ黒と書いたけど、そこは機種依存になるので注意。