2017-02-08 9 views
1

Я пытаюсь устранить зазор, увиденный ниже. View s находятся прямо друг против друга, поэтому кажется, что это что-то готовое. Я вижу, что это связано с widthstroke, но как я могу устранить этот эффект?Устранение зазора в линии линии протягиваемой линии

Обратите внимание, что это всего лишь MVCE, и фактический прецедент требует, чтобы я использовал линию, меньшую, чем View.

Для устранения сомнений я буду принимать только ответ, который исправляет его в выпадающем xml. Я не хочу, чтобы работа с макетом работала, а поставляемый макет - только для того, чтобы выявить проблему.

Gap

вытяжке/line.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> 

макет/example.xml

<?xml version="1.0" encoding="utf-8"?> 
<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="match_parent" 
     android:layout_weight="1" 
     android:background="@drawable/line"> 
    </View> 

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

Try поставить отступы = 0 –

ответ

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 вытяжку для линии

<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> 
+0

Спасибо, но мой пример является [MCVE], фактическое использование случае означает, что я нужна линия. – weston

+0

Да, это справедливо! Я посмотрю – Charlie

+0

Это хороший откат и, вероятно, то, что я буду делать, если я не смогу никуда добраться. – weston

1

Где этот разрыв приходит из в вытяжке Shape линии?

Класс отвечает за создание формы вводимого коэффициента является 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, равную половине ширины хода, добавляется.

Это то место, откуда исходит ваш пробел.

Как я могу устранить этот эффект?

  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-патча выбывающих

red line 9-patch

Линии сверху и слева определяют участки растяжения. Вы можете видеть, что я просто растягиваю пустое пространство. Строки справа и внизу определяют область содержимого, в данном случае, все пространство.

+0

Любые предложения по удалению? – weston

+0

+1 спасибо за подтверждение связи с шириной хода. Это привело меня к одному решению, но немного удержаться за другие предложения. – weston

+0

Невозможно удалить способ с помощью формы 'line'. Вы считали, что вместо этого используете 9-патч? –

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>