2010-04-17 21 views
120

Estoy tratando de encontrar la manera de definir una línea vertical (1dp de espesor) para usar como dibujable.Línea vertical usando XML dibujable

Para hacer una horizontal, que es bastante sencillo:

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

La pregunta es cómo hacer que esta línea vertical?

Sí, hay soluciones, como dibujar una forma de rectángulo de 1px de grosor, pero eso complica el XML dibujable, si consta de múltiples elementos <item>.

¿Alguien tuvo alguna posibilidad con esto?

ACTUALIZACIÓN

caso sigue sin resolverse. Sin embargo, Para cualquier persona en una cruzada documentación Android - que podría resultar útil: Missing Android XML Manual

ACTUALIZACIÓN

he encontrado ninguna otra manera que no sea la que he marcado como correcto. Se hace el truco se siente, aunque un poco "pesado", por lo que si por casualidad usted conoce la respuesta no se olvide de compartir;)

Respuesta

319

En lugar de una forma, usted podría intentar un View:

<View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
    android:background="#FF0000FF" /> 

Solo he usado esto para líneas horizontales, pero creo que también funcionaría para líneas verticales.

Uso:

<View 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
    android:background="#FF0000FF" /> 

por una línea horizontal.

+2

gracias Mark :)! Soy consciente de que puedo usar una vista para lograr esto. La cuestión es que estoy ensamblando una vista un poco más compleja que quiero usar como dibujable para el fondo de una celda de tabla. Hay diferentes tipos de formas/gradientes/líneas allí. Usar una vista SERÍA una solución, sin embargo, tendría que ponerla en una "capa" de dibujo diferente y es posible que se pegue un tiro en el pie cuando me encuentre cambiando de tamaño, etc. Me pregunto por qué no hay documentación sobre la "forma" xmls, tal vez alguien de google podría iluminarnos? :) – Kaspa

+0

Usar marginRight/Start y Left/End también es a veces interesante para obtener espacio en los lados. – George

86

Puede anidar su forma dentro de una etiqueta giratoria.

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

Sin embargo, el único problema es que los parametros de diseño definidos en su diseño XML serán las dimensiones utilizadas para dibujar la forma original. Es decir, si desea que su línea tenga una altura de 30dp, debe definir un layout_width de 30dp en su diseño xml. Pero el ancho final también será de 30dp en ese caso, lo que probablemente sea indeseable para la mayoría de las situaciones. Esto significa esencialmente que tanto el ancho como la altura deben tener el mismo valor, el valor de la longitud deseada para la línea. No pude encontrar la manera de arreglar esto.

Esta parece ser la solución de "forma de Android", pero a menos que haya una solución o una solución para el problema de dimensiones que menciono, probablemente esto no funcione para la mayoría de las personas. Lo que realmente necesitamos es un atributo de orientación en < forma/> o < trazo/>.

También puede intentar hacer referencia a otra estirable en atributos de la etiqueta de rotación, tales como:

<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromDegrees="90" 
    android:toDegrees="90" 
    android:drawable="@drawable/horizontal_line" /> 

Sin embargo no he probado esto y esperamos que tenga los mismos problemas.

- EDITAR -

Oh, de hecho me di cuenta de una solución. Puede usar un margen negativo en su diseño xml para deshacerse del espacio adicional no deseado. Tales como:

<ImageView 
    android:layout_width="35dp" 
    android:layout_height="35dp" 
    android:layout_marginLeft="-15dp" 
    android:layout_marginRight="-15dp" 
    android:src="@drawable/dashed_vertical_line" /> 
+4

, mientras que el margen negativo funcionará para el 99% de los dispositivos ... simplemente, hay dispositivos que forzarán el cierre si haces esto. Algunos dispositivos tienen problemas para inflar un margen negativo –

+0

@cephus Uso su primer código, pero necesito la línea en la parte superior de la vista. Está en el centro de mi vista. ¿Cómo puedo establecer una gravedad para él (dentro del archivo xml de forma)? – Behzad

15
<?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> 

de trabajo para mí. Póngalo como fondo de vista con fill_parent o tamaño fijo en dp height

4

