我正试图消除下面看到的差距。 View
s正好相互对立,因此它似乎是drawable中的东西。
我可以看到它与width
的{{1}}有关,但我怎样才能消除这种影响?
请注意,这只是一个MVCE,实际用例要求我使用小于stroke
的行。
为了消除疑虑,我只会接受一个将其修复为可绘制xml的答案。我不想要布局驱动的工作,提供的布局只是为了揭露问题。
抽拉/ 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>
答案 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.left
到mRect.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
等于笔画宽度的一半。
这是你的差距所在。
如何消除这种影响?
您可以添加自己的负插图(应该是笔划宽度的一半)
<强>抽拉/ 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"/>
考虑使用9-patch drawable
顶部和左侧的线条定义了拉伸区域。你可以看到我只是伸展空的空间。 右边和底部的线定义了内容区域,在本例中是所有空间。
答案 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)
如果我换行图层列表和项目,我可以扩展left
和right
。我不需要担心他们走得比他们需要的还要严重。这可以抵消这种影响。
<?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>