CSSでいうところのborder-left
やborder-top
のようなもの.
Androidでやるには一筋縄ではいかなかった.
やりかた
方針
-
GradientDrawable
にstroke
をつける -
LayerDrawable
に前項のGradientDrawable
をセットする -
stroke
が 不要な辺 に ネガティブオフセット をつけてstroke
を描画領域から追い出す
このとき,オフセットの値はstroke
の太さより大きくする必要がある.
実装
CSSでいうとこんな感じのやつをつくる.
border-top: 2px solid #ffffff;
border-bottom: 2px solid #ffffff;
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);
XML
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:left="-1dp" android:right="-1dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#55ffffff" />
</shape>
</item>
</layer-list>