Necesitaba agregar mis vistas dinámicamente/programáticamente, por lo que agregar una vista adicional hubiera sido engorroso. La altura de mi vista era WRAP_CONTENT, por lo que no pude usar la solución de rectángulo. Encontré una publicación de blog here sobre la extensión de TextView, anulando onDraw() y pintando en la línea, así que lo implementé y funciona bien. Ver mi código de abajo:

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); 
    } 
} 

necesitaba una línea vertical a la izquierda, pero los parámetros son drawLine drawLine(startX, startY, stopX, stopY, paint) por lo que se puede dibujar cualquier línea recta en cualquier dirección a través de la vista. Luego en mi actividad tengo NoteTextView note = new NoteTextView(this); Espero que esto ayude.

9

Se me ocurrió una solución diferente. La idea es llenar el dibujante primero con el color que prefiera que tenga la línea y luego vuelva a llenar toda el área con el color de fondo mientras usa el relleno izquierdo o derecho. Obviamente, esto solo funciona para una línea vertical en el extremo izquierdo o derecho de su dibujo.

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

Necesitaba fondo con bordes a la izquierda, derecha, abajo y esto funcionó para mí, ¡gracias! –

+0

Increíble, con esto logré crear divisores prolijos en mi LinearLayout ('showDividers =" middle "'). Para obtener un divisor de 2dp, necesitaba especificar 'android: left =" 3dp "' aquí. – Jonik

+0

Consejo: para que este dibujante sea útil en general, use '@android: color/transparent' en lugar de hardcoding' @ color/background_color'. – Jonik

1

Puedes usar una forma pero en lugar de una línea haz que sea un rectángulo.

android:shape="rectangle"> 
<stroke 
    android:width="5dp" 
    android:color="#ff000000" 
    android:dashGap="10px" 
    android:dashWidth="30px" /> 

y en su diseño utiliza este ...

<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"/> 

Puede que tenga que jugar con el ancho, dependiendo del tamaño de los guiones, conseguirlo en una sola línea.

Esperanza esto ayuda Saludos

3

su muy simple ... Para añadir una línea vertical en XML androide ...

<View 
android:layout_width="fill_parent" 
android:layout_height="1dp" 
android:layout_marginTop="5dp" 
android:rotation="90" 
android:background="@android:color/darker_gray"/> 
+0

Esto funciona muy bien cuando puedes ' t use fill_parent para la altura porque la altura del elemento principal se establece en wrap_content. –

2

Depende, en la que desea tener la línea vertical, pero si desea un borde vertical, por ejemplo, puede hacer que la vista principal tenga un fondo dibujable a medida. Y a continuación, puede definir el dibujable así:

<?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> 

En este ejemplo se creará una línea delgada negro 1DP en el lado derecho de la vista, que tendrá este estirable como fondo.

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

    .......... 
    ....... 
    ...... 
-2

Muy simple y creo que se acerca mejor.

<TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Section Text" 
      android:id="@+id/textView6" 
      android:textColor="@color/emphasis" 
      android:drawableBottom="@drawable/underline"/> 

subrayado.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
     <size android:width="1000dp" android:height="2dp" /> 
     <solid android:color="@color/emphasis"/> 
</shape> 
+0

Esta es una línea horizontal, no una línea vertical. –

+0

Además, no hay necesidad de Android: width = "1000dp". Solo déjalo fuera. –

-1
<View 
     android:layout_width="2dp" 
     android:layout_height="40dp" 

     android:background="#ffffff" 
     android:padding="10dp" />` 
10

Usted puede utilizar el atributo de rotación

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

Explique un poco más por qué esta es una mejor respuesta ... – fijas

+5

Esta es definitivamente una mejor (o la mejor) respuesta porque, mientras que la respuesta de @ commonsware es suficiente para líneas verticales normales. Si queremos crear líneas discontinuas (digamos por ejemplo), esta es la única respuesta que funcionaría correctamente. –

0

Para hacer una línea vertical, sólo tiene que utilizar un rectángulo con un ancho de 1DP:

<shape> 
    <size 
     android:width="1dp" 
     android:height="16dp" /> 
    <solid 
     android:color="#c8cdd2" /> 
</shape> 

No utilice stroke, use solid (que es el color de "relleno") para especificar el color de la línea.

Cuestiones relacionadas