消除可绘制形状线中的差距

时间:2017-02-08 15:00:09

标签: android android-layout android-drawable

我正试图消除下面看到的差距。 View s正好相互对立,因此它似乎是drawable中的东西。 我可以看到它与width的{​​{1}}有关,但我怎样才能消除这种影响?

请注意,这只是一个MVCE,实际用例要求我使用小于stroke的行。

为了消除疑虑,我只会接受一个将其修复为可绘制xml的答案。我不想要布局驱动的工作,提供的布局只是为了揭露问题。

Gap

抽拉/ line.xml

View

布局/的example.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="line">
    <stroke
        android:width="5dp"
        android:color="#ff0000"/>
</shape>

3 个答案:

答案 0 :(得分:1)

  

这个差距来自可绘制形状线?

负责创建形状可绘制的类是GradientDrawable.java

让我们来看看源代码。

draw(Canvas canvas)方法中:

switch (st.mShape) {
case LINE: {
        RectF r = mRect;
        float y = r.centerY();
        if (haveStroke) {
            canvas.drawLine(r.left, y, r.right, y, mStrokePaint);
        }
        break;
    }
}

mRect.leftmRect.right

的行

现在让我们看看mRect被修改的位置。

ensureValidRect()方法中:

Rect bounds = getBounds();
float inset = 0;
if (mStrokePaint != null) {
    inset = mStrokePaint.getStrokeWidth() * 0.5f;
}
final GradientState st = mGradientState;
mRect.set(bounds.left + inset, bounds.top + inset, bounds.right - inset, bounds.bottom - inset);

正如您所看到的那样,inset等于笔画宽度的一半。

这是你的差距所在。

  

如何消除这种影响?

  1. 您可以添加自己的负插图(应该是笔划宽度的一半)

    <强>抽拉/ line_inset.xml

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:drawable="@drawable/line"
       android:insetLeft="-2.5dp"
       android:insetRight="-2.5dp"/>
    
  2. 考虑使用9-patch drawable

  3. red line 9-patch

    顶部和左侧的线条定义了拉伸区域。你可以看到我只是伸展空的空间。 右边和底部的线定义了内容区域,在本例中是所有空间。

答案 1 :(得分:0)

两种解决方案:

1)将XML中声明的形状更改为矩形

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid android:color="#ff0000"/>
    <size android:width="100dp" android:height="1dp"/>

</shape>

然后在你的布局中

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="0dp"
        android:layout_height="5dp"
        android:layout_weight="1"
        android:background="@drawable/line">
    </View>

    <View
        android:layout_width="0dp"
        android:layout_height="5dp"
        android:layout_weight="1"
        android:background="@drawable/line">
    </View>
</LinearLayout>

2)采用不同的方法,而不是为行

创建XML drawable
<View
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:background="@android:color/holo_red_light"/>

修改

你说你需要视图的高度大于线的大小。您可以将图像视图和src属性与矩形XML形状结合使用以获得此效果:

<ImageView
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:layout_weight="1"
    android:src="@drawable/line">
</ImageView>

<ImageView
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:layout_weight="1"
    android:src="@drawable/line">
</ImageView>

答案 2 :(得分:0)

如果我换行图层列表和项目,我可以扩展leftright。我不需要担心他们走得比他们需要的还要严重。这可以抵消这种影响。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="-5dp"
        android:right="-5dp"> <!-- negative stroke width -->
        <shape android:shape="line">
            <stroke
                android:width="5dp"
                android:color="#ff0000"/>
        </shape>
    </item>
</layer-list>