¿Cómo hago una línea punteada / discontinua en Android?

Estoy tratando de hacer una línea de puntos. Estoy usando esto ahora mismo para una línea sólida:

LinearLayout divider = new LinearLayout( this ); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, 2 ); divider.setLayoutParams( params ); divider.setBackgroundColor( getResources().getColor( R.color.grey ) ); 

Necesito algo como esto, pero punteado en lugar de sólido. Me gustaría evitar hacer cientos de diseños alternando entre un diseño transparente y un diseño sólido.

Sin código de Java:

drawable / dotted.xml:

     

view.xml:

  

el efecto de ruta se establece en el objeto de pintura

 Paint fgPaintSel = new Paint(); fgPaintSel.setARGB(255, 0, 0,0); fgPaintSel.setStyle(Style.STROKE); fgPaintSel.setPathEffect(new DashPathEffect(new float[] {10,20}, 0)); 

puede crear todo tipo de patrones de puntos suministrando más números en la matriz int [] especifica las proporciones de guión y espacio. Esta es una línea simple, igualmente punteada.

Esto te ayudara. Crear una línea punteada usando XML. Crea xml en una carpeta dibujable y dale ese fondo al elemento al que deseas establecer el borde punteado.

—-> Crear fondo XML “dashed_border”

          

—–> Agregar ese fondo al artículo

  

Crear xml (view_line_dotted.xml):

          

Establecer como fondo de su vista:

  

Lo que hice cuando quería dibujar una línea punteada es definir un dash_line.xml dibujable :

     

Y luego en el diseño solo define una vista con fondo como dash_line . Nota para incluir android: layerType = “software” , de lo contrario no funcionará.

  

Tengo una línea personalizada que admite línea de trazos horizontal y verical. código a continuación:

 public class DashedLineView extends View { private float density; private Paint paint; private Path path; private PathEffect effects; public DashedLineView(Context context) { super(context); init(context); } public DashedLineView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public DashedLineView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { density = DisplayUtil.getDisplayDensity(context); paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(density * 4); //set your own color paint.setColor(context.getResources().getColor(R.color.XXX)); path = new Path(); //array is ON and OFF distances in px (4px line then 2px space) effects = new DashPathEffect(new float[] { 4, 2, 4, 2 }, 0); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setPathEffect(effects); int measuredHeight = getMeasuredHeight(); int measuredWidth = getMeasuredWidth(); if (measuredHeight <= measuredWidth) { // horizontal path.moveTo(0, 0); path.lineTo(measuredWidth, 0); canvas.drawPath(path, paint); } else { // vertical path.moveTo(0, 0); path.lineTo(0, measuredHeight); canvas.drawPath(path, paint); } } } 

He utilizado el siguiente como fondo para el diseño:

     

Al usar esta clase, puede aplicar el efecto “discontinuo y subrayado” al texto de varias líneas. para utilizar DashPathEffect, debe desactivar el hardware acelerado de su TextView (aunque el método DashPathEffect tiene un problema con el texto largo). Puedes encontrar mi proyecto de ejemplo aquí: https://github.com/jintoga/Dashed-Underlined-TextView/blob/master/Untitled.png .

 public class DashedUnderlineSpan implements LineBackgroundSpan, LineHeightSpan { private Paint paint; private TextView textView; private float offsetY; private float spacingExtra; public DashedUnderlineSpan(TextView textView, int color, float thickness, float dashPath, float offsetY, float spacingExtra) { this.paint = new Paint(); this.paint.setColor(color); this.paint.setStyle(Paint.Style.STROKE); this.paint.setPathEffect(new DashPathEffect(new float[] { dashPath, dashPath }, 0)); this.paint.setStrokeWidth(thickness); this.textView = textView; this.offsetY = offsetY; this.spacingExtra = spacingExtra; } @Override public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) { fm.ascent -= spacingExtra; fm.top -= spacingExtra; fm.descent += spacingExtra; fm.bottom += spacingExtra; } @Override public void drawBackground(Canvas canvas, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) { int lineNum = textView.getLineCount(); for (int i = 0; i < lineNum; i++) { Layout layout = textView.getLayout(); canvas.drawLine(layout.getLineLeft(i), layout.getLineBottom(i) - spacingExtra + offsetY, layout.getLineRight(i), layout.getLineBottom(i) - spacingExtra + offsetY, this.paint); } } } 

Resultado:

subrayado discontinuo

Usa ShapeDrawable en lugar de LinearLayout y juega con dashWidth y dashGap

http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

La mejor solución para fondo punteado que funciona perfecto

     

Si buscas una línea vertical utiliza este dibujable.

          

Los valores negativos de la parte superior e inferior eliminan los lados no deseados de la forma y dejan una sola línea discontinua.

Úselo en una vista como tal.

  

No sé por qué, pero las respuestas votadas no me funcionan. Lo escribo de esta manera y funciona bien.
Definir una vista personalizada:

 public class XDashedLineView extends View { private Paint mPaint; private Path mPath; private int vWidth; private int vHeight; public XDashedLineView(Context context) { super(context); init(); } public XDashedLineView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public XDashedLineView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(Color.parseColor("#3F577C")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setPathEffect(new DashPathEffect(new float[] {10,10}, 0)); mPath = new Path(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); this.vWidth = getMeasuredWidth(); this.vHeight = getMeasuredHeight(); mPath.moveTo(0, this.vHeight / 2); mPath.quadTo(this.vWidth / 2, this.vHeight / 2, this.vWidth, this.vHeight / 2); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); } } 

Entonces puedes usarlo en tu xml:

   

Creé una biblioteca con una vista personalizada para resolver este problema, y ​​debería ser muy simple de usar. Visita https://github.com/Comcast/DahDit para obtener más información. Puede agregar líneas discontinuas como esta:

  

Lo único que funcionó para mí y creo que es la forma más simple es usar un camino con un objeto de pintura como este:

  Paint paintDash = new Paint(); paintDash.setARGB(255, 0, 0, 0); paintDash.setStyle(Paint.Style.STROKE); paintDash.setPathEffect(new DashPathEffect(new float[]{10f,10f}, 0)); paintDash.setStrokeWidth(2); Path pathDashLine = new Path(); 

Luego onDraw (): (restablecimiento de llamada importante si cambia esos puntos entre llamadas de ondraw, porque Path guarda todos los movimientos)

  pathDashLine.reset(); pathDashLine.moveTo(porigenX, porigenY); pathDashLine.lineTo(cursorX,cursorY); c.drawPath(pathDashLine, paintDash);