Edited at

【Android】特定の辺だけにstrokeをつけたい

More than 3 years have passed since last update.

CSSでいうところのborder-leftborder-topのようなもの.

Androidでやるには一筋縄ではいかなかった.


やりかた


方針



  1. GradientDrawablestrokeをつける


  2. LayerDrawableに前項のGradientDrawableをセットする


  3. 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>


参考URL