Linha vertical usando xml desenhado
-
27-09-2019 - |
Pergunta
Estou tentando descobrir como definir uma linha vertical (1dp de espessura) para ser usada como um desenho.
Para fazer uma horizontal, é bem direto:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
<stroke android:width="1dp" android:color="#0000FF"/>
<size android:height="50dp" />
</shape>
A questão é: como tornar essa linha vertical?
Sim, existem soluções alternativas, como desenhar uma forma de retângulo com 1 px de espessura, mas isso complica o XML desenhado, se consistir em múltiplos <item>
elementos.
Alguém teve alguma chance com isso?
ATUALIZAR
O caso ainda não é resolvido. No entanto, para qualquer pessoa em uma Cruzada de Documentação do Android - você pode achar isso útil:Manual Android XML ausente
ATUALIZAR
Não encontrei nenhuma outra maneira além da que eu marquei como correta. Isso faz o truque, porém, parece um pouco "pesado", portanto, se você souber a resposta, não se esqueça de compartilhar;)
Solução
Em vez de uma forma, você pode tentar um View
:
<View
android:layout_width="1dp"
android:layout_height="fill_parent"
android:background="#FF0000FF" />
Eu só usei isso para linhas horizontais, mas acho que também funcionaria para linhas verticais.
Usar:
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#FF0000FF" />
Para uma linha horizontal.
Outras dicas
Você pode aninhar sua forma dentro de uma etiqueta rotativa.
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="90"
android:toDegrees="90">
<shape
android:shape="line">
<stroke
android:width="1dp"
android:color="#ff00ff"
android:dashWidth="1dp"
android:dashGap="2dp" />
</shape>
</rotate>
No entanto, o único problema são os parâmetros de layout definidos no seu Layout XML serão as dimensões usadas para desenhar a forma original. Ou seja, se você deseja que sua linha tenha 30DP de altura, você precisa definir um layout_width de 30dp no seu layout xml. Mas a largura final também será de 30dp nesse caso, o que provavelmente é indesejável para a maioria das situações. Isso significa essencialmente que a largura e a altura devem ser o mesmo valor, o valor do comprimento desejado para a linha. Eu não conseguia descobrir como consertar isso.
Essa parece ser a solução "Android Way", mas, a menos que haja alguma solução ou solução alternativa para o problema das dimensões que mencionei, isso provavelmente não funcionará para a maioria das pessoas. O que realmente precisamos é um atributo de orientação emu003Cshape/> ouu003Cstroke/> .
Você também pode tentar fazer referência a outro desenhado nos atributos da etiqueta rotativa, como:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="90"
android:toDegrees="90"
android:drawable="@drawable/horizontal_line" />
No entanto, eu não testei isso e espero que ele tenha os mesmos problemas.
-Editar-
Oh, eu realmente descobri uma correção. Você pode usar uma margem negativa no seu Layout XML para se livrar do espaço extra indesejado. Tal como:
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginLeft="-15dp"
android:layout_marginRight="-15dp"
android:src="@drawable/dashed_vertical_line" />
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<stroke android:width="1dp" android:color="@color/white" />
<size android:width="2dp" />
</shape>
Funciona para mim . Coloque -o como pano de vista com Fill_parent ou de tamanho fixo em altura dp
Você pode usar o atributo girado
<item>
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%" >
<shape
android:shape="line"
android:top="1dip" >
<stroke
android:width="1dip"
/>
</shape>
</rotate>
</item>
Eu criei uma solução diferente. A idéia é preencher o desenhado primeiro com a cor que você gosta da linha e, em seguida, preencher toda a área novamente com a cor de fundo enquanto usava preenchimento esquerdo ou direito. Obviamente, isso funciona apenas para uma linha vertical na extrema esquerda ou à direita do seu traço.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@color/divider_color" />
<item android:left="6dp" android:drawable="@color/background_color" />
</layer-list>
Eu acho que esta é a solução mais simples:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:gravity="center">
<shape android:shape="rectangle">
<size android:width="1dp" />
<solid android:color="#0000FF" />
</shape>
</item>
</layer-list>
Eu precisava adicionar minhas visualizações dinamicamente/programaticamente, portanto, adicionar uma visão extra teria sido complicado. Minha altura de visão era wrap_content, então não pude usar a solução de retângulo. Eu encontrei um post blog aqui Sobre a extensão do TextView, substituindo o OnDraw () e a pintura na linha, então implementei isso e funciona bem. Veja meu código abaixo:
public class NoteTextView extends TextView {
public NoteTextView(Context context) {
super(context);
}
private Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(Color.parseColor("#F00000FF"));
paint.setStrokeWidth(0);
paint.setStyle(Paint.Style.FILL);
canvas.drawLine(0, 0, 0, getHeight(), paint);
}
}
Eu precisava de uma linha vertical à esquerda, mas os parâmetros da linha de draw são drawLine(startX, startY, stopX, stopY, paint)
Assim, você pode desenhar qualquer linha reta em qualquer direção do outro lado da vista. Então na minha atividade eu tenhoNoteTextView note = new NoteTextView(this);
Espero que isto ajude.
É muito simples ... adicionar uma linha vertical no Android XML ...
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:rotation="90"
android:background="@android:color/darker_gray"/>
Depende, onde você deseja ter a linha vertical, mas se você deseja uma borda vertical, por exemplo, poderá ter a visualização dos pais ter um plano de fundo um traçado personalizado. E você pode definir o desenhado assim:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape
android:shape="rectangle">
<stroke android:width="1dp" android:color="#000000" />
<solid android:color="#00ffffff" />
</shape>
</item>
<item android:right="1dp">
<shape android:shape="rectangle">
<solid android:color="#00ffffff" />
</shape>
</item>
</layer-list>
Este exemplo criará uma linha preta fina de 1dp no lado direito da vista, que terá isso desenhado como plano de fundo.
Você pode usar uma forma, mas em vez de uma linha o retange.
android:shape="rectangle">
<stroke
android:width="5dp"
android:color="#ff000000"
android:dashGap="10px"
android:dashWidth="30px" />
E em seu layout use isso ...
<ImageView
android:layout_width="7dp"
android:layout_height="match_parent"
android:src="@drawable/dashline"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layerType="software"/>
Você pode precisar brincar com a largura, dependendo do tamanho dos traços, para colocá -lo em uma única linha.
Espero que isso ajude aplausos
add this in your styles.xml
<style name="Divider">
<item name="android:layout_width">1dip</item>
<item name="android:layout_height">match_parent</item>
<item name="android:background">@color/divider_color</item>
</style>
<style name="Divider_invisible">
<item name="android:layout_width">1dip</item>
<item name="android:layout_height">match_parent</item>
</style>
then wrap this style in a linear layout where you want the vertical line, I used the vertical line as a column divider in my table.
<TableLayout
android:id="@+id/table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:stretchColumns="*" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#92C94A" >
<TextView
android:id="@+id/textView11"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp" />
//...................................................................
<LinearLayout
android:layout_width="1dp"
android:layout_height="match_parent" >
<View style="@style/Divider_invisible" />
</LinearLayout>
//...................................................................
<TextView
android:id="@+id/textView12"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
android:text="@string/main_wo_colon"
android:textColor="@color/white"
android:textSize="16sp" />
//...............................................................
<LinearLayout
android:layout_width="1dp"
android:layout_height="match_parent" >
<View style="@style/Divider" />
</LinearLayout>
//...................................................................
<TextView
android:id="@+id/textView13"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
android:text="@string/side_wo_colon"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:layout_width="1dp"
android:layout_height="match_parent" >
<View style="@style/Divider" />
</LinearLayout>
<TextView
android:id="@+id/textView14"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
android:text="@string/total"
android:textColor="@color/white"
android:textSize="16sp" />
</TableRow>
<!-- display this button in 3rd column via layout_column(zero based) -->
<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#6F9C33" >
<TextView
android:id="@+id/textView21"
android:padding="5dp"
android:text="@string/servings"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:layout_width="1dp"
android:layout_height="match_parent" >
<View style="@style/Divider" />
</LinearLayout>
..........
.......
......
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="-3dp"
android:left="-3dp"
android:top="-3dp">
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimary" />
<stroke
android:width="2dp"
android:color="#1fc78c" />
</shape>
</item>
</layer-list>
Para fazer uma linha vertical, basta usar um retângulo com largura de 1dp:
<shape>
<size
android:width="1dp"
android:height="16dp" />
<solid
android:color="#c8cdd2" />
</shape>
Não use stroke
, usar solid
(que é a cor "preenchimento") para especificar a cor da linha.
Parece que ninguém mencionou esta opção:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@color/white" android:width="1dp"/>
</layer-list>
<View
android:layout_width="2dp"
android:layout_height="40dp"
android:background="#ffffff"
android:padding="10dp" />`